Запрос местоположения Разрешения от службы Android M
Я использую службу, которая при загрузке запускается и начинает проверять наличие обновлений местоположения. Как только я откажусь от доступа к местоположению после всплывающего окна разрешения, благодаря Android M моя служба аварийно завершает работу после того, как телефон загрузится.
Так как у меня нет активности, в этом случае вызов requestPermissions()
возвращает ClassCastException
, поскольку моя служба Context
не может быть передана в действие.
Мой вызов метода:
ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_COARSE_LOCATION);
Есть ли какое-либо решение до этого ИЛИ я должен отменить права службы, чтобы НЕ запускать в таком состоянии.
Ответы
Ответ 1
Вы не можете запрашивать разрешение через службу, поскольку служба не привязана к пользовательскому интерфейсу, это имеет смысл. Поскольку контекст службы не является активностью, исключение, которое вы получаете, имеет смысл.
Вы можете проверить, доступно ли разрешение в службе и запросить разрешение в действии (да, вам нужна активность).
В службе:
public static boolean checkPermission(final Context context) {
return ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED;
}
и в активности:
private void showPermissionDialog() {
if (!LocationController.checkPermission(this)) {
ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION},
PERMISSION_LOCATION_REQUEST_CODE);
}
}
Ответ 2
Вы можете проверить разрешения без Activity, используя контекст приложения, но вам потребуется Activity при запросе разрешений. Чтобы получить контекст приложения, просто вызовите getApplicationContext()
и для проверки разрешений используйте ContextCompat.checkSelfPermission()
.
Также есть хорошая информация, как использовать разрешение во время выполнения в правильном пути:
Чтобы проверить, есть ли у вас разрешение, вызовите метод ContextCompat.checkSelfPermission()
. Например, этот фрагмент показывает, как проверить, есть ли у действия разрешение на запись в календарь:
// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.WRITE_CALENDAR);
Если приложение имеет разрешение, метод возвращает PackageManager.PERMISSION_GRANTED
, и приложение может продолжить операцию. Если приложение не имеет разрешения, метод возвращает PERMISSION_DENIED
, и приложение должно явно запросить у пользователя разрешение.
Изменение: После того, как вы проверите разрешения на обслуживание, вам потребуется активность, чтобы запросить разрешение:
public static void requestPermissions (Activity activity, String[] permissions, int requestCode)