前言

现在越来越多的视频类APP,如抖音、快手、B站等等,都开放了音频捕获配置,也就是android:allowAudioPlaybackCapture="true"。因此学习如何捕获音频实现声音内录,是很有必要的。

第一步:设置allowAudioPlaybackCapture

很简单,在项目AndroidManifest.xml的application中增加一句android:allowAudioPlaybackCapture="true"

第二步:配置Service

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

注意:本文只适用在Android Q及以上版本,因此必须使用前台服务方式startForegroundService()来启动服务。

请在Service的onCreate()中实现前台服务通知。

第三步:开始使用录制或投射内容

1.向用户询问是否开始使用录制或投射内容,注意:在Activity或Fragment中询问。

    if (currentResultCode != Activity.RESULT_OK || resultData == null) {MediaProjectionManager mediaProjectionManager= (MediaProjectionManager) this.getSystemService(MEDIA_PROJECTION_SERVICE);Intent screenCaptureIntent = mediaProjectionManager.createScreenCaptureIntent();startActivityForResult(screenCaptureIntent, REQUEST_SCREEN_CAPTURE_CODE);return;}

2.在onActivityResult()中获取currentResultCode和resultData

    @Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_SCREEN_CAPTURE_CODE) {currentResultCode = resultCode;resultData = data;}}

3.将currentResultCode和resultData传递给Service

    Intent intent = new Intent(this, RecordService.class);intent.putExtra("resultData", resultData);intent.putExtra("resultCode", currentResultCode);startForegroundService(intent);

4.在Service的onStartCommand()中接收currentResultCode和resultData,获取MediaProjection实例(实例化要在前台Service中进行,这就是为什么要用Service的原因),并配置和启动AudioRecord

    @Overridepublic int onStartCommand(Intent intent, int flags, int startId) {int currentResultCode = intent.getIntExtra("resultCode", 0);Intent resultData = intent.getParcelableExtra("resultData");minBufferSize = AudioRecord.getMinBufferSize(16000,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);MediaProjectionManager mediaProjectionManager = (MediaProjectionManager) getBaseContext().getSystemService(MEDIA_PROJECTION_SERVICE);MediaProjection mediaProjection = mediaProjectionManager.getMediaProjection(currentResultCode,Objects.requireNonNull(resultData));AudioRecord.Builder builder = new AudioRecord.Builder();builder.setAudioFormat(new AudioFormat.Builder().setSampleRate(16000).setChannelMask(AudioFormat.CHANNEL_IN_MONO).setEncoding(AudioFormat.ENCODING_PCM_16BIT).build()).setBufferSizeInBytes(minBufferSize);AudioPlaybackCaptureConfiguration config =new AudioPlaybackCaptureConfiguration.Builder(mediaProjection).addMatchingUsage(AudioAttributes.USAGE_MEDIA).addMatchingUsage(AudioAttributes.USAGE_UNKNOWN).addMatchingUsage(AudioAttributes.USAGE_GAME).build();builder.setAudioPlaybackCaptureConfig(config);try {if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)== PackageManager.PERMISSION_GRANTED) {audioRecord = builder.build();}} catch (Exception e) {Log.e("录音器错误", "录音器初始化失败");}startRecord();return super.onStartCommand(intent, flags, startId);}

demo下载地址:https://download.csdn.net/download/sinat_39508948/86955519

完毕

