権限の拒否:startForegroundにはandroid.permission.FOREGROUND_SERVICEが必要です


193

最近、次のスタックトレースのいくつかが突然見られました。それはなぜでしょうか?これは、アプリがメディア通知とすべてを使用してオーディオ解説サービスをフォアグラウンドに移動しようとしたときからのものです。

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)

回答:


411

あなたが設定している場合に発生しますtargetSdkVersion = 28(アンドロイド9 /パイ)以上との使用宣言されていないFOREGROUND_SERVICE許可を。

Android 9の移行に関するメモから:

フォアグラウンドサービスを使用するアプリは、まずFOREGROUND_SERVICE権限をリクエストする必要があります。これは通常の権限であるため、システムはリクエストしているアプリに自動的に付与します。アクセス許可なしでフォアグラウンドサービスを開始すると、SecurityExceptionがスローされます。

解決策は、次のものを単に追加することですAndroidManifest.xml

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

8
私たちがあればそれはどういう意味targetSdkVersion28未満である、我々は28を実行しているデバイスにフォアグラウンドサービスを実行するための任意の許可を必要としませんか?

3
これは、targetSdkVersionを下げるという奇妙な解決策のように思えます
Denny

2
@Sjd彼らはうまくインストールされます。それはそうではありませんmaxSdkVersion
Roy Solberg、

9
回答に賛成票を投じますが、リリースノートは、下位互換性のないAPIを作成するための言い訳にはなりません。この場合、Googleはユーザーにアプリをサイレントクラッシュさせるのではなく、許可を与えるか、少なくともヒントを提供するように要求することができます。最近、Androidのメンテナンスが非常に難しくなっています。
Oleg Gryb

2
@miladsalimi AndroidManifest.xmlをAndroid Studioで開くと、「マージされたマニフェスト」の表示を選択できます。多分あなたのためにその許可の使用を注入する依存関係がありますか?
Roy Solberg、

43

権限の拒否:startForegroundにはandroid.permission.FOREGROUND_SERVICEが必要です

Android 9(APIレベル28)以上を対象とし、フォアグラウンドサービスを使用するアプリは、をリクエストする必要がありますFOREGROUND_SERVICE permission

したがって、マニフェストファイルにフォアグラウンドサービスのアクセス許可を追加する必要があります

  • 通常のアプリケーションが使用できるようにします Service.startForeground

サンプル

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

FOREGROUND_SERVICE は通常の権限であるため、システムはリクエストしているアプリにそれを自動的に付与します。

Android 9 / Pieの移行に関する注意事項を確認してください

  • 変化する

フォアグラウンドサービス許可

  • 概要

フォアグラウンドサービスを使用するアプリは、まずFOREGROUND_SERVICE権限をリクエストする必要があります。これは通常の権限であるため、システムはリクエストしているアプリに自動的に付与します。アクセス許可なしでフォアグラウンドサービスを開始すると、SecurityExceptionがスローされます。

また読む startForeground()

  • このAPIを使用するには、API Build.VERSION_CODES.P以降をターゲットとするアプリが権限Manifest.permission.FOREGROUND_SERVICEをリクエストする必要があります。

私はあなたの解決策を試しましたが、すべてのAndroidデバイスで機能しません.Oppo F11 Proのように機能しますが、Samsung、Nokia、Miの電話アプリではクラッシュし、logで同じエラーが発生します。修正?
Kapil soni

@Kapilsoni `ログに同じエラーが発生しました`発生しているエラー
Nilesh Rathod

このエラーが発生しました "android.app.RemoteServiceException:Bad notification for startForeground:"
Kapil

8

APIレベル28以上の場合、FOREGROUND_SERVICE権限が必要です。そうしないと、実行できず、例外が発生します。

追加することで解決します

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

AndroidManifest.xmlファイル内。


追加しましたが、修正しませんでした
Kapil soni

@Kapilsoni同じ問題が追加されましたが、API 29の不十分な権限が原因で依然としてクラッシュしますが、どうにか解決しましたか?
ArturM

4

Playストアでのアプリの更新には、targetSdkVersion少なくとものA が282019年11月1日から必須になります。したがって、ターゲットAPIを変更してFOREGROUND_SERVICEから、クラッシュを回避するための権限をリクエストする必要がありますstartForeground()

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.