Android'de konum hizmetleri

Bu kılavuz, Android uygulamalarında konum tanımayı tanıtır ve Android Konum Hizmeti API'sinin yanı sıra Google Location Services API'siyle sağlanan birleşik konum sağlayıcısını kullanarak kullanıcının konumunu nasıl edineceğini gösterir.

Android, baz istasyonu konumu, Wi-Fi ve GPS gibi çeşitli konum teknolojilerine erişim sağlar. Her konum teknolojisinin ayrıntıları konum sağlayıcıları aracılığıyla soyutlanır ve uygulamaların kullanılan sağlayıcıdan bağımsız olarak konumları aynı şekilde almasına olanak tanır. Bu kılavuz, Google Play Hizmetleri'nin bir parçası olan ve hangi sağlayıcıların kullanılabilir olduğuna ve cihazın nasıl kullanıldığına bağlı olarak cihazların konumunu almanın en iyi yolunu akıllı bir şekilde belirleyen bir parçası olan birleşik konum sağlayıcısını tanıtır. Android Konum Hizmeti API'sini kullanarak sistem konumu Hizmeti LocationManagerile nasıl iletişim kuracaklarını gösterir. Kılavuzun ikinci bölümünde, kullanarak Android Konum Hizmetleri API'sini keşfeder LocationManager.

Genel bir kural olarak, uygulamalar yalnızca gerektiğinde eski Android Konum Hizmeti API'sine geri dönerek kaynaşmış konum sağlayıcısını kullanmayı tercih etmelidir.

Konumla ilgili temel bilgiler

Android'de konum verileriyle çalışmak için hangi API'yi seçerseniz seçin, çeşitli kavramlar aynı kalır. Bu bölüm, Konum Sağlayıcıları ve konumla ilgili izinleri tanıtır.

Konum sağlayıcıları

Kullanıcının konumunu saptamak için dahili olarak çeşitli teknolojiler kullanılır. Kullanılan donanım, veri toplama işi için seçilen konum sağlayıcısının türüne bağlıdır. Android üç konum sağlayıcısı kullanır:

  • GPS Sağlayıcısı - GPS en doğru konumu verir, en fazla güç kullanır ve en iyi açık havada çalışır. Bu sağlayıcı, hücresel kuleler tarafından toplanan GPS verilerini döndüren GPS ve yardımlı GPS (aGPS) birleşimini kullanır.

  • Ağ Sağlayıcısı – Baz istasyonları tarafından toplanan aGPS verileri de dahil olmak üzere WiFi ve Hücresel verilerin bir bileşimini sağlar. GPS Sağlayıcısından daha az güç kullanır, ancak farklı doğrulukta konum verilerini döndürür.

  • Pasif Sağlayıcı – Bir uygulamada konum verileri oluşturmak için diğer uygulamalar veya Hizmetler tarafından istenen sağlayıcıları kullanan bir "piggyback" seçeneği. Bu, sabit konum güncelleştirmelerinin çalışmasını gerektirmeyen uygulamalar için ideal olan daha az güvenilir ancak güç tasarrufu sağlayan bir seçenektir.

Konum sağlayıcıları her zaman kullanılamaz. Örneğin, uygulamamız için GPS kullanmak isteyebiliriz, ancak GPS Ayarlar kapatılmış olabilir veya cihazda GPS olmayabilir. Belirli bir sağlayıcı kullanılamıyorsa, sağlayıcıyı seçmek döndürebilir null.

Konum izinleri

Konum algılamalı bir uygulamanın GPS, Wi-Fi ve hücresel veri almak için cihazın donanım algılayıcılarına erişmesi gerekir. Erişim, uygulamanın Android Bildirimi'ndeki uygun izinler aracılığıyla denetlenmektedir. İki izin vardır: Uygulamanızın gereksinimlerine ve seçtiğiniz API'ye bağlı olarak şunlara izin vermek istersiniz:

  • ACCESS_FINE_LOCATION – Uygulamanın GPS'e erişmesine izin verir. GPS Sağlayıcısı ve Pasif Sağlayıcı seçenekleri için gereklidir (Pasif Sağlayıcının başka bir uygulama veya Hizmet tarafından toplanan GPS verilerine erişmek için izin alması gerekir). Ağ Sağlayıcısı için isteğe bağlı izin.

  • ACCESS_COARSE_LOCATION – Uygulamanın Hücresel ve Wi-Fi konumuna erişmesine izin verir. Ayarlanmadıysa ACCESS_FINE_LOCATION Ağ Sağlayıcısı için gereklidir.

