Permission Denial: startForeground requires android.permission.FOREGROUND_SERVICE

AndroidAndroid ServiceAndroid Permissions

Android 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 permission Manifest.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()

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRoy SolbergView Question on Stackoverflow
Solution 1 - AndroidRoy SolbergView Answer on Stackoverflow
Solution 2 - AndroidAskNileshView Answer on Stackoverflow
Solution 3 - Androidصلي علي محمد Atef FaroukView Answer on Stackoverflow
Solution 4 - AndroidZamanView Answer on Stackoverflow
Solution 5 - AndroidHermano MclintockView Answer on Stackoverflow