Android 10 在使用MediaProjectionManager录音的时候报错:

java.lang.SecurityException: Media projections require a foreground service of type ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTION

错误详细信息如下,看了网上很多相关的解决介绍,但是都没有太多的用处要么就是不是太清楚。这里说下解决的几个关键点,希望对大家有所帮助

2021-09-25 20:17:32.007 4032-4032/? E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.demo.audiocapture, PID: 4032java.lang.RuntimeException: Unable to start service com.demo.audiocapture.AudioCaptureService@403e26c with Intent { cmp=com.demo.audiocapture/.AudioCaptureService (has extras) }: java.lang.SecurityException: Media projections require a foreground service of type ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTIONat android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4971)at android.app.ActivityThread.access$3300(ActivityThread.java:260)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2486)at android.os.Handler.dispatchMessage(Handler.java:110)at android.os.Looper.loop(Looper.java:219)at android.app.ActivityThread.main(ActivityThread.java:8668)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109)Caused by: java.lang.SecurityException: Media projections require a foreground service of type ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PROJECTIONat android.os.Parcel.createException(Parcel.java:2090)at android.os.Parcel.readException(Parcel.java:2058)at android.os.Parcel.readException(Parcel.java:2006)at android.media.projection.IMediaProjection$Stub$Proxy.start(IMediaProjection.java:231)at android.media.projection.MediaProjection.<init>(MediaProjection.java:75)at android.media.projection.MediaProjectionManager.getMediaProjection(MediaProjectionManager.java:104)at com.demo.audiocapture.AudioCaptureService.onStartCommand(AudioCaptureService.java:86)at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4951)at android.app.ActivityThread.access$3300(ActivityThread.java:260) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2486) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loop(Looper.java:219) at android.app.ActivityThread.main(ActivityThread.java:8668) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109) Caused by: android.os.RemoteException: Remote stack trace:at com.android.server.media.projection.MediaProjectionManagerService$MediaProjection.start(libmapleservices.so:16625028)at android.media.projection.IMediaProjection$Stub.onTransact(libmapleframework.so:26979796)at android.os.Binder.execTransactInternal(libmapleframework.so:6246476)at android.os.Binder.execTransact(libmapleframework.so:6248272)callee: null 2075/4123

尝试了一下,最终解决。关键点如下(录音的代码不再这里黏贴了): 关键点1我在网上没找到有说明的,或者介绍的也不太清楚,关键点2网上有介绍说明

关键点1:关于通知的调用时机及调用方法

1> NotificationManager 显示通知时,必须要在getMediaProjection方法之前调用

