Google Konum Hizmetleri API'si için Android Geliştirici Kılavuzu

Yayınlanan: 2022-03-11

Kullanıcınızın konumunu bilmek, bugün geliştirdiğimiz ve kullandığımız birçok uygulamada faydalı bilgilerdir. Bu hizmetleri kullanma şeklimizi değiştirmenin yanı sıra hayatımızı kolaylaştıran birçok popüler konum tabanlı uygulama var. Bir örnek, bir kuruluşa sık sık gelip "check-in" yapan kullanıcıların genellikle indirimler kazandığı çılgınca popüler olan Foursquare uygulamasıdır. Normal bir taksiye göre daha düşük ücretle cep telefonunuzdan binmenize yardımcı olan Uber. Liste büyük ve hala büyüyor.

konum hizmetleri API'si

Bu yazıda, Android'in Google Konum Servisleri API'sini kullanarak kullanıcının enlem ve boylamını belirlemek için basit bir Android uygulaması oluşturacağız. Android uygulamaları geliştirirken, kullanıcının konumunu almanın birkaç yolu vardır.

"android.location" paketi

“Android.location” paketi, Android'in piyasaya sürülmesinden bu yana mevcut ve bize konum servislerine erişim sağlıyor. Bu hizmetler, uygulamaların cihazın coğrafi konumunun periyodik güncellemelerini almasına izin verir.

Paket, konum verilerini almak için iki yol sağlar:

  • LocationManager.GPS_PROVIDER: Uyduları kullanarak konumu belirler. Koşullara bağlı olarak, bu sağlayıcının bir konum düzeltmesi döndürmesi biraz zaman alabilir.

  • LocationManager.NETWORK_PROVIDER: Yakındaki baz istasyonlarının ve WiFi erişim noktalarının kullanılabilirliğine göre konumu belirler. Bu, GPS_PROVIDER'dan daha hızlıdır.

Kullanıcı konumunu ararken, bu sağlayıcılar ve uygunluklarıyla oynamanız gerekir. İdeal olarak, ilk konumu NETWORK_PROVIDER kullanarak elde edersiniz, bu o kadar doğru olmayabilir, ancak çok daha hızlıdır. Daha sonra GPS_PROVIDER kullanarak daha iyi bir konum düzeltmesini dinleyerek doğruluğu artırma girişiminde bulunabilirsiniz.

Bu paket tarafından sağlanan API'ler oldukça düşük düzeydedir ve uygulama geliştiricisinin, konum verilerinin ne zaman isteneceğini belirlemenin daha ince ayrıntılarını işlemesini ve API'ye yapılan çağrıları optimize edilmiş bir şekilde planlamasını gerektirir. Konum tabanlı sistem hizmetleriyle geliştirici deneyimini iyileştirmek ve konuma duyarlı uygulamalar geliştirme sürecini kolaylaştırmak için Google, Google Play Hizmetlerini kullanarak bir kullanıcının konumunu istemenin yeni bir yolunu tanıttı. Daha yüksek doğruluk, düşük güçlü coğrafi sınırlama ve çok daha fazlasıyla daha basit bir API sunar.

Google Konum Hizmetleri API'sı

FusedLocationProviderApi olarak da bilinen Google Konum Hizmetleri API'si, bir kullanıcının konumunu almak için Google'ın önerdiği yöntemdir. İhtiyaçlarımıza göre en iyi doğruluğu sağlar. Bu API'yi bir öncekine göre kullanmanın avantajlarından bazıları şunlardır:

  • Basitlik: Önceki API'den farklı olarak, artık birden fazla sağlayıcıyla uğraşmanıza gerek yok. Bunun yerine, "yüksek doğruluk" veya "düşük güç" gibi üst düzey ihtiyaçları belirtirsiniz ve uygun bir yaklaşım alacaktır.

  • Kullanılabilirlik: Uygulamanızın bilinen en iyi, en son konuma anında erişmesini sağlar. Genellikle bu bilgi hazırdır, sadece istemeniz yeterlidir.

  • Güç verimliliği: Uygulamanızın güç kullanımını en aza indirir.

  • Çok yönlülük: Ön plan kullanımlarından (yüksek doğrulukta konum verilerine ihtiyaç duyan) arka plan kullanımlarına kadar, yalnızca ihmal edilebilir güç etkisi ile yalnızca periyodik konum güncellemeleri gerektiren çok çeşitli ihtiyaçları karşılar.

