Android. Могу ли я включить GPS, не перенаправляя пользователя на экран настроек, например, в приложении "Google Maps".

В приложениях на основе GPS важно, чтобы пользователь включил свой GPS. Если нет, то обычно мы показываем диалог, в котором говорится, что пользователь "должен включить свой GPS из настроек, чтобы иметь возможность использовать эту функциональность".

Когда пользователь нажмет OK, он будет перенаправлен на страницу настроек, мне не нравится это решение, так как оно выводит пользователя из контекста приложения в настройки.

Я заметил, что приложение "google maps" имеет лучшее решение, которое должно показать четкое диалоговое окно, когда требуется функция GPS. При выборе пользователем "ОК" GPS будет включен напрямую без перенаправления настроек.

Могу ли я включить GPS, не перенаправляя пользователя на экран настроек, например, в приложении "Google Maps"?

проверьте изображение ниже:

Neat Dialog

Ответы

Ответ 1

Чтобы иметь эту функцию, вам нужно:

  • Сначала (по крайней мере) версия 7.0 игровых сервисов

compile 'com.google.android.gms:play-services:7.0.0'

  • Второе что-то подобное в вашем коде (у меня было это в моем 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;
    }
}