API sürüm 21 (Android 5.0 Lollipop) veya üzerini hedefleyen uygulamalar için, GPS donanımı olmayan cihazları etkinleştirebilir ACCESS_FINE_LOCATION ve yine de çalıştırabilirsiniz. Uygulamanız GPS donanımı gerektiriyorsa, Android Bildirimi'ne açıkça bir android.hardware.location.gpsuses-feature öğe eklemeniz gerekir. Daha fazla bilgi için bkz. Android uses-feature öğesi başvurusu.

İzinleri ayarlamak için Çözüm Bölmesi'ndeki Özellikler klasörünü genişletin ve AndroidManifest.xml çift tıklayın. İzinler Gerekli İzinler altında listelenir:

Android Bildirimi Gerekli İzinler ayarlarının ekran görüntüsü

Bu izinlerden birini ayarlamak, Android'e uygulamanızın konum sağlayıcılarına erişmek için kullanıcıdan izin alması gerektiğini bildirir. API düzeyi 22 (Android 5.1) veya daha düşük bir sürümü çalıştıran cihazlar, uygulama her yüklendiğinde kullanıcıdan bu izinleri vermesini ister. API düzeyi 23 (Android 6.0) veya üzerini çalıştıran cihazlarda, uygulamanın konum sağlayıcısından istekte bulunmadan önce bir çalışma zamanı izin denetimi gerçekleştirmesi gerekir.

Not

Not: Ayar ACCESS_FINE_LOCATION , hem kaba hem de hassas konum verilerine erişim anlamına gelir. Her iki izni de hiçbir zaman ayarlamanız gerekmez, yalnızca uygulamanızın çalışması için gereken en düşük izin.

Bu kod parçacığı, bir uygulamanın izin için izni olup olmadığını denetlemeye ACCESS_FINE_LOCATION yönelik bir örnektir:

 if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.AccessFineLocation) == Permission.Granted)
{
    StartRequestingLocationUpdates();
    isRequestingLocationUpdates = true;
}
else
{
    // The app does not have permission ACCESS_FINE_LOCATION 
}

Uygulamalar, kullanıcının izin vermediği (veya izni iptal ettiği) senaryoya karşı toleranslı olmalıdır ve bu durumla düzgün bir şekilde başa çıkmanın bir yoluna sahip olmalıdır. Xamarin.Android'de çalışma zamanı izin denetimlerini uygulama hakkında daha fazla bilgi için lütfen İzinler kılavuzuna bakın.

Birleştirilmiş konum sağlayıcısını kullanma

Android uygulamalarının cihazdan konum güncelleştirmelerini alması için kaynaştırılmış konum sağlayıcısı tercih edilen yoldur, çünkü pil açısından verimli bir şekilde en iyi konum bilgilerini sağlamak için çalışma zamanında konum sağlayıcısını verimli bir şekilde seçer. Örneğin, açık havada dolaşan bir kullanıcı GPS ile en iyi konumu okur. Kullanıcı daha sonra GPS'in kötü çalıştığı (hiç değilse) iç mekanlarda yürüyorsa, sigortalı konum sağlayıcısı otomatik olarak WiFi'a geçebilir ve bu da iç mekanlarda daha iyi çalışır.

Birleştirilmiş konum sağlayıcısı API'si, coğrafi sınırlama ve etkinlik izleme dahil olmak üzere konum algılamalı uygulamaları güçlendirmek için çeşitli araçlar sağlar. Bu bölümde, ayarlama, sağlayıcı oluşturma ve kullanıcının konumunu alma ile ilgili temel bilgilere LocationClientodaklanacağız.

Sigortalı konum sağlayıcısı, Google Play Hizmetleri'nin bir parçasıdır. Google Play Services paketinin, kaynaştırılmış konum sağlayıcısı API'sinin çalışması için uygulamada düzgün bir şekilde yüklenmesi ve yapılandırılması ve cihazda Google Play Hizmetleri APK'sının yüklü olması gerekir.

