Android'de Kullanıcı Konumu
Kullanıcının Android'de yerini almak, iOS'a göre biraz daha basittir. Karışıklık başlatmak için, bunu yapmanın iki farklı yolu vardır. Birincisi Android API'larını android.location.LocationListener
ve ikincisi Google Play Hizmetleri API'larını kullanıyor com.google.android.gms.location.LocationListener
. İkisini de gözden geçirelim.
Android'in Konum API'sı
Android'in konum API'ları, konum almak için üç farklı sağlayıcı kullanır -
LocationManager.GPS_PROVIDER
- Bu sağlayıcı uydu kullanarak konumu belirler. Koşullara bağlı olarak, bu sağlayıcının konum düzeltmesini geri alması biraz zaman alabilir.
LocationManager.NETWORK_PROVIDER
- Bu sağlayıcı, baz istasyonu ve WiFi erişim noktalarının kullanılabilirliğine göre konumu belirler. Sonuçlar bir ağ araması yoluyla alınır.
LocationManager.PASSIVE_PROVIDER
- Bu sağlayıcı, diğer sağlayıcılar tarafından oluşturulan konumları döndürecektir. Diğer uygulamalar veya hizmetler istediklerinde, konumları kendiniz istemeden pasif olarak konum güncellemeleri alırsınız.
Bunun özü size bir nesne elde ediyoruz LocationManager
sistemden uygulamak LocationListener
ve çağrı requestLocationUpdates
üzerine LocationManager
.
İşte bir kod snippet'i:
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
// Called when a new location is found by the network location provider.
makeUseOfNewLocation(location);
}
public void onStatusChanged(String provider, int status, Bundle extras) {}
public void onProviderEnabled(String provider) {}
public void onProviderDisabled(String provider) {}
};
// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
Google'ın Konum Stratejileri API Kılavuzukodu oldukça güzel açıklıyor. Ancak, çoğu durumda, bunun yerine Google Konum Hizmetleri API'sını kullanarak daha iyi pil performansı ve daha uygun doğruluk elde edeceğinizi de belirtmişlerdir . Şimdi karışıklık başlıyor!
- Google'ın Konum Hizmetleri API'sı
Google'ın Konum Hizmetleri API'sı Google Play Hizmetleri APK'sının bir parçasıdır ( nasıl ayarlanacağı aşağıda açıklanmıştır ). Android API'sı üzerine inşa edilmiştir. Bu API'ler, yukarıda belirtilen sağlayıcılar yerine "Kaynaşmış Konum Sağlayıcı" sağlar. Bu sağlayıcı, doğruluğu, pil kullanımını vb. Temel alarak hangi sağlayıcıyı kullanacağını otomatik olarak seçer. Hızlıdır, çünkü güncellemeye devam eden sistem çapında bir hizmetten konum alırsınız. Ayrıca, coğrafi eskrim gibi daha gelişmiş özellikleri kullanabilirsiniz.
Google'ın Konum Hizmetlerini kullanmak için, uygulamanızın GooglePlayServicesClient
. İstemciye bağlanmak için, etkinliğinizin (veya fragmanınızın vb.) Uygulanması GooglePlayServicesClient.ConnectionCallbacks
ve GooglePlayServicesClient.OnConnectionFailedListener
arayüzleri gerekir. İşte bir örnek kod:
public class MyActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener {
LocationClient locationClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
locationClient = new LocationClient(this, this, this);
}
@Override
public void onConnected(Bundle bundle) {
Location location = locationClient.getLastLocation() ;
Toast.makeText(this, "Connected to Google Play Services", Toast.LENGTH_SHORT).show();
}
@Override
public void onDisconnected() {
Toast.makeText(this, "Connected from Google Play Services.", Toast.LENGTH_SHORT).show();
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
// code to handle failed connection
// this code can be found here — http://developer.android.com/training/location/retrieve-current.html
}
- Neden
locationClient.getLastLocation()
boş?
En locationClient.getLastLocation()
son bilinen konum istemciden alınır. Ancak, Kaynaşmış Konum Sağlayıcı arka plan konumunu yalnızca en az bir istemci bağlıysa koruyacaktır. İlk istemci bağlandığında, hemen bir konum almaya çalışacaktır. Etkinlik bağlamak için ilk müşteri olduğunu ve çağırırsanız getLastLocation()
hemen içinde onConnected()
ilk konum gelmek için yeterli zaman olmayabilir ki. Bu sonuçlanacaktır location
olmak null
.
Bu sorunu çözmek için, sağlayıcı konumu getLastLocation()
alana kadar beklemeniz gerekir (belirsiz bir şekilde) ve sonra aramak imkansızdır. Başka bir (daha iyi) seçenek, com.google.android.gms.location.LocationListener
periyodik konum güncellemelerini almak için arabirimi uygulamaktır (ve ilk güncellemeyi aldıktan sonra kapatmaktır).
public class MyActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener {
// . . . . . . . . more stuff here
LocationRequest locationRequest;
LocationClient locationClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
// . . . . other initialization code
locationClient = new LocationClient(this, this, this);
locationRequest = new LocationRequest();
// Use high accuracy
locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
// Set the update interval to 5 seconds
locationRequest.setInterval(UPDATE_INTERVAL);
// Set the fastest update interval to 1 second
locationRequest.setFastestInterval(FASTEST_INTERVAL);
}
// . . . . . . . . other methods
@Override
public void onConnected(Bundle bundle) {
Location location = locationClient.getLastLocation();
if (location == null)
locationClient.requestLocationUpdates(locationRequest, this);
else
Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show();
}
// . . . . . . . . other methods
@Override
public void onLocationChanged(Location location) {
locationClient.removeLocationUpdates(this);
// Use the location here!!!
}
Bu kodda, istemcinin zaten en son konuma (in onConnected
) sahip olup olmadığını kontrol edersiniz . Değilse, konum güncellemeleri talep edersiniz ve güncelleme alır almaz istekleri ( onLocationChanged()
geri aramada) kapatırsınız .
Bunun geri aramanın locationClient.requestLocationUpdates(locationRequest, this);
içinde olması gerektiğini onConnected
, aksi IllegalStateException
takdirde Google Play Hizmetleri İstemcisi'ne bağlı olmayan konumlar için istekte bulunmaya çalışacağınızı unutmayın.
- Kullanıcı Konum Hizmetlerini devre dışı bıraktı
Çoğu zaman, kullanıcının konum hizmetlerini devre dışı bırakması gerekir (pilden tasarruf etmek veya gizlilik nedenleriyle). Böyle bir durumda, yukarıdaki kod yine de konum güncellemeleri ister, ancak onLocationChanged
hiçbir zaman çağrılmaz. Kullanıcının konum hizmetlerini devre dışı bırakıp bırakmadığını kontrol ederek istekleri durdurabilirsiniz.
Uygulamanız konum hizmetlerini etkinleştirmelerini gerektiriyorsa, bir mesaj veya tost göstermek istersiniz. Ne yazık ki, kullanıcının Google'ın Konum Hizmetleri API'sında konum hizmetlerini devre dışı bırakıp bırakmadığını kontrol etmenin bir yolu yoktur. Bunun için Android'in API'sına başvurmanız gerekir.
Senin içinde onCreate
yöntemle:
LocationManager manager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && !manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
locationEnabled = false;
Toast.makeText(getActivity(), "Enable location services for accurate data", Toast.LENGTH_SHORT).show();
}
else locationEnabled = true;
Ve yönteminizdeki locationEnabled
bayrağı onConnected
şu şekilde kullanın:
if (location != null) {
Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show();
}
else if (location == null && locationEnabled) {
locationClient.requestLocationUpdates(locationRequest, this);
}
GÜNCELLEME
Belge güncellenir, LocationClient kaldırılır ve API, iletişim kutusundan tek bir tıklama ile GPS'i etkinleştirmeyi destekler:
task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
// All location settings are satisfied. The client can initialize
// location requests here.
// ...
}
});
task.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
if (e instanceof ResolvableApiException) {
// Location settings are not satisfied, but this can be fixed
// by showing the user a dialog.
try {
// Show the dialog by calling startResolutionForResult(),
// and check the result in onActivityResult().
ResolvableApiException resolvable = (ResolvableApiException) e;
resolvable.startResolutionForResult(MainActivity.this,
REQUEST_CHECK_SETTINGS);
} catch (IntentSender.SendIntentException sendEx) {
// Ignore the error.
}
}
}
});
Bağlantı https://developer.android.com/training/location/change-location-settings#prompt
Yeni konum istemcisi: FusedLocationProviderClient
private FusedLocationProviderClient fusedLocationClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
}
Herhangi bir konum görevi gerçekleştirmeden önce https://developer.android.com/training/location adresinden geçmeniz önerilir .