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

标签 android android-mediaprojection android-10.0

随着 Android Q 生效的新隐私变更,现在任何使用 MediaProjection API 的应用都必须指定 android:foregroundServiceType list 下服务标记中的属性。

但最近,我注意到虽然我设置了android:foregroundServiceType="mediaprojection",但还是抛出了安全异常。有人知道我做错了什么吗?

list :

<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 上运行良好,无需任何更改。

最佳答案

别忘了添加权限<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />进入AndroidManifest.xml

更新

请务必调用 startForeground() 之前 getMediaProjection() !

最好的解决办法是调用startForeground()来自onCreate()没有任何条件,在通知中显示某种默认消息。然后你可以执行你的逻辑并调用NotificationManager.notify()随时更新通知。

关于android - android Q 中无法识别 MediaProjection 服务类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57026489/

相关文章:

android - 调用 System.loadLibrary 时未调用 onJNILoad

android - 为什么 OpenGL-ES 调整大小后的图像看起来像素化?

Android Studio 构建调试 apk 但不在设备上部署/运行

android - 截取的屏幕截图周围有黑边

android - Android Q 中引入的 ACCESS_BACKGROUND_LOCATION 如何影响 Geofence API?

android-sqlite - Android Q 中 ContentResolver 查询中的 "GROUP BY"替换(Android 10、API 29 更改)

android - 通话记录器在 android 10 (Q) 中不起作用

java - 如何修复我的音频? (优先)

android - 在 MediaProjection 中完全隐藏安全 View - android

java - 媒体投影需要 Android Pie 和 Q 中 ServiceInfo.FOREGROUND_SERVICE TYPE_MEDIA_PROJECTION 类型的前台服务