Отказ в разрешении: 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
Это звучит как странное решение для меня, чтобы снизить targetSdkVersion
Денни
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 происходит сбой и в журнале появляется та же ошибка. Можете ли вы сказать мне, что я делаю для исправить?
Капил Сони
@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

Атеф Фарук
источник