Bir Xamarin.Android uygulamasının birleştirilmiş konum sağlayıcısını kullanabilmesi için önce projeye Xamarin.GooglePlayServices.Location paketini eklemesi gerekir. Ayrıca, aşağıda açıklanan sınıflara başvuran tüm kaynak dosyalara aşağıdaki using deyimler eklenmelidir:

using Android.Gms.Common;
using Android.Gms.Location;

Google Play Hizmetleri'nin yüklü olup olmadığını denetleme

Google Play Hizmetleri yüklü olmadığında (veya güncel olmadığında) bir Xamarin.Android, birleştirilmiş konum sağlayıcısını kullanmaya çalışırsa kilitlenir ve ardından bir çalışma zamanı özel durumu oluşur. Google Play Hizmetleri yüklü değilse, uygulama yukarıda açıklanan Android Konum Hizmeti'ne geri dönmelidir. Google Play Hizmetleri güncel değilse, uygulama kullanıcıya Google Play Services'ın yüklü sürümünü güncelleştirmesini isteyen bir ileti görüntüleyebilir.

Bu kod parçacığı, Bir Android Etkinliğinin Google Play Hizmetleri'nin yüklü olup olmadığını program aracılığıyla nasıl denetleyebileceğini gösteren bir örnektir:

bool IsGooglePlayServicesInstalled()
{
    var queryResult = GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(this);
    if (queryResult == ConnectionResult.Success)
    {
        Log.Info("MainActivity", "Google Play Services is installed on this device.");
        return true;
    }

    if (GoogleApiAvailability.Instance.IsUserResolvableError(queryResult))
    {
        // Check if there is a way the user can resolve the issue
        var errorString = GoogleApiAvailability.Instance.GetErrorString(queryResult);
        Log.Error("MainActivity", "There is a problem with Google Play Services on this device: {0} - {1}",
                  queryResult, errorString);

        // Alternately, display the error to the user.
    }

    return false;
}

FusedLocationProviderClient

Bir Xamarin.Android uygulamasının bir örneğine FusedLocationProviderClientsahip olması gerekir. Bu sınıf, konum güncelleştirmelerine abone olmak ve cihazın bilinen son konumunu almak için gerekli yöntemleri kullanıma sunar.

Bir OnCreate Activity yöntemi, aşağıdaki kod parçacığında gösterildiği gibi öğesine başvuru almak için FusedLocationProviderClientuygun bir yerdir:

public class MainActivity: AppCompatActivity
{
    FusedLocationProviderClient fusedLocationProviderClient;

    protected override void OnCreate(Bundle bundle) 
    {
        fusedLocationProviderClient = LocationServices.GetFusedLocationProviderClient(this);
    }
}

Bilinen son konumu alma

FusedLocationProviderClient.GetLastLocationAsync() yöntemi, Xamarin.Android uygulamasının minimum kodlama yüküyle cihazın bilinen son konumunu hızla elde edebilmesi için basit, engelleyici olmayan bir yol sağlar.

Bu kod parçacığı, cihazın konumunu almak için yönteminin nasıl kullanılacağını GetLastLocationAsync gösterir:

async Task GetLastLocationFromDevice()
{
    // This method assumes that the necessary run-time permission checks have succeeded.
    getLastLocationButton.SetText(Resource.String.getting_last_location);
    Android.Locations.Location location = await fusedLocationProviderClient.GetLastLocationAsync();

    if (location == null)
    {
        // Seldom happens, but should code that handles this scenario
    }
    else
    {
        // Do something with the location 
        Log.Debug("Sample", "The latitude is " + location.Latitude);
    }
}

Konum güncelleştirmelerine abone olun

Xamarin.Android uygulaması, bu kod parçacığında gösterildiği gibi yöntemini kullanarak FusedLocationProviderClient.RequestLocationUpdatesAsync birleştirilmiş konum sağlayıcısından konum güncelleştirmelerine de abone olabilir:

await fusedLocationProviderClient.RequestLocationUpdatesAsync(locationRequest, locationCallback);

