Использование Google SettingsAPI и PermissionModel API в тандеме

Я смотрю на 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 упростил способ, которым приложения могут активировать местоположение, просто сделав его одним касанием, и это здорово.

Однако то, что я не могу обернуть мою голову, - то, как это будет работать вместе с Моделью разрешений.

Я постараюсь сделать мой запрос максимально понятным и простым.

Например, цитирование документов:

Чтобы использовать этот 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 из намерения по телефону 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 вместе, так как они оба включают в себя несколько поп. Есть ли андроид рекомендуемый способ?

  2. Если пользователь предоставляет ACCESS_FINE_LOCATION разрешение, но не согласен, чтобы включить местоположение, как этот поток должен работать.

  3. Если пользователь предоставляет ACCESS_FINE_LOCATION разрешение и соглашается включить местоположение вначале, но позже отключает местоположение, как этот поток должен работать.

  4. Как мы создаем диалоговое окно одним касанием, чтобы попросить пользователя включить службы определения местоположения (я НЕ ОБРАЩАЮСЯ к диалоговому окну разрешения). Приложение Google Maps использует диалоговое окно, которое выглядит как системный диалог. Однако я не могу найти какую-либо документацию к нему.

Любые ответы, мысли по этому поводу будут высоко оценены!

И если есть какие-то исправления, пожалуйста, оставьте комментарий вместо понижения.

Спасибо!

1 ответ

Решение
  1. Как мы используем API-интерфейс новой модели разрешений и LocationServicesAPI вместе, поскольку оба они включают в себя несколько popus. Есть ли андроид рекомендуемый способ?

Они полностью независимы. SettingsApi не требует никаких разрешений во время выполнения, так как вы фактически не получаете никаких данных о местоположении. Это просто позволяет вам попросить пользователя включить соответствующие услуги / настройки, чтобы ваш LocationRequest получит качество данных, которые он ожидает.

Большая проблема, которую я думаю, вы спрашиваете: "Если я должен спросить оба, в каком порядке я должен спросить их?" Я думаю, что в большинстве случаев, сначала запрашивать разрешение на выполнение, а затем запрашивать включение настроек местоположения имеет смысл, так как разрешение на выполнение потребовалось бы для любого использования любых изменений настроек местоположения пользователя. Спрашивание разрешения на местоположение также может дать пользователям контекст, в котором они должны знать, почему вы просите их включить настройки местоположения.

  1. Если пользователь предоставляет разрешение ACCESS_FINE_LOCATION, но не согласен включить местоположение, как этот поток должен работать.

Тогда вы не получите никаких данных.

  1. Если пользователь предоставляет разрешение ACCESS_FINE_LOCATION и соглашается сначала включить местоположение, но позже отключает местоположение, как этот поток должен работать.

Вы должны проверить оба разрешения времени выполнения и использовать SettingsApi каждый раз, если хотите убедиться, что вы получите данные о местоположении обратно.

  1. Как мы создаем диалоговое окно одним касанием, чтобы попросить пользователя включить службы определения местоположения (я НЕ ОБРАЩАЮСЯ к диалоговому окну разрешения). Приложение Google Maps использует диалоговое окно, которое выглядит как системный диалог. Однако я не могу найти какую-либо документацию к нему.

SettingsApi - самый близкий вариант для разработчиков, чтобы включить настройки местоположения на системном уровне.

Другие вопросы по тегам