web-dev-qa-db-ja.com

許可拒否:startForegroundはAndroid.permission.FOREGROUND_SERVICEを必要とします

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

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

これは、リリースノートを正しく読んでいないことに対するものです。これはtargetSdkVersion = 28(Android 9/Pie)を設定するときに起こり始めました。 移行上の注意事項

フォアグラウンドサービスを使用したいアプリケーションは、最初にFOREGROUND_SERVICE許可を要求する必要があります。これは通常の許可なので、システムは自動的にそれを要求側アプリケーションに付与します。許可なしにフォアグラウンドサービスを開始すると、SecurityExceptionがスローされます。

だから 解決策はAndroidManifest.xmlに以下を追加することです:

<manifest ...>
     ...
     <uses-permission Android:name="Android.permission.FOREGROUND_SERVICE" />
     ...
     <application ...>
     ...
</manifest>
176
Roy Solberg

許可拒否:startForegroundはAndroid.permission.FOREGROUND_SERVICEを必要とします

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

そのため、マニフェストファイルに Foreground serviceパーミッション を追加する必要があります。

  • 通常のアプリケーションでService.startForegroundの使用を許可します

_ sample _

<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を要求する必要があります。
18
Nilesh Rathod