web-dev-qa-db-ja.com

Android:「グーグルマップ」アプリのようにユーザーを設定画面にリダイレクトせずにGPSを有効にできますか?

GPSベースのアプリケーションでは、ユーザーがGPSを有効にすることが重要です。そうでない場合は、通常、ユーザーが「この機能を使用できるように設定からGPSを有効にする必要があります」というダイアログを表示します。

ユーザーが[OK]を押すと、[設定]ページにリダイレクトされます。このソリューションは、ユーザーをアプリケーションコンテキストから設定に移動させるため、このソリューションは好きではありません。

「グーグルマップ」アプリケーションには、GPS機能が必要なときにきちんとしたダイアログを表示するというより良い解決策があることに気づきました。ユーザーが「OK」を選択すると、GPSが有効になります直接設定にリダイレクトすることはありません。

「グーグルマップ」アプリのように設定画面にユーザーをリダイレクトせずにGPSを有効にできますか?

下の画像をチェックアウトしてください:

Neat Dialog

15
A.Alqadomi

その機能を使用するには、次のものが必要です。

  • 最初に(少なくとも)Play開発者サービスのバージョン7.0

compile 'com.google.Android.gms:play-services-location:16.0.0'

  • あなたのコードでこのような2番目のもの(私は私のonCreateでそれを持っていました):

-

 // Check the location settings of the user and create the callback to react to the different possibilities
LocationSettingsRequest.Builder locationSettingsRequestBuilder = new LocationSettingsRequest.Builder()
                .addLocationRequest(mLocationRequest);
PendingResult<LocationSettingsResult> result =
                LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, locationSettingsRequestBuilder.build());
result.setResultCallback(mResultCallbackFromSettings);

そして、コールバックを作成します。

// The callback for the management of the user settings regarding location
private ResultCallback<LocationSettingsResult> mResultCallbackFromSettings = new ResultCallback<LocationSettingsResult>() {
    @Override
    public void onResult(LocationSettingsResult result) {
        final Status status = result.getStatus();
        //final LocationSettingsStates 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(
                            MapActivity.this,
                            REQUEST_CHECK_SETTINGS);
                } catch (IntentSender.SendIntentException e) {
                    // Ignore the error.
                }
                break;
            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                Log.e(TAG, "Settings change unavailable. We have no way to fix the settings so we won't show the dialog.");
                break;
        }
    }
};

そして最後に、onActivityResultに次のようになりました。

/**
 * Used to check the result of the check of the user location settings
 *
 * @param requestCode code of the request made
 * @param resultCode code of the result of that request
 * @param intent intent with further information
 */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    //final LocationSettingsStates states = LocationSettingsStates.fromIntent(intent);
    switch (requestCode) {
        case REQUEST_CHECK_SETTINGS:
            switch (resultCode) {
                case Activity.RESULT_OK:
                    // All required changes were successfully made
                    if (mGoogleApiClient.isConnected() && userMarker == null) {
                        startLocationUpdates();
                    }
                    break;
                case Activity.RESULT_CANCELED:
                    // The user was asked to change settings, but chose not to
                    break;
                default:
                    break;
            }
            break;
    }
}
21