Bu yöntem iki parametre alır:

  • Android.Gms.Location.LocationRequest – Nesne LocationRequest , bir Xamarin.Android uygulamasının, birleştirilmiş konum sağlayıcısının nasıl çalışması gerektiğiyle ilgili parametreleri nasıl geçirdiğidir. İsteklerin LocationRequest ne sıklıkta yapılması gerektiği veya doğru bir konum güncelleştirmesinin ne kadar önemli olması gerektiği gibi bilgileri barındırıyor. Örneğin, önemli bir konum isteği cihazın konumu belirlerken GPS'i kullanmasına ve sonuç olarak daha fazla güç kullanmasına neden olur. Bu kod parçacığı, yüksek doğrulukla bir konum için nasıl oluşturulacağını LocationRequest gösterir ve konum güncelleştirmesi için yaklaşık beş dakikada bir (ancak istekler arasında iki dakikadan kısa sürede) denetlemeyi gösterir. Birleştirilmiş konum sağlayıcısı LocationRequest , cihaz konumunu belirlemeye çalışırken hangi konum sağlayıcısının kullanılacağına ilişkin bir kılavuz kullanır:

    LocationRequest locationRequest = new LocationRequest()
                                      .SetPriority(LocationRequest.PriorityHighAccuracy)
                                      .SetInterval(60 * 1000 * 5)
                                      .SetFastestInterval(60 * 1000 * 2);
    
  • Android.Gms.Location.LocationCallback – Konum güncelleştirmelerini almak için bir Xamarin.Android uygulamasının soyut sınıfını alt sınıfına alması LocationProvider gerekir. Bu sınıf, uygulamayı konum bilgileriyle güncelleştirmek için birleştirilmiş konum sağlayıcısı tarafından çağrılan iki yöntem kullanıma sunuldu. Bu konu aşağıda daha ayrıntılı olarak ele alınacaktır.

Xamarin.Android uygulamasına konum güncelleştirmesini bildirmek için, birleştirilmiş konum sağlayıcısı öğesini LocationCallBack.OnLocationResult(LocationResult result)çağırır. Android.Gms.Location.LocationResult parametresi güncelleştirme konumu bilgilerini içerir.

Birleştirilmiş konum sağlayıcısı konum verilerinin kullanılabilirliğiyle ilgili bir değişiklik algıladığında yöntemini çağırır LocationProvider.OnLocationAvailability(LocationAvailability locationAvailability) . LocationAvailability.IsLocationAvailable özelliği döndürürsetrue, tarafından OnLocationResult bildirilen cihaz konumu sonuçlarının tarafından gerektiği LocationRequestkadar doğru ve güncel olduğu varsayılabilir. IsLocationAvailable false ise, tarafından OnLocationResulthiçbir konum sonucu döndürülmeyecektir.

Bu kod parçacığı, nesnesinin LocationCallback örnek bir uygulamasıdır:

public class FusedLocationProviderCallback : LocationCallback
{
    readonly MainActivity activity;

    public FusedLocationProviderCallback(MainActivity activity)
    {
        this.activity = activity;
    }

    public override void OnLocationAvailability(LocationAvailability locationAvailability)
    {
        Log.Debug("FusedLocationProviderSample", "IsLocationAvailable: {0}",locationAvailability.IsLocationAvailable);
    }

    public override void OnLocationResult(LocationResult result)
    {
        if (result.Locations.Any())
        {
            var location = result.Locations.First();
            Log.Debug("Sample", "The latitude is :" + location.Latitude);
        }
        else
        {
            // No locations to work with.
        }
    }
}

Android Konum Hizmeti API'sini kullanma

Android Konum Hizmeti, Android'de konum bilgilerini kullanmaya yönelik eski bir API'dir. Konum verileri donanım algılayıcıları tarafından toplanır ve bir sistem hizmeti tarafından toplanır. Bu hizmet, bir sınıf ve ile ILocationListeneruygulamada LocationManager erişilir.

Konum Hizmeti, Google Play Hizmetleri yüklü olmayan cihazlarda çalışması gereken uygulamalar için en uygun olanıdır.

Konum Hizmeti, Sistem tarafından yönetilen özel bir Hizmet türüdür. Sistem Hizmeti cihaz donanımıyla etkileşim kurar ve her zaman çalışır. Uygulamamızda konum güncelleştirmelerine başvurmak için, bir ve RequestLocationUpdates çağrısı kullanarak LocationManager sistem Konum Hizmeti'nden konum güncelleştirmelerine abone olacağız.

