플레이 - Android:LocationManager 및 Google Play 서비스




구글플레이서비스 다운그레이드 (6)

위치 관리자

공식 문서에 명시된 바와 같이,이 클래스를 사용하면 위치에 대한 서비스를 사용하거나, 장치의 지리적 위치를 주기적으로 업데이트하거나, 장치에 미리 지정된 위치 근처에 있다고 말하기 위해 앱에 "의도"를 보낼 수 있습니다. API에는 ACCESS_COARSE_LOCATION 또는 ACCESS_FINE_LOCATION 필요합니다

Google 위치 API 서비스

LocationManager와 완전히 일치하지 않지만, 실시간 기능은 몇 가지 근본적인 차이점이 있습니다.

장점과 단점

Google Location API Services의 경우 LocationManager와 비교하면 사용 중 성능과 안정성이 크게 향상되었습니다. 예를 들어, 매개 변수가 후속 업데이트를 위해 장치를 교체해야하는 최소 시간 및 거리 기간으로 설정된 경우 LocationManager가 이전 위치 또는 맵 업데이트를 수신하는 일반적인 문제가있었습니다. 매개 변수 중 하나는 일반적으로 무시되었습니다. Google 위치 API 서비스에서이 문제가 발생하지 않았습니다. 또한 Google 위치 서비스는 배터리 가루를 덜 소비합니다.

결과적으로 Google Location API Services는 모든 경우에 더 나은 성능을 보였습니다. 그러나 몇 가지 단점도 있습니다. 위치 서비스를 사용하려면 Google Play 서비스를 설치해야합니다.

따라서 Google에서 지원하지 않는 일반적인 펌웨어가 있거나 Google 서비스를 사용할 수없는 기기에서는 애플리케이션이 작동하지 않습니다. 이것은 고려해야 할 매우 중요한 사항입니다. 이 분야에 대한 연구는 대부분의 사용자가 Google Play 서비스를 가지고 있지 않다는 사실을 밝혀 냈습니다. 예를 들어, 국가 정책으로 인해 중국에서는 사용할 수 없으며 이는 무시할 수없는 시장의 중요한 부분입니다. 이 경우 LocationManager로 전환해야합니다.

Google 위치 API 서비스는지도 작업에 가장 적합한 솔루션입니다. 이 API를 사용하면 사용자가 Google Play 서비스를 설치 한 경우 모바일 리소스 측면에서 가장 정확한 좌표와 최소 비용으로 작업 할 수 있습니다. 그렇지 않으면 유일한 해결책은 LocationManager입니다.

자세한 내용은 here 참조 here

사용자의 현재 위치를 얻는 데 중점을 둔 앱을 만들고 Google Places API 를 통해 자신과 가까운 관심 지점 (예 : 바, 레스토랑 등)을 찾고 싶습니다.

웹을 검색 할 장소를 검색 할 때 LocationManager 클래스를 사용하는 일부 자습서와 사용자 위치를 찾기 위해 Google Play 서비스 를 사용하는 다른 자습서를 보았습니다.

첫눈에 두 사람 모두 같은 일을하지만, 이것에 익숙하지 않아서 약간 혼란 스러웠으며 어떤 방법이 내 요구에 가장 적합한 지 알 수 없습니다. 그래서 나는 당신에게 묻고 싶습니다 :

위치를 찾는 두 가지 방법의 차이점은 무엇입니까?


Google Play 서비스의 일부인 Google 위치 서비스 API 위치 제공 업체 , 사용자 이동 위치 정확도 를 자동으로 처리하는보다 강력한 고급 프레임 워크를 제공 합니다 . 또한 제공하는 전력 소비 매개 변수를 기반으로 위치 업데이트 예약을 처리합니다. 대부분의 경우 위치 서비스 API를 사용하면 배터리 성능이 향상 되고 정확도가 향상됩니다.

두 가지 API Google Play 서비스 위치 API Android 프레임 워크 위치 API의 자세한 차이점은 here 확인할 수 있습니다 here


꽤 오랫동안 Google 위치 서비스 API를 사용하고 있습니다. 위치 결정을위한 여러 소스를 갖는 복잡성을 캡슐화하기 때문에 장점이 있습니다. 그러나 그것은 너무 무겁게 캡슐화 되어 이상한 위치를 얻을 때 그 이상한 위치가 어디에서 왔는지 결정할 방법이 없습니다.

실생활에서 나는 실제 위치에서 10 킬로미터 떨어진 몇 가지 괴물 값이 나타났습니다. 유일한 설명은 이러한 미친 위치는 Google Wi-Fi 또는 NWK 데이터베이스의 오류에서 비롯된다는 것입니다. Wi-Fi 및 네트워크 토폴로지는 매일 바뀌기 때문에 항상 존재하는 오류입니다. 그러나 불행히도 (그리고 놀랍게도) API는 개별 위치가 어떻게 도출되었는지에 대한 정보를 제공하지 않습니다.

속도, 가속도, 베어링 등의 타당성 검사를 기반으로 괴물 값을 필터링 해야하는 문제가 있습니다.

... 또는 좋은 오래된 프레임 워크 API로 돌아가서 GPS 만 사용하십시오 .Google이 융합 API를 개선 할 때까지하기로 결정했습니다.


내 경험상 "적절한 정확도"가 더 좋은 의미는 아닙니다. 내가 빠진 것이 아니라면 GPS를 사용하고 싶다면 LocationManager가 유일한 방법입니다. 우리는 앱으로 차량을 추적하며, 누락 된 부분이없는 한 Google Play 서비스는 매우 부정확 한 위치를 제공합니다.