Android Q及以上系统音频捕获功能(声音内录)的简单实现相关推荐

  1. Android Q Beta 正式发布 | 精于形,安于内

    移动行业在 2019 年创新不断,随着 5G 时代的到来与折叠屏技术的成熟,智能设备正在迈向未来新时代,而 Android 更是处在颠覆创新的风口浪尖.通过与生态圈伙伴们的深度合作,我们从软件到硬件不 ...

  2. Android Q 将获得大量的隐私保护功能

    百度智能云 云生态狂欢季 热门云产品1折起>>>   谷歌将于今年夏天推出的安卓系统新版本 Android Q,将带来大量隐私保护的增强. 图片来源: ASOP 关于新安卓系统,谷歌 ...

  3. Android Q:新系统名称和新特性整理

    目前关于 Android Q 的相关新闻已经流出,这里我们对 Android Q 的系统名称和新特性进行整理. Android Q 的名字: 很想知道 Android Q 今年使用哪个名字作为系统的名 ...

  4. Android Q Labs| 通用系统映像介绍

    开场白 GSI 就是 genetic system image,也就是通用系统映像. 今天我们尝试着用 GSI 来帮助各位开发者,看看有什么新东西可以来帮助大家.所以今天的主题大概会分为几个部分. 第 ...

  5. LG30刷小米系统_初版BUG较多 小米9成功升级基于Android Q的MIUI系统

    标签:Android Q刷机包,小米9刷机包,小米9安卓10.0刷机包 [rom之家资讯]昨天凌晨(5月8日)的谷歌I/O大会上,Android Q Beta 3登场,距离正式版又近一步.同时,包括2 ...

  6. android 9.0 屏蔽系统所有通知功能实现

    目录 1.概述 2.屏蔽系统所有通知功能实现的核心类 3.屏蔽系统所有通知功能实现的核心功能实现和分析

  7. M1 macOS 无法录制系统声音?SoundFlower后继有BlackHole【macOS系统声音内录】

    SoundFlower 众所周知,QuickTime无法录制系统声音,在macOS之前的版本,和M1(Apple Silicon)没问世之前,SoundFlower一直都是首选!可惜SoundFlow ...

  8. Android 4.1.2系统添加重启功能

    对于Android的的手机或者平板长期使用,感觉会出现慢的情况,所以偶尔还是需要重启一下,而长按电源键弹出的菜单又没有重启选项,所以特在此记录自己添加这个功能的过程. 首先关机的那个弹出菜单是在fra ...

  9. Android Q:调用系统相机拍照,并且获取图片

    获取图片后上传可以看我这篇文章,封装好了后,只需要一个uri就行了 https://blog.csdn.net/qq_27454233/article/details/106661130 先说明And ...

最新文章

  1. sqlserver 日常检查脚本
  2. Python函数Day1
  3. 搭载第四代自研神龙架构 阿里云发布RDMA增强型实例等多款新品
  4. java 抽象类 final_final/抽象类/interface
  5. Android 照相功能
  6. clr20r3 mysql.data_C# CLR20R3 程序终止的几种解决方案
  7. pta最长连续递增子序列C语言,pta 习题集 5-5 最长连续递增子序列 (dp)
  8. Flutter进阶—质感设计之持久底部面板
  9. debug方式看Activity启动流程小记
  10. 14.STC15W408AS单片机IIC驱动OLED
  11. 解决1KB文件夹快捷方式病毒
  12. 小白必看!DIY装机,电脑显示器选购
  13. 【NLP】句法分析一
  14. QT从下载到安装的具体教程
  15. Matlab 图像几何变换
  16. 组合导航初始对准(1)
  17. Visual Studio2015产品密钥
  18. 程序员必读:“五险一金”详解!
  19. pg_regress 使用技巧
  20. mac 更新10.11后,出现command not found的解决办法

热门文章

  1. 基于错误扩散的Floyd-Steinbery抖动算法简单理解
  2. 关于南京四校联合程序设计大赛
  3. VSCode,真香!
  4. python 三维散点图拟合曲面_python 绘图---2D、3D散点图、折线图、曲面图
  5. Android蓝牙扫描不到设备问题
  6. SSL证书部署后,为什么还是显示不安全?
  7. Python_PyQuery模块打开本地文件报错UnicodeDecodeError: 'gbk' codec can't decode byte 0xa0 in position 84
  8. 倍讯科技Profinet转rs232连接XK3190-A33E称重显示器配置案例
  9. 保障4-0509任务打卡
  10. java铝车架_谁才是铝架之王 四款铝质公路车架横评