web-dev-qa-db-ja.com

MediaProjectionサービスタイプがAndroid Qで認識されません

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で変更なしで正常に動作します。

6
Vijai

_<uses-permission Android:name="Android.permission.FOREGROUND_SERVICE" />_に_AndroidManifest.xml_を追加することを忘れないでください。

[〜#〜]更新[〜#〜]

必ずstartForeground()を呼び出すようにしてくださいbeforegetMediaProjection()

最善の解決策は、条件なしでstartForeground()からonCreate()を呼び出し、何らかのデフォルトのメッセージを通知に表示することです。その後、ロジックを実行し、いつでも更新された通知を使用してNotificationManager.notify()を呼び出すことができます。

1
Oleksii K.

以下の属性の変更

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" />
1
Divyang M