Android의 사용자 위치

안드로이드에서 사용자의 위치를 ​​얻는 것은 iOS보다 덜 간단합니다. 혼란을 시작하기 위해 완전히 다른 두 가지 방법이 있습니다. 첫 번째는 android.location.LocationListener Android API를 사용하고 두 번째는 Google Play 서비스 API com.google.android.gms.location.LocationListener 사용 com.google.android.gms.location.LocationListener . 두 가지를 모두 살펴 보자.

  1. 안드로이드의 위치 API

    Android의 위치 API는 세 가지 다른 제공 업체를 사용하여 위치를 얻습니다.

    • LocationManager.GPS_PROVIDER —이 공급자는 위성을 사용하여 위치를 결정합니다. 조건에 따라이 공급자는 위치 수정을 반환하는 데 시간이 걸릴 수 있습니다.
    • LocationManager.NETWORK_PROVIDER —이 공급자는 셀 타워 및 WiFi 액세스 포인트의 가용성에 따라 위치를 결정합니다. 결과는 네트워크 조회를 통해 검색됩니다.
    • LocationManager.PASSIVE_PROVIDER —이 공급자는 다른 공급자가 생성 한 위치를 반환합니다. 다른 응용 프로그램이나 서비스가 실제로 위치를 직접 요청하지 않고 요청하면 위치 업데이트를 수동으로받습니다.

요점은 시스템에서 LocationManager 객체를 가져오고 LocationListener 구현 한 다음 LocationListener 에서 requestLocationUpdates 를 호출한다는 것입니다.

다음은 코드 스 니펫입니다.

    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를 대신 사용하면 배터리 성능이 향상되고 정확성이 향상됩니다. 이제 혼란이 시작됩니다!

  1. Google의 위치 서비스 API

Google의 위치 서비스 API는 Google Play 서비스 APK의 일부입니다 ( 설정 방법 ). 그것들은 Android API 위에 구축되었습니다. 이 API는 위에서 언급 한 공급자 대신 "퓨즈 위치 공급자"를 제공합니다. 이 공급자는 정확도, 배터리 사용량 등을 기준으로 사용할 기본 공급자를 자동으로 선택합니다. 시스템 전체 서비스에서 위치를 지속적으로 업데이트하여 업데이트하므로 속도가 빠릅니다. 지오 펜싱과 같은 고급 기능을 사용할 수 있습니다.

Google의 위치 서비스를 사용하려면 앱이 GooglePlayServicesClient 에 연결되어 GooglePlayServicesClient 합니다. 클라이언트에 연결하려면 활동 (또는 단편 등)이 GooglePlayServicesClient.ConnectionCallbacksGooglePlayServicesClient.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는 하나 이상의 클라이언트가 연결된 경우에만 백그라운드 위치를 유지합니다. 첫 번째 클라이언트가 연결되면 즉시 위치를 가져 오려고 시도합니다. 활동이 연결하는 첫 번째 클라이언트이고 onConnected() 에서 getLastLocation() 즉시 호출하면 첫 번째 위치가 도착하기에 시간이 충분하지 않을 수 있습니다. 이로 인해 locationnull 됩니다.

이 문제를 해결하려면 공급자가 위치를 얻을 때까지 getLastLocation() 을 호출 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 콜백 내에 있어야합니다. 그렇지 않으면 Google Play 서비스 클라이언트에 연결하지 않고 위치를 요청하려고하기 때문에 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;

다음과 같이 onConnected 메소드에서 locationEnabled 플래그를 사용하십시오.

    if (location != null) {
    Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show();
}
else if (location == null && locationEnabled) {
    locationClient.requestLocationUpdates(locationRequest, this);
}

Rahul Jiresal 덕분에

최신 정보

대화 상자에서 한 번의 클릭으로 문서가 업데이트되고 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 을 방문하는 것이 좋습니다.


GPS 서비스를 기반으로하는 두 가지 API Google Play 서비스 위치 API와 Android 프레임 워크 위치 API의 차이점

FusedLocationProviderClient

  1. 첫 번째 가져 오기의 경우 위치는 null이 아니어야합니다 (예 : 일부 다른 앱은 GoogleplayService 데이터베이스에서 Lastknown 위치를 업데이트해야합니다. null 인 경우 해결해야 함)
  2. 다음 순차적 Fetch의 경우 requestLocationUpdates() 메소드를 사용하여 위치를 페치합니다.
  3. 위치 반입은 locationRequest.setInterval(milliseconds)setFastestInterval(milliseconds) 만을 기반으로하며 사용자 위치 변경을 기반으로하지는 않습니다.
  4. 반환 된 LatLng 값에는 소수점 이하 7 개의 값만 포함 됩니다 (예 : 11.9557996, 79.8234599).
  5. 앱 요구 사항에서 현재 위치 거리를 무시할 수있는 정확도 (50-100 미터)가 권장되는 경우
  6. 배터리 사용에 효과적입니다.

LocationManager Api

  1. locationManager.requestLocationUpdates ()를 사용하여 사용자 위치 가져 오기가 호출됩니다.
  2. 사용자 위치 변경 시간 간격을 기반으로 한 위치 가져 오기 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, milliseconds, mindistance, Mylocationlistener)

  3. 반환 된 LatLng 값에는 14 개의 10 진수 값 이 포함되어 있습니다 (예 : 11.94574594963342 79.81166719458997). 정확한 위치 값

  4. 미터 단위의 정확도가 더 필요한 위치 기반 앱에 권장 됩니다.
  5. 배터리 사용량은 가져 오기 간격과 가져 오기 거리를 기준으로합니다.




geolocation