Подтвердить что ты не робот

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

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

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

Мой вызов метода:

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

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

4b9b3361

Ответ 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)