Отказ в разрешении: startForeground требует android.permission.FOREGROUND_SERVICE

В последнее время мы неожиданно наблюдаем несколько из следующих трассировок стека. Почему это могло быть? Это происходит из-за того, что приложение пытается переместить службу аудиокомментариев на передний план с мультимедийным уведомлением и всем остальным.

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)
232
0
92 362
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

Из примечания к миграции для Android 9:

Apps wanting to use foreground services must now request the FOREGROUND_SERVICE permission first. This is a normal permission, so the system automatically grants it to the requesting app. Starting a foreground service without the permission throws a SecurityException.

Решение состоит в том, чтобы просто добавить в AndroidManifest.xml следующее:

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

Означает ли это, что если наш targetSdkVersion ниже 28, нам не нужно никаких разрешений для запуска служб переднего плана на устройствах, на которых работает 28?

user6274128 27.09.2018 09:39

Для меня это звучит странно: снизить targetSdkVersion

Denny 18.11.2018 16:17

@Volleyball: ваше приложение не будет устанавливаться на устройствах под управлением 28, если значение targetSdkVersion ниже 28

Sjd 19.02.2019 14:34

@Sjd Они установятся нормально. Не то чтобы это maxSdkVersion.

Roy Solberg 19.02.2019 15:45

@Sjd Рой прав, приложение установится без проблем, однако мы не сможем использовать новые вещи, добавленные в API 28.

user6274128 23.02.2019 15:05

Проголосуйте за ваш ответ, но примечания к выпуску не являются оправданием для создания API, не поддерживающих обратную совместимость. В этом случае Google мог бы попросить пользователя дать разрешение или, по крайней мере, дать подсказку вместо того, чтобы молча вывести приложение из строя. В последнее время становится очень сложно поддерживать Android.

Oleg Gryb 26.05.2019 18:34

В одном приложении с sdkVersion 28, которое я разработал, это разрешение не требуется, а в другом приложении, которое я разработал, требуется это разрешение, это странно, @RoySolberg

milad salimi 25.06.2019 09:14

@miladsalimi Если вы открываете AndroidManifest.xml в Android Studio, вы можете выбрать «объединенный манифест». Может быть, есть зависимость, которая вводит это разрешение для вас?

Roy Solberg 25.06.2019 12:35

@RoySolberg, о да, как ты его нашел? : D, отлично

milad salimi 25.06.2019 12:50

«Это то, что вы получаете, если неправильно читаете примечания к выпуску». Вероятно, есть более вежливый / дружелюбный способ передать это сообщение.

Patrick Favre 06.10.2019 20:56

@patrickf Я согласен, но обратите внимание, как я сам отвечаю на свой вопрос. Я просто немного себя наказывал за то, что обновил приложение до Android 9 и не заметил этого раньше. :)

Roy Solberg 07.10.2019 06:28

@RoySolberg ах, конечно, я это пропустил :) Может, пора быть немного лучше к себе, я уверен, что у тебя все хорошо :)

Patrick Favre 07.10.2019 20:19

Они также будут нормально работать на устройствах младше 28 лет без изменений, необходимых для работы на устройствах 28 и выше. Однако, если targetSdk меньше 28, они все равно будут работать на устройствах 28 и более поздних версий. Google должен определить систему, в которой не требуются определенные цели, но в системе также есть так много хаков, которые изменяют поведение приложения на основе целевого SDK, что им трудно вернуться.

Lassi Kinnunen 05.02.2020 16:08

Permission Denial: startForeground requires android.permission.FOREGROUND_SERVICE

Приложения, предназначенные для Android 9 (уровень API 28) или выше и использующие службы переднего плана, должны запрашивать FOREGROUND_SERVICE permission.

Итак, теперь нам нужно добавить Разрешение службы переднего плана в файл манифеста

  • Позволяет обычному приложению использовать Service.startForeground

ОБРАЗЕЦ

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

FOREGROUND_SERVICE is a normal permission, so the system automatically grants it to the requesting app.

Проверьте это примечания по миграции Android 9 / Pie

  • Изменять

Foreground service permission

  • Резюме

Apps wanting to use foreground services must now request the FOREGROUND_SERVICE permission first. This is a normal permission, so the system automatically grants it to the requesting app. Starting a foreground service without the permission throws a SecurityException.

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

  • Приложения, предназначенные для API Build.VERSION_CODES.P или более поздней версии, должны запрашивать разрешение Manifest.permission.FOREGROUND_SERVICE, чтобы использовать этот API.

Сэр, я попробовал решение ur, но оно не работает для меня для всех устройств Android. например, в Oppo F11 Pro он работает, но в приложении Samsung, Nokia и Mi phone происходит сбой и такая же ошибка в журнале. вы можете сказать мне, что я делаю для исправить?

Kapil707 22.02.2020 16:03

@Kapilsoni `получил ту же ошибку в журнале` какую ошибку вы получаете

AskNilesh 24.02.2020 05:26

я получил эту ошибку "android.app.RemoteServiceException: плохое уведомление для startForeground:"

Kapil707 24.02.2020 08:05

@Kapilsoni Я знаю, что это старый пост, но вы пробовали переустановить ...? Иногда переустановка устраняет проблему, например изменение важности канала уведомлений.

Samuel T. Chou 13.08.2020 11:21

Для уровня API 28 или выше требуется разрешение FOREGROUND_SERVICE. В противном случае он не может работать и возникнет исключительная ситуация.

Решится добавлением

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

в файле AndroidManifest.xml.

я добавил, но не исправил для меня

Kapil707 21.02.2020 14:26

@Kapilsoni такая же проблема для меня, добавлена, но все еще вылетает из-за недостаточного разрешения на API 29, вам удалось ее решить?

ArturM 05.04.2020 13:43

targetSdkVersion не ниже 28 станет обязательным с 1 ноября 2019 года для обновлений приложений в Play Store. Поэтому вам нужно изменить целевой API, а затем запросить разрешение FOREGROUND_SERVICE, чтобы избежать сбоя на startForeground().

Отметим, что FOREGROUND_SERVICE не требует разрешения на выполнение. только добавьте ниже в манифесты

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

указанная выше строка должна быть добавлена ​​перед <application

Другие вопросы по теме