Verweigerung der Berechtigung: startForeground erfordert android.permission.FOREGROUND_SERVICE

193

In letzter Zeit haben wir plötzlich einige der folgenden Stapelspuren gesehen. Warum könnte das sein? Dies ist der Zeitpunkt, an dem die App versucht, einen Audiokommentar-Dienst mit einer Medienbenachrichtigung und allem in den Vordergrund zu rücken.

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)
Roy Solberg
quelle

Antworten:

411

Dies geschieht, wenn Sie targetSdkVersion = 28(Android 9 / Pie) oder höher eingestellt und die Verwendung der FOREGROUND_SERVICEBerechtigung nicht deklariert haben .

Aus den Migrationshinweisen für Android 9:

Apps, die Vordergrunddienste verwenden möchten, müssen jetzt zuerst die Berechtigung FOREGROUND_SERVICE anfordern. Dies ist eine normale Berechtigung, daher erteilt das System sie der anfordernden App automatisch. Das Starten eines Vordergrunddienstes ohne die Berechtigung löst eine SecurityException aus.

Die Lösung besteht darin, Folgendes hinzuzufügen AndroidManifest.xml:

<manifest ...>
     ...
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     ...
     <application ...>
     ...
</manifest>
Roy Solberg
quelle
8
Bedeutet das, dass wir, wenn unser targetSdkVersionWert unter 28 liegt, keine Berechtigung zum Ausführen der Vordergrunddienste auf Geräten mit 28 benötigen?
3
Das klingt für mich nach einer seltsamen Lösung, um die targetSdkVersion
Denny
2
@Sjd Sie werden gut installiert. Es ist nicht so wie es ist maxSdkVersion.
Roy Solberg
9
Das Up-Voting Ihrer Antwort, aber Versionshinweise sind keine Entschuldigung für die Erstellung nicht abwärtskompatibler APIs. In diesem Fall hätte Google einen Nutzer bitten können, die Erlaubnis zu erteilen oder zumindest einen Hinweis zu geben, anstatt die App stillschweigend zum Absturz zu bringen. Android wird in letzter Zeit sehr schwer zu warten.
Oleg Gryb
2
@miladsalimi Wenn Sie AndroidManifest.xml in Android Studio öffnen, können Sie das "zusammengeführte Manifest" anzeigen. Vielleicht gibt es eine Abhängigkeit, die Ihnen diese Berechtigungsnutzung einbringt?
Roy Solberg
43

Verweigerung der Berechtigung: startForeground erfordert android.permission.FOREGROUND_SERVICE

Apps, die auf Android 9 (API-Stufe 28) oder höher abzielen und Vordergrunddienste verwenden, müssen die anfordern FOREGROUND_SERVICE permission.

Jetzt müssen wir die Berechtigung für den Vordergrunddienst in die Manifestdatei einfügen

  • Es ermöglicht die Verwendung einer regulären Anwendung Service.startForeground

STICHPROBE

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

FOREGROUND_SERVICE ist eine normale Berechtigung, daher gewährt das System sie automatisch der anfordernden App.

Überprüfen Sie die Migrationshinweise von Android 9 / Pie

  • Veränderung

Vordergrunddienstberechtigung

  • Zusammenfassung

Apps, die Vordergrunddienste verwenden möchten, müssen jetzt zuerst die Berechtigung FOREGROUND_SERVICE anfordern. Dies ist eine normale Berechtigung, daher erteilt das System sie der anfordernden App automatisch. Das Starten eines Vordergrunddienstes ohne die Berechtigung löst eine SecurityException aus.

Lesen Sie auch startForeground()

  • Apps, die auf die API Build.VERSION_CODES.Poder höher abzielen, müssen die Berechtigung anfordern Manifest.permission.FOREGROUND_SERVICE, um diese API verwenden zu können.
Nilesh Rathod
quelle
Sir, ich habe versucht, Ihre Lösung, aber es funktioniert nicht für mich für alle Android-Geräte. Wie in Oppo F11 Pro funktioniert es, aber in der Samsung, Nokia und Mi Telefon App ist abgestürzt und hat den gleichen Fehler im Protokoll. Kannst du mir sagen, was ich tun soll Fix?
Kapil soni
@Kapilsoni `hat den gleichen Fehler im Protokoll`, welchen Fehler Sie bekommen
Nilesh Rathod
Ich habe diesen Fehler "android.app.RemoteServiceException: Ungültige Benachrichtigung für startForeground:"
Kapil soni
8

Für API-Level 28 oder höher ist die Berechtigung FOREGROUND_SERVICE erforderlich. Andernfalls kann es nicht ausgeführt werden und hat eine Ausnahme erhalten.

Es wird durch Hinzufügen gelöst

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

in der Datei AndroidManifest.xml.

Zaman
quelle
Ich habe hinzugefügt, aber nicht für mich behoben
Kapil Soni
@Kapilsoni das gleiche Problem für mich, hinzugefügt, aber immer noch abstürzt aufgrund unzureichender Berechtigung für API 29, haben Sie es geschafft, es zu lösen?
ArturM
4

Eine targetSdkVersionvon mindestens 28ist ab dem 1. November 2019 für App-Updates im Play Store obligatorisch. Sie müssen also die Ziel-API ändern und dann die Berechtigung anfordern FOREGROUND_SERVICE, um den Absturz zu vermeidenstartForeground()

Hermano Mclintock
quelle