Как запрашивать разрешения от службы в Android Marshmallow

В Android Marshmallow разрешения должны запрашиваться во время выполнения, когда они необходимы, а не сразу, когда приложение установлено. Тем не менее, я могу просто запросить разрешения от Activity, что является проблемой, поскольку мое приложение содержит только Services. (Почему это возможно, вы можете спросить? У приложения есть лицо Android Wear, входящее в комплект, и все, что делает телефон, - это искать фотографии рядом, чтобы отправить часы - никаких действий не требуется, но для этого требуются разрешения на доступ.)

Итак, есть ли способ запросить разрешения у Службы? Или каким-то образом заставить разрешения быть предоставленными во время установки, как в прошлом?

Ответ 1

requestPermission() может вызываться только из Activity, а не a Service (в отличие от checkPermission(), для которого требуется только PackageManager). Поэтому вам нужно сделать дополнительную работу, чтобы обойти это; вам нужно предоставить Activity в вашем приложении, и, например, ваш Service может проверить необходимые разрешения и если они еще не были предоставлены, он может создать уведомление и может информировать пользователя с описательным коротким сообщение о том, почему есть уведомление и что должно произойти, когда они нажимают на уведомление и т.д.

Ответ 2

Я согласен, это очень хлопотно для служб, я думаю, вам стоит сообщить об этом на странице предварительного просмотра Android Developer.

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

Ответ 3

Посмотрите PermissionEverywhere. Он позволяет запрашивать разрешение из любого контекста.

Создает уведомление, на которое открывается уведомление, требующее разрешения.

Пример кода из библиотеки github: -

@Override
  protected Boolean doInBackground(Void... params) {
      PermissionResponse response = PermissionEverywhere.getPermission(getApplicationContext(), 
      new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
              REQ_CODE,
              "Notification title", 
              "This app needs  a write permission", 
              R.mipmap.ic_launcher)
              .call();
      //waits..
      boolean isGranted = response.isGranted();

      if(isGranted){ //changed from isGrante to isGranted
      // Do stuff
      }
  }

Ответ 4

Существует очень простая библиотека, которая позволяет делать именно это. Вы можете проверить права доступа из любой точки (даже из службы), в зависимости от того, находится ли приложение на переднем плане или в фоновом режиме, либо показывает обычный диалог, либо генерирует уведомление с просьбой о разрешении. Код очень легко понять, и он очень прост в использовании.

Попробуйте: Разрешения для Android

Ответ 5

@SuppressLint("NewApi")
public void checkPerm() 
{
   locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

   if ( checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) {
      return;
   }

   locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, new LocationListener() {....}
}

Ответ 6

Вы можете использовать ResultReceiver для создания получателя ответа пользователей, а затем передать его как обратный вызов для Activity, посредством уведомления PendingIntent. Ссылка