Android Konum Hizmeti'ni kullanarak kullanıcının konumunu almak için birkaç adım gerekir:

  1. Hizmete bir başvuru LocationManager alın.
  2. Arabirim uygulama ILocationListener ve konum değiştiğinde olayları işleme.
  3. Belirtilen sağlayıcı için konum güncelleştirmeleri istemek için öğesini LocationManager kullanın. ILocationListener önceki adımdaki geri çağırmaları almak için kullanılacaktırLocationManager.
  4. Uygulama artık güncelleştirmeleri almak için uygun olmadığında konum güncelleştirmelerini durdurun.

Konum Yöneticisi

Sistem konumu hizmetine sınıfının bir örneğiyle LocationManager erişebiliriz. LocationManager , sistem konumu Hizmeti ile etkileşim kurmamıza ve üzerindeki yöntemleri çağırmamıza olanak tanıyan özel bir sınıftır. Bir uygulama, aşağıda gösterildiği gibi hizmet türünü çağırarak GetSystemService ve geçirerek öğesine başvuru LocationManager alabilir:

LocationManager locationManager = (LocationManager) GetSystemService(Context.LocationService);

OnCreate , öğesine başvuru almak için LocationManageriyi bir yerdir. Etkinlik yaşam döngüsünün LocationManager çeşitli noktalarında çağırabilmemiz için öğesini sınıf değişkeni olarak tutmak iyi bir fikirdir.

LocationManager'dan konum güncelleştirmeleri isteme

Uygulama için bir başvuruya LocationManagersahip olduktan sonra, ne tür bir konum bilgisi gerektiğini ve bu bilgilerin ne sıklıkta güncelleştirildiğini bilmesi LocationManager gerekir. Bunu yapmak için nesne üzerinde LocationManager çağrısı RequestLocationUpdates yapın ve bazı güncelleştirme ölçütlerini ve konum güncelleştirmelerini alacak bir geri çağırmayı geçirin. Bu geri çağırma, arabirimi uygulaması gereken bir türdür (bu kılavuzun ILocationListener ilerleyen bölümlerinde daha ayrıntılı olarak açıklanmıştır).

RequestLocationUpdates yöntemi, sistem konumu Hizmetine uygulamanızın konum güncelleştirmelerini almaya başlamak istediğinizi bildirir. Bu yöntem, güncelleştirme sıklığını denetlemek için sağlayıcının yanı sıra zaman ve mesafe eşiklerini belirtmenize olanak tanır. Örneğin, aşağıdaki yöntem GPS konum sağlayıcısından her 2000 milisaniyede bir ve yalnızca konum 1 metreden fazla değiştiğinde konum güncelleştirmeleri ister:

// For this example, this method is part of a class that implements ILocationListener, described below
locationManager.RequestLocationUpdates(LocationManager.GpsProvider, 2000, 1, this);

Bir uygulama, konum güncelleştirmelerini yalnızca uygulamanın iyi performans göstermeleri için gerektiği sıklıkta istemelidir. Bu, pil ömrünü korur ve kullanıcı için daha iyi bir deneyim oluşturur.

LocationManager'dan güncelleştirmeleri yanıtlama

Bir uygulama içinden LocationManagergüncelleştirmeler istedikten sonra arabirimini uygulayarak ILocationListener Hizmetten bilgi alabilir. Bu arabirim, Konum Hizmetini ve konum sağlayıcısını dinlemek için dört yöntem sağlar. OnLocationChanged Sistem, kullanıcının konumu, konum güncelleştirmeleri isterken ayarlanan Ölçütlere göre konum değişikliği olarak nitelenecek kadar değiştiğinde çağırır OnLocationChanged .

Aşağıdaki kod arabirimdeki ILocationListener yöntemleri gösterir:

public class MainActivity : AppCompatActivity, ILocationListener
{
    TextView latitude;
    TextView longitude;
    
    public void OnLocationChanged (Location location)
    {
        // called when the location has been updated.
    }
    
    public OnProviderDisabled(string locationProvider)
    {
        // called when the user disables the provider
    }
    
