Як запросити дозволи на сервіс в Android Marshmallow


101

В Android Marshmallow дозволи потрібно запитувати під час виконання, коли вони потрібні, а не відразу відразу, коли встановлено додаток. Однак я можу, мов, вимагати дозволів на діяльність, що є проблемою, оскільки мій додаток містить лише Послуги. (Чому це, можливо, ви запитаєте? У додатку розміщено обличчя для годинника Wear Android Wear, і все це телефон - шукати фотографії поруч, щоб надсилати на годинник - ніяких заходів не потрібно. Але для цього потрібні дозволи розташування.)

Отже, чи можна вимагати дозволів у Служби? Або якимось чином змушувати надавати дозволи на час встановлення, як і раніше?


ця проблема також всередині класу Application
itzhar

Спробуйте це, можливо, буде stackoverflow.com/a/41221852/5488468
Bipin Bharti

Моя бібліотека легко обробляє дозволи на виконання з будь-якого контексту, а також обробляє "Не запитувати знову". github.com/nabinbhandari/Android-Permissions
Nabin Bhandari

Відповіді:


47

requestPermission()можна викликати лише з, Activityа не з Service(на відміну від того, checkPermission()що вимагає лише PackageManager). Тому вам потрібно зробити додаткову роботу, щоб обійти це; вам потрібно вказати Activityсвій додаток, і, наприклад, ви Serviceможете перевірити, чи потрібні йому дозволи, і якщо вони ще не були надані, він може створити сповіщення, яке може інформувати користувача з описовим коротким повідомленням про те, чому існує сповіщення та що має відбутися, коли вони натискають на сповіщення тощо.


Це рішення, яке запропонував Бенджамін Поєш . Ви можете слухати цей подкаст з 23:40
xiaomi

Ви також можете зателефонувати за запитомPermission () всередині фрагмента.
Місаг Емамверді,

3
Що є рішенням у випадку запущеної фонової служби, періодично перевіряючи оновлення місцеположення, і я просто вимикаю дозвіл на місцезнаходження в налаштуваннях. Оскільки активності немає, це спричиняє збій моєї служби, коли я знову відкриваю додаток
stud91

1
@ stud91 Принаймні, ловіть винятки з безпеки або дозволи на запити щоразу, коли ви вимагаєте оновлення місцеположення. Це запобіжить збій вашої програми (хоча ви не отримаєте жодного місця, якщо дозвіл буде анульовано). Ще краще: перевірте дозвіл, і якщо воно відсутнє, виведіть сповіщення, яке перенаправляє користувача до Діяльності, яка є лише заповнювачем місця для діалогу дозволів.
користувач149408

8
Ось як я це вирішив: github.com/mvglasow/satstat/blob/master/src/com/vonglasow/… Його можна викликати з будь-якого, Contextякий також реалізує OnRequestPermissionsResultCallback. Функціональність схожа на стандартну requestPermission().
користувач149408

15

Я погоджуюся, це дуже клопітно для сервісів. Я думаю, ви повинні повідомити про проблему на сторінці попереднього перегляду розробників Android.

На даний момент я думаю, що найкращим рішенням є перевірка дозволу на обслуговування та показ сповіщення, якщо дозвіл відсутній. Ще краще створити DialogActivity, щоб запитувати дозвіл, коли користувачі натискають на сповіщення.


7

Погляньте на бібліотеку 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
      }
  }

1
Я спробував версію async в Сервісі, і вона не спрацювала. onComplete ніколи не дзвонили
Leo Droidcoder

Хороша ідея, але вона не доступна у сховищі
naXa

2
Цей пакет працював для мене, дякую за пропозицію. Зауважу, що я не пробував версію async. Також для тих, хто має проблеми з використанням PermissionEverywhere, переконайтеся, що ви оголосили активність помічника у своєму маніфесті та переконайтеся, що, коли ви декларуєте, він прив’язаний до правильного пакету (якщо ви використовуєте його PermissionEverywhereяк окремий пакет). Мені знадобилося багато часу, щоб зрозуміти, що я фактично не вказував PermissionEverywhereпакет у маніфесті.
користувач3570982

Я запустив PermissionEverywhereдемонстраційну програму, і вона не спрацювала.
Ixx

2

Існує дуже проста бібліотека, яка дозволяє робити саме це. Ви можете перевірити наявність дозволів з будь-якого місця (навіть із сервісу), залежно від того, чи програма перебуває на передньому плані чи на задньому плані, чи вона показує звичайне діалогове вікно, або генерує сповіщення із запитом дозволу. Код насправді зрозумілий і його також дуже просто використовувати.

Спробуйте: Permissions для Android


-2

Ви можете використовувати ResultReceiverдля створення приймача відповіді користувачів, а потім передавати його як зворотній дзвінок в Активність, через повідомлення PendingIntent. Довідково

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.