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 LocationManager
ile 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ıysaACCESS_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.gps
uses-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:
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 LocationClient
odaklanacağı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 FusedLocationProviderClient
sahip 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 FusedLocationProviderClient
uygun 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
– NesneLocationRequest
, 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. İsteklerinLocationRequest
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 LocationRequest
kadar doğru ve güncel olduğu varsayılabilir. IsLocationAvailable
false ise, tarafından OnLocationResult
hiç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 ILocationListener
uygulamada 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:
- Hizmete bir başvuru
LocationManager
alın. - Arabirim uygulama
ILocationListener
ve konum değiştiğinde olayları işleme. - 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
. - 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 LocationManager
iyi 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 LocationManager
sahip 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 LocationManager
gü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 RemoveUpdates
OnPause
:
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 birCriteria
nesneyle 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 GetBestProvider
null
. 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:
Aşağıdaki ekran görüntüsünde kullanılarak GetBestProvider
çalıştırılan konum uygulaması gösterilmektedir:
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 OnProviderDisabled
ILocationListener
OnProviderEnabled
ek 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.