    public OnProviderEnabled(string locationProvider)
    {
        // called when the user enables the provider
    }
    
    public OnStatusChanged(string locationProvider, Availability status, Bundle extras)
    {
        // called when the status of the provider changes (there are a variety of reasons for this)
    }
}

LocationManager güncelleştirmelerine abonelikten çık

Sistem kaynaklarından tasarruf etmek için bir uygulamanın en kısa zamanda konum güncelleştirmelerinin aboneliğini kaldırması gerekir. RemoveUpdates yöntemi, uygulamasına LocationManager güncelleştirme göndermeyi durdurmasını söyler. Örneğin, bir uygulamanın etkinlik ekranında değilken konum güncelleştirmelerine ihtiyaç duymaması durumunda güç tasarrufu yapabilmemiz için bir Etkinlik yöntemini çağırabilir RemoveUpdatesOnPause :

protected override void OnPause ()
{
    base.OnPause ();
    locationManager.RemoveUpdates (this);
}

Uygulamanızın arka planda konum güncelleştirmeleri alması gerekiyorsa, sistem Konum Hizmeti'ne abone olan özel bir Hizmet oluşturmak istersiniz. Daha fazla bilgi için Android Hizmetleri ile Arka Plan Oluşturma kılavuzuna bakın.

LocationManager için en iyi konum sağlayıcısını belirleme

Yukarıdaki uygulama GPS'i konum sağlayıcısı olarak ayarlar. Ancak, cihazın kapalı olması veya GPS alıcısı olmaması gibi her durumda GPS kullanılamayabilir. Bu durumda, sonuç Sağlayıcı için bir null dönüş olur.

GPS kullanılamadığında uygulamanızın çalışmasını sağlamak için, uygulama başlatma sırasında en iyi kullanılabilir (cihaz tarafından desteklenen ve kullanıcı etkin) konum sağlayıcısını istemek için yöntemini kullanırsınız GetBestProvider . Belirli bir sağlayıcıyı geçirmek yerine, sağlayıcının doğruluk ve güç gibi gereksinimlerini birCriterianesneyle anlayabilirsinizGetBestProvider. GetBestProvider verilen Ölçütler için en iyi sağlayıcıyı döndürür.

Aşağıdaki kod, kullanılabilir en iyi sağlayıcıyı nasıl edinip konum güncelleştirmeleri isterken kullanacağınızı gösterir:

Criteria locationCriteria = new Criteria();   
locationCriteria.Accuracy = Accuracy.Coarse;
locationCriteria.PowerRequirement = Power.Medium;

locationProvider = locationManager.GetBestProvider(locationCriteria, true);

if(locationProvider != null)
{
    locationManager.RequestLocationUpdates (locationProvider, 2000, 1, this);
}
else
{
    Log.Info(tag, "No location providers available");
}

Not

Kullanıcı tüm konum sağlayıcılarını devre dışı bırakmışsa döndürür GetBestProvidernull. Bu kodun gerçek bir cihazda nasıl çalıştığını görmek için, bu ekran görüntüsünde gösterildiği gibi Google Ayarlar > Konum > Modu altında GPS, Wi-Fi ve hücresel ağları etkinleştirdiğinizden emin olun:

Android telefonda Konum Modu ekranını Ayarlar

Aşağıdaki ekran görüntüsünde kullanılarak GetBestProviderçalıştırılan konum uygulaması gösterilmektedir:

Enlem, boylam ve sağlayıcıyı görüntüleyen GetBestProvider uygulaması

Sağlayıcıyı dinamik olarak değiştirmediğini GetBestProvider unutmayın. Bunun yerine, Etkinlik yaşam döngüsü sırasında en iyi kullanılabilir sağlayıcıyı bir kez belirler. Sağlayıcı durumu ayarlandıktan sonra değişirse uygulama, sağlayıcı anahtarıyla ilgili her olasılığı işlemek için , ve OnStatusChanged yöntemlerinde OnProviderDisabledILocationListenerOnProviderEnabledek kod gerektirir.

Özet

Bu kılavuzda, Google Konum Hizmetleri API'sinden hem Android Konum Hizmeti'ni hem de birleşik konum sağlayıcısını kullanarak kullanıcının konumunu alma ele alınmıştır.