android Q中无法识别MediaProjection服务类型

Posted

技术标签:

【中文标题】android Q中无法识别MediaProjection服务类型【英文标题】:MediaProjection service type not recognized in android Q 【发布时间】:2019-11-23 08:58:22 【问题描述】:

随着新的隐私更改对 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)

P.S:这是在带有目标 SDK 29 的 Android Q DP5 GSI 上体验到的。该应用在目标 SDK 28 上运行良好,无需任何更改。

【问题讨论】:

您需要将其作为前台服务 (Media projections require a foreground service of type ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION)。拥有foregroundServiceType 是其中的一部分,但该服务是否是运行时的前台服务(通过startForeground())? 服务以startForeground(ID, Notification) 启动,我确实尝试了新的startForeground(ID, Notification, ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION) 方法。无论服务类型是在清单中设置还是在startForeground 方法中设置,结果都是一样的。如果我将 compileSDK 设置为 28,一切正常 compileSdkVersion 应该不会产生影响。 targetSdkVersion 可能。 我的错,这就是我的意思。但无论如何 targetSdkVersioncompileSdkVersion 都设置为 28 工作正常 【参考方案1】:

你不会忘记在AndroidManifest.xml 中添加权限&lt;uses-permission android:name="android.permission.FOREGROUND_SERVICE" /&gt; 吗?

更新

确保您致电startForeground() 之前 getMediaProjection()

最好的解决方案是在没有任何条件的情况下从onCreate() 调用startForeground(),在通知中显示某种默认消息。然后,您可以随时执行您的逻辑并致电NotificationManager.notify() 并提供更新通知。

【讨论】:

当然添加了。将目标 sdk 降级到 28 时,该应用运行良好 看看我的更新,我刚查过,调用的顺序很重要。 你能帮我***.com/questions/63543414/…【参考方案2】:

更改以下属性

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" />

【讨论】:

在将 添加到 AndroidManifest 并在调用 MediaProjection 之前将服务设置为前台服务之后,这对我也有用。

以上是关于android Q中无法识别MediaProjection服务类型的主要内容,如果未能解决你的问题,请参考以下文章

android studio中无法识别视频文件

Flutter小记1AndroidStudio 中无法识别iPhone/Android真机解决方案

Flutter小记1AndroidStudio 中无法识别iPhone/Android真机解决方案

为啥我的 Android 应用程序无法识别 drawables 目录的子目录中的 PNG? [复制]

Xamarin.Android 无法在 Android 10 (Q) 中将录制的自定义声音用于推送通知

Android USB 有时无法识别