Android Qで新しいプライバシーの変更が有効になったため、MediaProjection
apiを使用するすべてのアプリで Android:foregroundServiceType 属性をマニフェストの下のサービスタグ。
しかし、最近、Android:foregroundServiceType="mediaprojection"
スローされたセキュリティ例外があります。誰かが私が間違っていることを知っていますか?
マニフェスト:
<service
Android:name=".services.MediaProjectionService"
Android:enabled="true"
Android:exported="false"
Android:foregroundServiceType="mediaProjection" />
スローされた例外:
Java.lang.RuntimeException: Unable to start service com.package.app.services.MediaProjectionService@6d0fed2 with Intent { act=com.package.app.services.action.startrecording cmp=com.package.app/.services.MediaProjectionService(has extras) }: Java.lang.SecurityException: Media projections require a foreground service of type ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
at Android.app.ActivityThread.handleServiceArgs(ActivityThread.Java:4103)
at Android.app.ActivityThread.access$1800(ActivityThread.Java:219)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1891)
at Android.os.Handler.dispatchMessage(Handler.Java:107)
at Android.os.Looper.loop(Looper.Java:214)
at Android.app.ActivityThread.main(ActivityThread.Java:7343)
at Java.lang.reflect.Method.invoke(Native Method)
at com.Android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.Java:492)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:933)
Caused by: Java.lang.SecurityException: Media projections require a foreground service of type ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION
at Android.os.Parcel.createException(Parcel.Java:2071)
at Android.os.Parcel.readException(Parcel.Java:2039)
at Android.os.Parcel.readException(Parcel.Java:1987)
at Android.media.projection.IMediaProjection$Stub$Proxy.start(IMediaProjection.Java:231)
at Android.media.projection.MediaProjection.<init>(MediaProjection.Java:58)
at Android.media.projection.MediaProjectionManager.getMediaProjection(MediaProjectionManager.Java:104)
at com.package.app.services.MediaProjectionService.startRecording(MediaProjectionService.Java:190)
at com.package.app.services.MediaProjectionService.onStartCommand(MediaProjectionService.Java:142)
at Android.app.ActivityThread.handleServiceArgs(ActivityThread.Java:4085)
at Android.app.ActivityThread.access$1800(ActivityThread.Java:219)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1891)
at Android.os.Handler.dispatchMessage(Handler.Java:107)
at Android.os.Looper.loop(Looper.Java:214)
at Android.app.ActivityThread.main(ActivityThread.Java:7343)
at Java.lang.reflect.Method.invoke(Native Method)
at com.Android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.Java:492)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:933)
Caused by: Android.os.RemoteException: Remote stack trace:
at com.Android.server.media.projection.MediaProjectionManagerService$MediaProjection.start(MediaProjectionManagerService.Java:476)
at Android.media.projection.IMediaProjection$Stub.onTransact(IMediaProjection.Java:135)
at Android.os.Binder.execTransactInternal(Binder.Java:1021)
at Android.os.Binder.execTransact(Binder.Java:994)
PS:これは、Android Q DP5 GSIとターゲットSDK 29で発生します。アプリは、ターゲットSDK 28で変更なしで正常に動作します。
_<uses-permission Android:name="Android.permission.FOREGROUND_SERVICE" />
_に_AndroidManifest.xml
_を追加することを忘れないでください。
[〜#〜]更新[〜#〜]
必ずstartForeground()
を呼び出すようにしてくださいbeforegetMediaProjection()
!
最善の解決策は、条件なしでstartForeground()
からonCreate()
を呼び出し、何らかのデフォルトのメッセージを通知に表示することです。その後、ロジックを実行し、いつでも更新された通知を使用してNotificationManager.notify()
を呼び出すことができます。
以下の属性の変更
Android:foregroundServiceType="mediaProjection"
tools:targetApi="q"
androidManifest.xmlで私のために働いた。
< service
Android:name="SERVICE_NAME"
Android:foregroundServiceType="mediaProjection"
tools:targetApi="q"
Android:enabled="true"
Android:exported="false" />