Android의 사용자 위치
안드로이드에서 사용자의 위치를 얻는 것은 iOS보다 덜 간단합니다. 혼란을 시작하기 위해 완전히 다른 두 가지 방법이 있습니다. 첫 번째는의 Android API를 사용 android.location.LocationListener
하고 두 번째는 Google Play Services API를 사용하는 것 com.google.android.gms.location.LocationListener
입니다. 두 가지를 모두 살펴 보자.
안드로이드의 위치 API
Android의 위치 API는 세 가지 다른 제공 업체를 사용하여 위치를 얻습니다.
LocationManager.GPS_PROVIDER
—이 공급자는 위성을 사용하여 위치를 결정합니다. 조건에 따라이 공급자는 위치 수정을 반환하는 데 시간이 걸릴 수 있습니다.
LocationManager.NETWORK_PROVIDER
—이 공급자는 셀 타워 및 WiFi 액세스 포인트의 가용성에 따라 위치를 결정합니다. 결과는 네트워크 조회를 통해 검색됩니다.
LocationManager.PASSIVE_PROVIDER
—이 제공자는 다른 제공자가 생성 한 위치를 반환합니다. 다른 응용 프로그램이나 서비스가 실제로 위치를 직접 요청하지 않고 요청하면 위치 업데이트를 수동으로받습니다.
요점은 LocationManager
시스템에서 객체를 가져 와서 구현 LocationListener
하고를 호출한다는 requestLocationUpdates
것 LocationManager
입니다.
다음은 코드 스 니펫입니다.
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 API 가이드코드를 꽤 잘 설명합니다. 그러나 대부분의 경우 Google 위치 서비스 API를 대신 사용하면 배터리 성능이 향상되고 정확성이 향상 됩니다. 이제 혼란이 시작됩니다!
- Google의 위치 서비스 API
Google의 위치 서비스 API는 Google Play 서비스 APK의 일부입니다 ( 설정 방법 ). 그것들은 Android API 위에 구축되었습니다. 이 API는 위에서 언급 한 공급자 대신 "퓨즈 위치 공급자"를 제공합니다. 이 공급자는 정확도, 배터리 사용량 등을 기준으로 사용할 기본 공급자를 자동으로 선택합니다. 시스템 전체 서비스에서 위치를 지속적으로 업데이트하여 업데이트하므로 속도가 빠릅니다. 지오 펜싱과 같은 고급 기능을 사용할 수 있습니다.
Google의 위치 서비스를 사용하려면 앱이에 연결되어 있어야합니다 GooglePlayServicesClient
. 클라이언트에 연결하려면 활동 (또는 조각 등)을 구현 GooglePlayServicesClient.ConnectionCallbacks
하고 GooglePlayServicesClient.OnConnectionFailedListener
인터페이스 해야합니다 . 샘플 코드는 다음과 같습니다.
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
}
- 왜
locationClient.getLastLocation()
null입니까?
는 locationClient.getLastLocation()
클라이언트에서 마지막으로 알려진 위치를 가져옵니다. 그러나 Fused Location Provider는 하나 이상의 클라이언트가 연결된 경우에만 백그라운드 위치를 유지합니다. 첫 번째 클라이언트가 연결되면 즉시 위치를 가져 오려고 시도합니다. 당신의 활동이 연결하는 첫 번째 클라이언트이며 호출하면 getLastLocation()
즉시에서 onConnected()
첫 번째 위치에 올 수있는 충분한 시간이되지 않을 수도.이 발생합니다 location
되고 null
.
이 문제를 해결하려면 공급자가 위치 getLastLocation()
를 파악할 때까지 (불확실하게) 기다렸다가을 호출 해야합니다. 또 다른 (더 나은) 옵션은 com.google.android.gms.location.LocationListener
주기적 위치 업데이트를 수신 하도록 인터페이스 를 구현하는 것입니다 (첫 번째 업데이트를 받으면 끄십시오).
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!!!
}
이 코드에서는 클라이언트에 이미 마지막 위치 ( onConnected
) 가 있는지 확인합니다 . 그렇지 않은 경우 위치 업데이트를 요청하고 업데이트를 받으면 onLocationChanged()
즉시 콜백으로 요청을 끕니다 .
(가) 참고 locationClient.requestLocationUpdates(locationRequest, this);
가이 안에 있어야하는 onConnected
콜백, 그렇지 않으면 당신은 얻을 것이다 IllegalStateException
당신은 구글 플레이 서비스 클라이언트에 연결하지 않고 위치에 대한 요청하려고 할 것이기 때문에.
많은 경우 사용자는 배터리를 절약하거나 개인 정보 보호를 위해 위치 서비스를 비활성화했습니다. 이 경우 위의 코드는 여전히 위치 업데이트를 요청하지만 onLocationChanged
호출되지는 않습니다. 사용자가 위치 서비스를 비활성화했는지 확인하여 요청을 중지 할 수 있습니다.
앱에서 위치 서비스를 활성화해야하는 경우 메시지 또는 토스트를 표시하려고합니다. 안타깝게도 사용자가 Google의 위치 서비스 API에서 위치 서비스를 사용 중지했는지 확인하는 방법은 없습니다. 이를 위해서는 Android API를 사용해야합니다.
당신의 onCreate
방법에서 :
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;
그리고 메소드 locationEnabled
에서 다음 onConnected
과 같이 플래그를 사용하십시오 .
if (location != null) {
Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show();
}
else if (location == null && locationEnabled) {
locationClient.requestLocationUpdates(locationRequest, this);
}
최신 정보
대화 상자에서 한 번의 클릭으로 문서가 업데이트되고 LocationClient가 제거되고 API가 GPS를 활성화하도록 지원합니다.
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.
}
}
}
});
링크 https://developer.android.com/training/location/change-location-settings#prompt
새로운 위치 클라이언트 : FusedLocationProviderClient
private FusedLocationProviderClient fusedLocationClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
}
위치 작업을 수행하기 전에 https://developer.android.com/training/location 을 방문하는 것이 좋습니다 .