В последнее время мы неожиданно наблюдаем несколько из следующих трассировок стека. Почему это могло быть? Это происходит из-за того, что приложение пытается переместить службу аудиокомментариев на передний план с мультимедийным уведомлением и всем остальным.
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)
Это произойдет, если вы установили 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
@Volleyball: ваше приложение не будет устанавливаться на устройствах под управлением 28, если значение targetSdkVersion ниже 28
@Sjd Они установятся нормально. Не то чтобы это maxSdkVersion.
@Sjd Рой прав, приложение установится без проблем, однако мы не сможем использовать новые вещи, добавленные в API 28.
Проголосуйте за ваш ответ, но примечания к выпуску не являются оправданием для создания API, не поддерживающих обратную совместимость. В этом случае Google мог бы попросить пользователя дать разрешение или, по крайней мере, дать подсказку вместо того, чтобы молча вывести приложение из строя. В последнее время становится очень сложно поддерживать Android.
В одном приложении с sdkVersion 28, которое я разработал, это разрешение не требуется, а в другом приложении, которое я разработал, требуется это разрешение, это странно, @RoySolberg
@miladsalimi Если вы открываете AndroidManifest.xml в Android Studio, вы можете выбрать «объединенный манифест». Может быть, есть зависимость, которая вводит это разрешение для вас?
@RoySolberg, о да, как ты его нашел? : D, отлично
«Это то, что вы получаете, если неправильно читаете примечания к выпуску». Вероятно, есть более вежливый / дружелюбный способ передать это сообщение.
@patrickf Я согласен, но обратите внимание, как я сам отвечаю на свой вопрос. Я просто немного себя наказывал за то, что обновил приложение до Android 9 и не заметил этого раньше. :)
@RoySolberg ах, конечно, я это пропустил :) Может, пора быть немного лучше к себе, я уверен, что у тебя все хорошо :)
Они также будут нормально работать на устройствах младше 28 лет без изменений, необходимых для работы на устройствах 28 и выше. Однако, если targetSdk меньше 28, они все равно будут работать на устройствах 28 и более поздних версий. Google должен определить систему, в которой не требуются определенные цели, но в системе также есть так много хаков, которые изменяют поведение приложения на основе целевого SDK, что им трудно вернуться.
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_SERVICEis 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()
Build.VERSION_CODES.P или более поздней версии, должны запрашивать разрешение Manifest.permission.FOREGROUND_SERVICE, чтобы использовать этот API.Сэр, я попробовал решение ur, но оно не работает для меня для всех устройств Android. например, в Oppo F11 Pro он работает, но в приложении Samsung, Nokia и Mi phone происходит сбой и такая же ошибка в журнале. вы можете сказать мне, что я делаю для исправить?
@Kapilsoni `получил ту же ошибку в журнале` какую ошибку вы получаете
я получил эту ошибку "android.app.RemoteServiceException: плохое уведомление для startForeground:"
@Kapilsoni Я знаю, что это старый пост, но вы пробовали переустановить ...? Иногда переустановка устраняет проблему, например изменение важности канала уведомлений.
Для уровня API 28 или выше требуется разрешение FOREGROUND_SERVICE. В противном случае он не может работать и возникнет исключительная ситуация.
Решится добавлением
<uses-permission android:name = "android.permission.FOREGROUND_SERVICE" />
в файле AndroidManifest.xml.
я добавил, но не исправил для меня
@Kapilsoni такая же проблема для меня, добавлена, но все еще вылетает из-за недостаточного разрешения на API 29, вам удалось ее решить?
targetSdkVersion не ниже 28 станет обязательным с 1 ноября 2019 года для обновлений приложений в Play Store. Поэтому вам нужно изменить целевой API, а затем запросить разрешение FOREGROUND_SERVICE, чтобы избежать сбоя на startForeground().
Отметим, что FOREGROUND_SERVICE не требует разрешения на выполнение. только добавьте ниже в манифесты
<uses-permission android:name = "android.permission.FOREGROUND_SERVICE" />
указанная выше строка должна быть добавлена перед <application
Означает ли это, что если наш
targetSdkVersionниже 28, нам не нужно никаких разрешений для запуска служб переднего плана на устройствах, на которых работает 28?