Permission Denial: startForeground requires android.permission.FOREGROUND_SERVICE
AndroidAndroid ServiceAndroid PermissionsAndroid Problem Overview
Lately we have suddenly been seeing a few of the following stack traces. Why could that be? This is from when the app tries to move an audio commentary service into the foreground with a media notification and everything.
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)
Android Solutions
Solution 1 - Android
This will happen if you have set targetSdkVersion = 28
(Android 9 / Pie) or above and have not declared the usage of the FOREGROUND_SERVICE
permission.
From the migration notes for 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.
The solution is to just add the following in AndroidManifest.xml
:
<manifest ...>
...
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
...
<application ...>
...
</manifest>
Solution 2 - Android
>Permission Denial: startForeground requires android.permission.FOREGROUND_SERVICE
Apps that target Android 9 (API level 28) or higher and use foreground services must request the FOREGROUND_SERVICE permission
.
So now we need to add Foreground service permission in manifest file
- it Allows a regular application to use
Service.startForeground
SAMPLE
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
>### FOREGROUND_SERVICE
is a normal permission, so the system automatically grants it to the requesting app.
Check this the migration notes of Android 9 / Pie
- Change
>Foreground service permission
- Summary
>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.
Also Read startForeground()
-
Apps targeting API
Build.VERSION_CODES.P
or later must request the permissionManifest.permission.FOREGROUND_SERVICE
in order to use this API.
Solution 3 - Android
Noting that FOREGROUND_SERVICE
doesn't require runtime permission requirement. only add below to Manifests
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
the above line should be added before <application
Solution 4 - Android
For API level 28 or higher, it requires FOREGROUND_SERVICE permission. Otherwise, it can not run and got an exception.
It will be solved by adding
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
in AndroidManifest.xml file.
Solution 5 - Android
A targetSdkVersion
of at least 28
will be mandatory from Nov 1 2019 for app updates in the Play Store. So you'll need to change the target API, and then request the permission FOREGROUND_SERVICE
to avoid the crash on startForeground()