Bu API'yi kullanarak konum tabanlı bir Android uygulaması oluşturalım. Bunun için Google'ın Android uygulama geliştirme için önerdiği IDE - Android Studio'yu kullanacağız. Android Studio'yu kullanmaya başlamak oldukça basittir. Web siteleri, geliştirme için ilk Android uygulamanızı nasıl önyükleyeceğiniz de dahil olmak üzere, Android Studio'nun kurulumunu ve yapılandırmasını içeren prosedürü ayrıntılı olarak açıklar.

Android Studio, işleri bizim için çok kolaylaştırmalı. Ancak, derleme komut dosyasını yapılandırarak ve bu uygulamaya bağımlılık olarak Google Play Hizmetlerini ekleyerek başlamamız gerekecek. Bu, "build.gradle" dosyasını aşağıdaki gibi değiştirerek yapılabilir:

 dependencies { compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.google.android.gms:play-services:6.5.87' // Add this line }

Bu makaleyi yazdığım sırada, mevcut Google Play Hizmetlerinin en son sürümü 6.5.87'dir. Başlamadan önce her zaman mevcut en son sürümü kontrol ettiğinizden emin olun. Daha sonra daha yeni sürümler çıkarsa ve bunu kendi projeleriniz için güncellemeye karar verirseniz, konumla ilgili tüm özellikleri desteklediğiniz tüm Android sürümlerine karşı test edin.

Bu noktada, uygulamamız için asıl işi yapmaya başlayabiliriz.

İzin İsteme, AndroidManifest.xml'yi Yapılandırma

Android'ler, herhangi bir rastgele uygulamanın kesin bir kullanıcı konumu istemesini engelleyecek belirli güvenlik özelliklerine sahiptir. Bunu çözmek için “AndroidManifest.xml” dosyasını düzenlememiz ve bu uygulama için gereken izni eklememiz gerekiyor:

 <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Hazır buradayken, bu uygulama için kullandığımız Google Play Hizmetlerinin sürümünü de tanımlamalıyız:

 <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />

Google Play Hizmetlerinin Kullanılabilirliğini Kontrol Etme

Google Play Hizmetleri tarafından sağlanan özelliklere erişmeden önce, cihazda Google Play Hizmetlerinin kurulu olup olmadığını ve kullanmayı düşündüğümüz sürümün (6.5.87) olup olmadığını kontrol etmeliyiz.

 private boolean checkGooglePlayServices(){ int checkGooglePlayServices = GooglePlayServicesUtil .isGooglePlayServicesAvailable(mContext); if (checkGooglePlayServices != ConnectionResult.SUCCESS) { /* * Google Play Services is missing or update is required * return code could be * SUCCESS, * SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, * SERVICE_DISABLED, SERVICE_INVALID. */ GooglePlayServicesUtil.getErrorDialog(checkGooglePlayServices, mContext, REQUEST_CODE_RECOVER_PLAY_SERVICES).show(); return false; } return true; }

Bu yöntem Google Play Hizmetlerini kontrol edecek ve cihazın kurulu olmaması durumunda (nadirdir, ancak böyle durumlar gördüm), ilgili hatayı içeren bir iletişim kutusu açacak ve kullanıcıyı yüklemeye/güncellemeye davet edecektir. Google Play Store'dan Google Play Hizmetleri.

Google oyun hizmetleri

Kullanıcı "GooglePlayServicesUtil.getErrorDialog()" tarafından sağlanan çözümü tamamladıktan sonra, bir "onActivityResult()" geri çağırma yöntemi başlatılır, bu nedenle bu çağrıyı işlemek için bir mantık uygulamamız gerekir:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_RECOVER_PLAY_SERVICES) { if (resultCode == RESULT_OK) { // Make sure the app is not already connected or attempting to connect if (!mGoogleApiClient.isConnecting() && !mGoogleApiClient.isConnected()) { mGoogleApiClient.connect(); } } else if (resultCode == RESULT_CANCELED) { Toast.makeText(mContext, "Google Play Services must be installed.", Toast.LENGTH_SHORT).show(); finish(); } } }

Google API'lerine Erişme

Google API'lerine erişmek için bir adım daha gerçekleştirmemiz gerekiyor: bir GoogleApiClient örneği oluşturun. Google API İstemcisi, tüm Google Play hizmetlerine ortak bir giriş noktası sağlar ve kullanıcının cihazı ile her bir Google hizmeti arasındaki ağ bağlantısını yönetir. Buradaki ilk adımımız bağlantıyı başlatmaktır. Bu kodu genellikle aktivitenin “onCreate” yönteminden çağırırım:

 protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); }

