Заборона дозволу: startForeground вимагає android.permission.FOREGROUND_SERVICE


195

Останнім часом ми раптом бачимо кілька наступних слідів стека. Чому це могло бути? Це відбувається з того моменту, коли програма намагається перенести послугу аудіо коментарів на перший план із повідомленням про медіа та все.

java.lang.SecurityException: Permission Denial: startForeground from pid=1824, uid=10479 requires android.permission.FOREGROUND_SERVICE
    at android.os.Parcel.createException(Parcel.java:1942)
    at android.os.Parcel.readException(Parcel.java:1910)
    at android.os.Parcel.readException(Parcel.java:1860)
    at android.app.IActivityManager$Stub$Proxy.setServiceForeground(IActivityManager.java:5198)
    at android.app.Service.startForeground(Service.java:695)
    at com.example.app.services.AudioService.setUpMediaNotification(AudioService.java:372)
    at com.example.app.services.AudioService.setUpAndStartAudioFeed(AudioService.java:328)
    at com.example.app.services.AudioService.onStartCommand(AudioService.java:228)
    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3667)
    at android.app.ActivityThread.access$1600(ActivityThread.java:199)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1681)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
 Caused by: android.os.RemoteException: Remote stack trace:
    at com.android.server.am.ActivityManagerService.enforcePermission(ActivityManagerService.java:9186)
    at com.android.server.am.ActiveServices.setServiceForegroundInnerLocked(ActiveServices.java:1189)
    at com.android.server.am.ActiveServices.setServiceForegroundLocked(ActiveServices.java:870)
    at com.android.server.am.ActivityManagerService.setServiceForeground(ActivityManagerService.java:20434)
    at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:976)

Відповіді:


413

Це станеться, якщо ви встановили targetSdkVersion = 28(Android 9 / Pie) або вище та не заявили про використання FOREGROUND_SERVICEдозволу.

З міграційних приміток для Android 9:

Тепер додатки, які хочуть використовувати послуги переднього плану, повинні спочатку запитати дозвіл FOREGROUND_SERVICE. Це звичайний дозвіл, тому система автоматично надає його запитувальній програмі. Запуск послуги переднього плану без дозволу видає SecurityException.

Рішення полягає в тому, щоб просто додати наступне в AndroidManifest.xml:

<manifest ...>
     ...
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     ...
     <application ...>
     ...
</manifest>

8
Чи означає це, що якщо наш targetSdkVersionнижчий за 28, нам не потрібен дозвіл на запуск служб Foreground на пристроях, на яких працює 28?

3
Це звучить як дивне рішення для зниження ціліSdkVersion
Denny

2
@Sjd Вони встановлять просто чудово. Це не так, як це maxSdkVersion.
Рой Солберг

9
Ваша відповідь, але примітки до випуску не є приводом для створення не відсталих сумісних API. У цьому випадку Google міг би попросити користувача дати дозвіл або принаймні надати підказку, а не мовчки розбивати додаток. Останнім часом Android стає дуже важким для обслуговування.
Олег Гриб

2
@miladsalimi Якщо ви відкриєте AndroidManifest.xml в Android Studio, ви можете переглянути "об'єднаний маніфест". Можливо, існує залежність, яка вводить вам використання цього дозволу?
Рой Солберг,

43

Заборона дозволу: startForeground вимагає android.permission.FOREGROUND_SERVICE

Програми, які націлені на Android 9 (рівень API 28) або вище та використовують сервісні програми переднього плану, повинні подати запит на FOREGROUND_SERVICE permission.

Тож тепер нам потрібно додати дозвіл служби Foreground у файл маніфесту

  • він Дозволяє використовувати звичайний додаток Service.startForeground

Зразок

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

FOREGROUND_SERVICE це звичайний дозвіл, тому система автоматично надає програму запиту.

Перевірте це міграційні нотатки Android 9 / Pie

  • Зміна

Дозвіл на службу переднього плану

  • Підсумок

Тепер додатки, які хочуть використовувати послуги переднього плану, повинні спочатку запросити дозвіл FOREGROUND_SERVICE. Це звичайний дозвіл, тому система автоматично надає його запитувальній програмі. Запуск послуги переднього плану без дозволу видає SecurityException.

Також читайте startForeground()

  • API націлювання на додатки Build.VERSION_CODES.Pчи новіші версії повинні вимагати дозволу Manifest.permission.FOREGROUND_SERVICE, щоб використовувати цей API.

Сер, я спробував ур-рішення, але він не працює для мене на всіх Android-пристроях. як в Oppo F11 Pro, його робота працює, але в додатку для телефонів Samsung, Nokia і Mi не працює, і в log.can мені сказати, що я роблю виправити?
Капіль соні

@Kapilsoni `отримав таку ж помилку в журналі`, яка помилка ви отримуєте
Nilesh Rathod

я отримав цю помилку "android.app.RemoteServiceException: Погане повідомлення для startForeground:"
Kapil soni

8

Для рівня API 28 або вище потрібен дозвіл FOREGROUND_SERVICE. В іншому випадку він не може працювати і отримав виняток.

Це буде вирішено додаванням

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

у файлі AndroidManifest.xml


я додав, але не встановлено для мене
Kapil soni

@Kapilsoni та сама проблема для мене, додана, але все-таки виходить з ладу через недостатній дозвіл на API 29, вам вдалося її вирішити?
ArturM

4

targetSdkVersion, Принаймні , 28буде обов'язковим з 1 листопада 2019 роки для оновлення програми в Play Store. Тому вам потрібно змінити цільовий API, а потім попросити дозволу, FOREGROUND_SERVICEщоб уникнути аваріїstartForeground()


0

Зауваживши, що FOREGROUND_SERVICEне потрібна вимога дозволу виконання. лише додайте нижче до Маніфестів

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

вищезазначений рядок слід додати раніше <application

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