Foused Location Api를 사용할 때 Settings Api를 사용하여 사용자의 설정을 확인해야 합니다. (때로는 GPS만 켜도 부족할 때도 있습니다)

총결산

  • 때때로 GoogleFusedLocationProviderApi 사용자는 GPS를 On으로 설정해도 위치 정보를 반환하지 않습니다(후술)

  • SettingsApi를 사용하여 사용자의 설정을 확인하고 알림 설정을 표시하는 대화상자
  • FuusedLocation Provider Api에 문제가 있는 경우


    Google Play Service에 포함된 FusedLocationProviderApi GPS 기반 위치 측정과 네트워크 기반 위치 측정을 결합한 위치 정보 획득 구글 I/O 2013 발표 은 조합이 얼마나 강한지 알 수 있습니다.응용 프로그램 개발자는 다음과 같은 방식으로 위치 정보를 쉽게 얻을 수 있다
    // (GoogleApiClientの初期化などは省略)
    
    private void requestLocationUpdate() {
      if (mGoogleApiClient.isConnected()) {
        // 位置情報の取得が完了したタイミングでListnerが呼ばれる
        FusedLocationApi.requestLocationUpdates(
          mGoogleApiClient, createLocationRequest(), mLocationListener);
      }
    }
    
    private LocationRequest createLocationRequest() {
      return new LocationRequest()
        .setInterval(1000)
        .setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
    }
    
    그러나 이 코드는 사용자가 아래처럼 위치 정보를 열 수 있도록 설정할 때 Listener (!) 를 호출하지 않습니다.

    왜 위의 예는 움직이지 않습니까


    손 옆에 있는 안드로이드 5.1과 4.4에서는 위치 정보 On/Off뿐 아니라 3가지 위치 정보 모드를 설정할 수 있다.위치 정보 모드를 "터미널(GPS를 통해서만 현재 위치 지정)"으로 설정하면 "Google Play Service에 데이터를 제공할 수 있는 권한이 없음"으로 간주됩니다.FusedLocationApi.RequestLocation Updates는 특별한 예외는 아니지만 아무것도 하지 않습니다.

    Stack overflow의 이 대답.에 따르면 이전에는 Google app location setting이라는 개별 설정 항목이 있었던 것 같습니다.현재 이 프로젝트는 위의 3가지 위치 정보 모드와 결합된 것 같습니다. 예를 들어 위치 정보 모드를 '고정밀' 으로 바꾸려면 Google에 정보를 전달할 수 있습니까?대화 상자.
    이러한 쓰레기 같은 행위는 사실상 Google이 인정한 것으로 관리 응용 프로그램에서 위치 정보 설정 - Nexus 도움말 에는 'Google의 위치 정보 서비스를 On' 으로 설정하기 위해 '위치 정보' > '모드' 를 클릭한 후 '고정밀' 또는 '배터리 절약' 모드를 선택한다고 쓰여 있다.

    Settingsapi를 사용하여 사용자 설정 확인 및 대화 상자 표시


    이러한 슬픔을 완화하기 위해 Google Play Service에 포함된 SettingsApi도 사용할 수 있습니다.이 반의 업무는 크게 두 가지가 있다
    1. 사용자가 원하는 위치 정보 설정을 만족하는지 확인
    2. 사용자가 위치 정보 설정을 변경하는 대화 상자를 표시합니다.
    구체적인 인코딩은 아래와 같다
    private static final int REQUEST_LOCATION_SET = 123; // 適当なリクエストコード
    
    private void checkLocationPreference() {
      // 1. ユーザが必要な位置情報設定を満たしているか確認する
      PendingResult<> result = LocationServices.SettingsApi.checkLocationSettings(
        mGoogleApiClient,
        new LocationSettingsRequest.Builder().addLocationRequest(createLocationRequest()).build());
      result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult locationSettingsResult) {
          final Status status = locationSettingsResult.getStatus();
          switch (status.getStatusCode()) {
            case LocationSettingsStatusCodes.SUCCESS:
              // 位置情報が利用できる
              // FusedLocationApi.requestLocationUpdatesなどを呼び出す
              break;
            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
              try {
                // 2. ユーザに位置情報設定を変更してもらうためのダイアログを表示する
                status.startResolutionForResult(this /* activity */, REQUEST_LOCATION_SET);
              } catch (IntentSender.SendIntentException e) {
              }
              break;
            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
              // 位置情報が取得できず、なおかつその状態からの復帰も難しい時呼ばれるらしい
              break;
          }}});
      }
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      if (requestCode == REQUEST_LOCATION_SET) {
        // ユーザのダイアログに対する応答をここで確認できる
        switch (resultCode) {
          case Activity.RESULT_OK:
            // TODO
            break;
          case Activity.RESULT_CANCELED:
            // TODO
            break;
        }
      }
    }
    
    사용자의 설정을 변경해야 할 때 비슷한 느낌의 대화상자가 나타납니다

    참고 자료


    Google이 github에 공개한 샘플 같은 것이 가장 참고 가치가 있습니다.
    https://github.com/googlesamples/android-play-location/tree/master/LocationSettings

    좋은 웹페이지 즐겨찾기