Bir dizi yöntem çağrısını zincirleyerek, kullanmak istediğimiz geri çağırma arayüzü uygulamasını ve Konum Hizmeti API'sini belirliyoruz. Arayüz uygulaması, bu durumda "bu", Google Play Hizmetlerine bağlantı başarılı olduğunda, başarısız olduğunda veya askıya alındığında eşzamansız "connect()" yöntemine yanıt alacaktır. Bu kodu ekledikten sonra “MainActivity”miz şöyle görünmelidir:

 package com.bitwoo.userlocation; import android.content.Intent; import android.location.Location; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GooglePlayServicesUtil; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.location.LocationServices; public class MainActivity extends ActionBarActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private static int REQUEST_CODE_RECOVER_PLAY_SERVICES = 200; private GoogleApiClient mGoogleApiClient; private Location mLastLocation; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (checkGooglePlayServices()) { buildGoogleApiClient(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } private boolean checkGooglePlayServices() { int checkGooglePlayServices = GooglePlayServicesUtil .isGooglePlayServicesAvailable(this); if (checkGooglePlayServices != ConnectionResult.SUCCESS) { /* * google play services is missing or update is required * return code could be * SUCCESS, * SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, * SERVICE_DISABLED, SERVICE_INVALID. */ GooglePlayServicesUtil.getErrorDialog(checkGooglePlayServices, this, REQUEST_CODE_RECOVER_PLAY_SERVICES).show(); return false; } return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_CODE_RECOVER_PLAY_SERVICES) { if (resultCode == RESULT_OK) { // Make sure the app is not already connected or attempting to connect if (!mGoogleApiClient.isConnecting() && !mGoogleApiClient.isConnected()) { mGoogleApiClient.connect(); } } else if (resultCode == RESULT_CANCELED) { Toast.makeText(this, "Google Play Services must be installed.", Toast.LENGTH_SHORT).show(); finish(); } } } protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); } @Override public void onConnected(Bundle bundle) { } @Override public void onConnectionSuspended(int i) { } @Override public void onConnectionFailed(ConnectionResult connectionResult) { } }

Ardından “onStart” yöntemimizde “connect” yöntemini çağırır ve “onConnected” geri çağırma yönteminin çağrılmasını bekleriz:

 @Override protected void onStart() { super.onStart(); if (mGoogleApiClient != null) { mGoogleApiClient.connect(); } }

"onConnected" yöntemi şöyle görünecektir:

 @Override public void onConnected(Bundle bundle) { mLastLocation = LocationServices.FusedLocationApi.getLastLocation( mGoogleApiClient); if (mLastLocation != null) { Toast.makeText(this, "Latitude:" + mLastLocation.getLatitude()+", Longitude:"+mLastLocation.getLongitude(),Toast.LENGTH_LONG).show(); } }

Bu geri arama, Google Play Hizmetleri bağlandığında tetiklenir; bu, o zamana kadar bilinen son konuma sahip olmamız gerektiği anlamına gelir. Ancak, bu konum boş olabilir (nadirdir ancak imkansız değildir). Bu durumda, tavsiyem daha sonra ele alınacak olan konum güncellemelerini dinlemek.

Konum Güncellemelerini Dinleme

“getLastLocation”ı çağırdıktan sonra, Fused Location Provider'dan periyodik güncellemeler talep etmek isteyebilirsiniz. Başvurunuza bağlı olarak bu süre kısa veya uzun olabilir. Örneğin, bir kullanıcının sürüş sırasında konumunu takip eden bir uygulama oluşturuyorsanız, güncellemeleri kısa aralıklarla dinlemeniz gerekecektir. Öte yandan, uygulamanız kullanıcının konumunu arkadaşıyla paylaşmakla ilgiliyse, arada bir konum istemeniz gerekebilir.

Bir istek oluşturmak oldukça kolaydır - bu yöntemi “onCreate” yöntemi içinde çağırabilirsiniz:

 protected void createLocationRequest() { mLocationRequest = new LocationRequest(); mLocationRequest.setInterval(20000); mLocationRequest.setFastestInterval(5000); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); }

Yeni bir LocationRequest nesnesini somutlaştırıyoruz. Aralığı 20 saniyeye (20000 milisaniye) ayarlayın. Ayrıca, 5 saniyeye kısılmış bir güncelleme hızı ayarladık. Bu, API'ye her 20 saniyede bir (tercihen) güncelleme sağlamasını söyler, ancak 5 saniyelik bir süre içinde bir değişiklik varsa, bunu da sağlamalıdır. Son olarak, mevcut diğer öncelik seçenekleri arasında önceliği "PRIORITY_HIGH_ACCURACY" olarak belirledik: PRIORITY_BALANCED_POWER_ACCURACY, PRIORITY_LOW_POWER, PRIORITY_NO_POWER.

İsteği oluşturduktan sonra, “onConnected()” yöntemi tetiklendikten sonra konum güncellemelerini dinlemeye başlamaya hazırsınız:

 protected void startLocationUpdates() { LocationServices.FusedLocationApi.requestLocationUpdates( mGoogleApiClient, mLocationRequest, this); }

Şimdi geriye sadece LocationListener arabirimini karşılamak için geri arama yöntemini uygulamak kalıyor:

 public class MainActivity extends ActionBarActivity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener { // ... @Override public void onLocationChanged(Location location) { mLastLocation = location; Toast.makeText(this, "Latitude:" + mLastLocation.getLatitude()+", Longitude:"+mLastLocation.getLongitude(),Toast.LENGTH_LONG).show(); } } 

güncellemeleri dinlemeyi bırak

Güncellemeleri Dinlemeyi Durdurun

Artık ihtiyacınız olmadığında veya kullanıcı uygulamanızdan ayrıldığında güncellemeleri dinlemeyi açıkça durdurmanız önemlidir. Aşağıdaki yöntem “onPause” geri çağrısı içinden çağrılmalıdır:

 protected void stopLocationUpdates() { if (mGoogleApiClient != null) { LocationServices.FusedLocationApi.removeLocationUpdates( mGoogleApiClient, this); } }

… ve Google API bağlantısını kesmek:

 @Override protected void onStop() { super.onStop(); if (mGoogleApiClient != null) { mGoogleApiClient.disconnect(); } }

Toplama

Gördüğünüz gibi, Android'de konum algılamalı uygulamaları uygulamanın arkasındaki temel fikirler çok basittir. Ayrıca, hem kullanımı basit hem de anlaşılması kolay mevcut API'lerle, Android için temel konum tabanlı uygulamalar oluşturmak hiç de kolay olmamalı. Burada oluşturduğumuz küçük örnek uygulama tam olarak bunu göstermek içindir. Bunun için tam kaynak kodunu GitHub'da bulabilirsiniz. Lütfen, işleri basit tutmak için uygulamanın “onConnectionFailed” geri arama yöntemini işlemediğini unutmayın.

Umarım bu eğitim, Google Konum Servisleri API'sini kullanmaya başlamanıza yardımcı olur.