Intereting Posts
Android-пользовательский ListView с ImageButton не получает фокус Использование Non-Production Activity для тестирования с Android Studio Phonegap (Android Build) – Промежуточный экран перед экраном всплеска Обменивать фрагмент в активности через анимацию Информировать активность из BroadcastReceiver ТОЛЬКО, если он находится на переднем плане Пакет отказов Gradle не существует Обнаружение использования Google Cast Автоматическое обновление для (частных) приложений для Android Есть ли способ добавить напоминания к новому событию календаря с использованием намерений? Android. Сохраняйте уведомление на панели уведомлений. Как показать диалоговое окно из класса, который расширяет приложение в Android? Получить (реальный) процесс переднего плана, используя activityManager.getRunningAppProcesses () Отправить тему по названию Набор математических функций в LaTeX для рендеринга в приложении Android WebView.loadUrl (url, headers) не работает в android

Запрос местоположения Разрешения от службы 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)