@Overridepublic void onCreate() {super.onCreate();}@Overridepublic IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.throw new UnsupportedOperationException("Not yet implemented");}@RequiresApi(api = Build.VERSION_CODES.Q)@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {resultCode = intent.getIntExtra("resultCode", -1);resultData = intent.getParcelableExtra("data");Log.i(TAG, "onStartCommand: " + resultCode);Log.i(TAG, "onStartCommand: " + resultData);notification();//通知显示可以写到onCreate中。不管是写到onCreate里面还是onStartCommand中,都要写到getMediaProjection方法调用之前mediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);mediaProjection = mediaProjectionManager.getMediaProjection(resultCode, resultData);//必须在通知显示之后调用Log.i(TAG, "onStartCommand: " + mediaProjection);AudioPlaybackCaptureConfiguration.Builder builder = new AudioPlaybackCaptureConfiguration.Builder(mediaProjection);builder.addMatchingUsage(AudioAttributes.USAGE_MEDIA);//多媒体builder.addMatchingUsage(AudioAttributes.USAGE_ALARM);//闹铃builder.addMatchingUsage(AudioAttributes.USAGE_GAME);//游戏audioPlaybackCaptureConfiguration = builder.build();generateAudioRecord();return super.onStartCommand(intent, flags, startId);}

2> 必须使用 startForeground(NOTIFICATION_ID, notification) 显示通知,不能使用notificationManager.notify(NOTIFICATION_ID, notification);

public void notification() {Log.i(TAG, "notification: " + Build.VERSION.SDK_INT);if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//Call Start foreground with notificationIntent notificationIntent = new Intent(this, AudioCaptureService.class);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID).setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher_foreground)).setSmallIcon(R.drawable.ic_launcher_foreground).setContentTitle("Starting Service").setContentText("Starting monitoring service").setTicker(NOTIFICATION_TICKER).setContentIntent(pendingIntent);Notification notification = notificationBuilder.build();NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);channel.setDescription(NOTIFICATION_CHANNEL_DESC);NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);notificationManager.createNotificationChannel(channel);//notificationManager.notify(NOTIFICATION_ID, notification);startForeground(NOTIFICATION_ID, notification); //必须使用此方法显示通知,不能使用notificationManager.notify,否则还是会报上面的错误}}

关键点2 权限

<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />

关键点3 service配置

清单文件(即AndroidManifest.xml)中配置服务的时候,需要加上 android:foregroundServiceType=“mediaProjection”

<serviceandroid:name=".AudioCaptureService"android:enabled="true"android:exported="true"android:foregroundServiceType="mediaProjection"/>

代码git地址

参考
https://stackoverflow.com/questions/62004735/media-projections-require-a-foreground-service-of-type-serviceinfo-foreground-se
Android notification 适配不同版本
https://developer.android.google.cn/reference/kotlin/android/media/AudioPlaybackCaptureConfiguration
Android require a foreground service of type ServiceInfo.FOREGROUND_SERVICE
MediaProjections in Android Q(Media projections require a foreground service)
AudioPlaybackCapture(Android 10)无法正常工作并录制空声音

Android 10 Media projections require a foreground service of type ServiceInfo.FOREGROUND_SERVICE_TY相关推荐

  1. Android 录屏录制功能:require a foreground service of type ServiceInfo.FOREGROUND_SERVICE

    android 10.0录制屏幕报错. Media projections require a foreground service of type ServiceInfo.FOREGROUND_SE ...

  2. Android require a foreground service of type ServiceInfo.FOREGROUND_SERVICE

    android 10.0录制屏幕报错. Media projections require a foreground service of type ServiceInfo.FOREGROUND_SE ...

  3. Android Foreground Service (前台服务)-by:nixs

    一.如何保活后台服务 在Android Services (后台服务) 里面,我们了解了Android四大组件之一的Service,知道如何使用后台服务进行来完成一些特定的任务.但是后台服务在系统内存 ...

  4. 邊實驗邊分析 - Android Foreground Service的使用

    邊實驗邊分析 - Android Foreground Service的使用 一.簡述 二.Android LowMemoryKiller 介紹 三.startService方法的調用行爲測試 給Se ...

  5. android Foreground Service 前台服务/notification全局通知

    android Foreground Service 前台服务/notification全局通知 前言 要素简介 前台服务(Foreground Service) 全局通知(notification) ...

  6. Android Foreground Service

    为了防止后台服务被系统干掉,我们需要将服务提升为前台服务. 示例代码: 需要在AndroidManifest 添加 前台服务的权限 : <uses-permission android:name ...

  7. 【Android 10 源码】MediaRecorder 录像流程:MediaRecorder 配置

    MediaRecorder 录像配置主要涉及输出文件路径.音频来源.视频来源.输出格式.音频编码格式.视频编码格式.比特率.帧率和视频尺寸等. 我们假设视频输入源来自 Camera,Camera2 A ...

  8. Android 10.0 PackageManagerService(一)工作原理及启动流程-[Android取经之路]

    摘要:PackageManagerService是Android系统核心服务之一,在Android中的非常重要,主要负责APK.jar包等的管理. 阅读本文大约需要花费50分钟. 文章的内容主要还是从 ...

  9. Android 10.0 系统服务之ActivityMnagerService-AMS启动流程-[Android取经之路]

    摘要:上一节我们讲完了SystemServer的启动过程,这一节接着上一节的步骤,来讲解ActivityManagerService的启动过程. ActivityManagerService简称AMS ...

最新文章

  1. npm包开发测试与发布
  2. Excel如何批量将表中的0替换成空值?同时不能影响正常数字中包含的0
  3. 筛数方法相关系数_相关系数怎么计算
  4. 038_Steps步骤条
  5. 洛谷P2866 [USACO06NOV]糟糕的一天Bad Hair Day(单调栈)
  6. mysql 查询不为0的数据_查询数据库中所有记录总数不为0的数据表名称
  7. java ee自学路线
  8. 用JAVA制作小游戏——推箱子(一)
  9. 厦门高桔科技有限公司
  10. java对谷歌不兼容_谷歌浏览器不兼容的一些Js
  11. Excel键盘快捷键大全(二)
  12. 快速原型工具,帮你从0开始画原型图
  13. 一网打尽Mac上的高效工具 - 效率工作篇(附演示视频)
  14. VMware Workstation虚拟机装Win7详细高清图文教程
  15. 一步一步实现中后台管理平台模板-08-登录页和用户信息保存
  16. unity shader 边缘光,内发光,外发光,轮廓边缘光,轮廓内边缘光,轮廓外边缘光
  17. libuv编译Linux,OS X下 Android NDK 编译 libuv
  18. Java猿社区—Redis一篇系列—第三章、Redis数据类型
  19. 第三方风控的窘境:赚钱不易,生存更难
  20. SAP甲方历程回顾-01 2017年转到甲方的故事~从乙方离职

热门文章

  1. Android byte与16进制相互转换
  2. acl审计软件_如何评价审计软件idea?
  3. 计算机音乐广东爱情故事,广东爱情故事(原版伴奏)
  4. 每周一书-《做自己-鬼脚七自媒体第一季》
  5. 使用c/c++实现SLR(1)语法分析器
  6. c-简单的模拟餐厅管理系统(说明文档)
  7. 基于ARM7的嵌入式智能家居系统---系统的图形驱动与界面设计
  8. C#获取指定文件夹下所有文件夹名称
  9. .txt文件转换到Excel
  10. WD Drive Unlock : 您必須從您要解除的磁碟相關的WD Drive Unlock CD 執行WD Drive Unlock 解除鎖定