Как запрашивать разрешения от службы в 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
.
Ссылка