Запрос местоположения Разрешения от службы Android M

Я использую службу, которая при загрузке запускается и начинает проверять наличие обновлений местоположения. Как только я откажусь от доступа к местоположению при всплывании разрешения теперь благодаря Android M, мой сервис падает после загрузки телефона.

Поскольку у меня нет активности, в этом случае вызов requestPermissions() возвращает ClassCastException качестве моей службы. Context не может быть ClassCastException в действие.

Мой метод:

 ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_COARSE_LOCATION); 

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

Solutions Collecting From Web of "Запрос местоположения Разрешения от службы Android M"

Вы не можете запрашивать разрешение через службу, поскольку служба не привязана к пользовательскому интерфейсу, это имеет смысл. Поскольку контекст службы не является активностью, то исключение, которое вы получаете, имеет смысл.

Вы можете проверить, доступно ли разрешение в службе и запросить разрешение в действии (да, вам нужно действие).

В сервисе:

  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); } } 

Вы можете проверять разрешения без действия с помощью контекста приложения, но вам потребуется «Активность» при запросе разрешений. Чтобы получить контекст приложения, просто вызовите 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)