3

ここにあるPlay Services 7.0ドキュメントを見ています:

http://android-developers.blogspot.in/2015/03/google-play-services-70-places-everyone.html?m=1

https://developers.google.com/android/reference/com/google/android/gms/location/SettingsApi

ご覧のとおり、Android はアプリが位置情報を有効にする方法を簡素化し、1 回のタップで位置情報を取得できるようにしました。これは素晴らしいことです。

ただし、頭を包み込むことができないのは、これがアクセス許可モデルとどのように連携するかということです。

クエリをできるだけ明確かつ単純にするように努めます。

たとえば、ドキュメントを引用します。

この API を使用するGoogleApiClientには、少なくとも をサポートする を最初に作成しますLocationServices.API。次に、クライアントを次の場所に接続しますGoogle Play services

mGoogleApiClient = new GoogleApiClient.Builder(context)
     .addApi(LocationServices.API)
     .addConnectionCallbacks(this)
     .addOnConnectionFailedListener(this)
     .build()
 ...
 mGoogleApiClient.connect();

次に、 を作成し、アプリが使用LocationSettingsRequest.Builderするすべての を追加します。LocationRequests

 LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
     .addLocationRequest(mLocationRequestHighAccuracy)
     .addLocationRequest(mLocationRequestBalancedPowerAccuracy);

次に、現在の場所の設定が満たされているかどうかを確認します。

 PendingResult<LocationSettingsResult> result =
         LocationServices.SettingsApi.checkLocationSettings(mGoogleClient, builder.build());

PendingResult戻ると、クライアントはLocationSettingsResultオブジェクトからのステータス コードを見て、場所の設定を確認できます。クライアントは、以下を呼び出して、関連するロケーション設定の現在の状態を取得することもできますgetLocationSettingsStates()

result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
     @Override
     public void onResult(LocationSettingsResult result) {
         final Status status = result.getStatus();
         final LocationSettingsStates = result.getLocationSettingsStates();
         switch (status.getStatusCode()) {
             case LocationSettingsStatusCodes.SUCCESS:
                 // All location settings are satisfied. The client can initialize location
                 // requests here.
                 ...
                 break;
             case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                 // Location settings are not satisfied. But could be fixed by showing the user
                 // a dialog.
                 try {
                     // Show the dialog by calling startResolutionForResult(),
                     // and check the result in onActivityResult().
                     status.startResolutionForResult(
                         OuterClass.this,
                         REQUEST_CHECK_SETTINGS);
                 } catch (SendIntentException e) {
                     // Ignore the error.
                 }
                 break;
             case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                 // Location settings are not satisfied. However, we have no way to fix the
                 // settings so we won't show the dialog.
                 ...
                 break;
         }
     }
 });

ステータス コードが の場合RESOLUTION_REQUIRED、クライアントは を呼び出しstartResolutionForResult(Activity, int)てダイアログを表示し、それらの要求を満たすために場所の設定を変更する許可をユーザーに求めることができます。ダイアログの結果は を介し​​て返されonActivityResult(int, int, Intent)ます。クライアントが利用可能なロケーション プロバイダーに関心がある場合は、LocationSettingsStatesを呼び出して Intent からを取得できfromIntent(Intent)ます。

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     final LocationSettingsStates states = LocationSettingsStates.fromIntent(intent);
     switch (requestCode) {
         case REQUEST_CHECK_SETTINGS:
             switch (resultCode) {
                 case Activity.RESULT_OK:
                     // All required changes were successfully made
                     ...
                     break;
                 case Activity.RESULT_CANCELED:
                     // The user was asked to change settings, but chose not to
                     ...
                     break;
                 default:
                     break;
             }
             break;
     }
 }

上記のスニペットは、[はい] と [いいえ] のオプションを含む場所ダイアログをユーザーに表示し、[はい] をクリックすると場所を有効にします。しかし、ドキュメントには、実際にそのダイアログを作成することについては何も述べられていません。それはシステム自体によって処理されますか?その場合、どのような方法を使用する必要がありますか?

またLocationServicesAPI、許可モデルで を使用しようとすると、フローはどのように機能するはずですか?

これは、最初に要求するパーミッション モデル ダイアログを表示しACCESS_FINE_LOCATION permission、そのパーミッションが付与された場合は、「場所を有効にする必要があります」ダイアログを表示することを意味するのでしょうか? それがAndroid推奨の方法ですか?私はそれに関するドキュメントを見ていません。

TL;DR

  1. 新しいパーミッション モデル API と を一緒に使用するにはどうすればよいですかLocationServicesAPI。どちらも複数の popus を必要とします。Android推奨の方法はありますか?

  2. ユーザーがACCESS_FINE_LOCATIONアクセス許可を付与するが、位置情報を有効にすることに同意しない場合、そのフローはどのように機能するはずですか。

  3. ユーザーがACCESS_FINE_LOCATIONアクセス許可を付与し、最初に位置情報を有効にすることに同意したが、後で位置情報を無効にした場合、そのフローはどのように機能するはずですか。

  4. ユーザーに位置情報サービスを有効にするように求めるワンタップの案件ダイアログを作成するにはどうすればよいですか (許可ダイアログについては言及していません)。Google マップ アプリは、システム提供のダイアログと思われるダイアログを使用します。ただし、ドキュメントが見つかりません。

これに関する任意の回答、考えをいただければ幸いです。

また、修正が必要な場合は、反対票を投じるのではなく、コメントを残してください。

ありがとう!

4

1 に答える 1

2
  1. 新しいパーミッション モデル API と LocationServicesAPI を一緒に使用するにはどうすればよいですか。どちらも複数の popus を必要とします。Android推奨の方法はありますか?

それらは完全に独立しています。実際には位置データを取得していないため、実行時のSettingsApi権限はまったく必要ありません。LocationRequestユーザーが期待する品質のデータを受け取ることができるように、適切なサービス/設定を有効にするようにユーザーに依頼するだけです。

あなたが求めているより大きな問題は、「両方を求める場合、どちらの順序で求めるか」ということです。ほとんどの場合、最初に実行時のアクセス許可を要求してから、場所の設定を有効にするように要求するのが最も理にかなっていると思います。これは、ユーザーの位置設定の変更を利用するには実行時のアクセス許可が必要になるためです。また、最初に位置情報の許可を求めることで、位置情報の設定を有効にするよう求めている理由をユーザーが知るために必要なコンテキストをユーザーに提供することもできます。

  1. ユーザーが ACCESS_FINE_LOCATION 権限を付与しているが、位置情報を有効にすることに同意していない場合、そのフローはどのように機能するはずですか。

その後、データは取得されません。

  1. ユーザーが ACCESS_FINE_LOCATION 権限を付与し、最初に位置情報を有効にすることに同意したが、後で位置情報を無効にした場合、そのフローはどのように機能するはずですか。

位置データを確実に取得したい場合は、実行時のアクセス許可を確認し、毎回 SettingsApi を使用する必要があります。

  1. ユーザーに位置情報サービスを有効にするように求めるワンタップの案件ダイアログを作成するにはどうすればよいですか (許可ダイアログについては言及していません)。Google マップ アプリは、システム提供のダイアログと思われるダイアログを使用します。ただし、ドキュメントが見つかりません。

SettingsApi は、開発者がシステム レベルで場所の設定を有効にするための最も近いオプションです。

于 2015-12-17T20:57:05.710 に答える