多媒体摄像头及相关硬件文章中,对摄像头的使用方式需要区分应用程序的目标版本以使用不同的代码流程,而与之相比,麦克风硬件的使用就简单多了。

麦克风及相关硬件

麦克风硬件在移动设备上作为音频的采集设备,由于只需要一个收声口,其颜值对用户来说关注度比较低。而且不同的麦克风硬件在性能上差距不大,其应用场景也只是在录制视频时的音频采集,或单独的音频采集,故使用流程和相关操作都比较简单易懂。

只是在目标版本为Android9.0即API 28即以上的系统中,如果应用程序想使用麦克风,必须保持前台运行,或使用前台服务以访问麦克风并采集音频。否则如果应用程序切换到后台,将无法正常使用麦克风采集的数据。

权限声明

首先对麦克风硬件的使用权限进行声明,其权限名及值为Manifest.permission.RECORD_AUDIO="android.permission.RECORD_AUDIO"。该权限必须在应用程序的清单文件中声明,并且在目标版本为Android6.0即API 23及以上的系统中还需要动态申请该权限,经用户授权后方可启用麦克风。

使用流程

关于麦克风的音频采集流程,与在API 21以下使用摄像头的流程相似。首先检测麦克风硬件,在能获取到Context上下文环境对象的位置,调用上下文环境对象的getPackageManager()方法获取android.content.pm.PackageManager包管理类的实例化对象,进而通过该对象的hasSystemFeature(String featureName)方法,使参数 featureName 值为PackageManager.FEATURE_MICROPHONE 代表麦克风功能,来判断当前系统是否有麦克风硬件的支持。

对于支持麦克风硬件的设备,在目标版本为Android9.0即API 28及以上的系统中,可以获取麦克风硬件的详细信息。可以调用上下文环境对象的getSystemService(String name)方法获取系统服务中的音频管理类,该方法的参数 name 值为Context.AUDIO_SERVICE=\"audio\",并将返回对象强制转换为android.media.AudioManager音频管理类。借助AudioManager音频管理类对象,可以访问音频采集和播放相关的信息。其中,调用该对象的getMicrophones()方法,得到返回的android.media.MicrophoneInfo类型组成的列表,而这里的MicrophoneInfo麦克风信息类对象,则对应保存了该设备上可使用的每个麦克风信息。

音频采集

对于麦克风硬件的数据采集,主要用到android.media.MediaRecorder多媒体录制类,该类在多媒体摄像头及相关硬件中实现视频录制功能时也有使用。这里也将详细说明MediaRecorder多媒体录制类的使用方式。

首先实例化多媒体录制类对象,使用MediaRecorder(Context context)构造方法。该方法的参数 context 即当前使用多媒体录制类的上下文环境对象。

在初始化MediaRecorder多媒体录制类对象后,可以调用该对象的setX系列方法设置相关配置项。

在录制音频时,需要选择音频源。设置音频源可以调用该对象的setAudioSource(int audioSource)方法,其中参数 audioSourceint类型的标志位,其值通常设置为麦克风的音频源MediaRecorder.AudioSource.MIC=1,另外还可以是适用于通话的麦克风MediaRecorder.AudioSource.VOICE_CALL=4,或者适用于现场直播的麦克风MediaRecorder.AudioSource.VOICE_PERFORMANCE=10等。

在录制音频时,麦克风采集的音频通常需要编码输出,设置编码格式可以调用该对象的setAudioEncoder(int audio_encoder)方法,其参数 audio_encoder 同样是int类型的标志位,其值可以是AMR NB格式的MediaRecorder.AudioEncoder.AMR_NB=1,AMR WB格式的MediaRecorder.AudioEncoder.AMR_WB=2,AAC LC格式的MediaRecorder.AudioEncoder.AAC=3,OGG格式的MediaRecorder.AudioEncoder.VORBIS=6,OPUS格式的MediaRecorder.AudioEncoder.OPUS=7等。

在录制音频后,可以将数据输出到文件中,设置输出音频文件可以调用该对象的setOutputFile(String path)方法,其参数 path 指定了输出文件的绝对路径。

在输出文件时同样要设置输出格式,调用该对象的setOutputFormat(int output_format)方法,其参数 output_format 同样是int类型的标志位,与音频编码格式对应,其值可以调用MediaRecorder.OutputFormat静态类的相关常量。

MediaRecorder对象设置完相关准备工作后,可以调用该对象的prepare()方法,获取相关硬件,准备开始采集音频数据。

而调用MediaRecorder对象的start()方法,则开始启动采集音频,并将数据输出到指定的文件中。

录制音频过程中,可以调用MediaRecorder对象的pause()方法暂停录制,数据将会暂停输出到指定文件。

如果想再次继续录制音频并将数据输出到文件,可以调用MediaRecorder对象的resume()方法继续录制。

最终,需要停止采集音频,调用MediaRecorder对象的stop()方法停止录制,数据将停止输出到指定文件,并关闭对指定文件的使用状态。

在停止录制后,必须调用MediaRecorder对象的release()方法,释放当前多媒体录制类所占用的资源,包括对麦克风的占用状态等。

使用麦克风的音频采集功能,还可以通过android.media.AudioRecord音频录制类实现。而且MediaRecorder多媒体录制类中关于音频录制的功能,在底层同样是通过AudioRecorder音频录制类实现的,所以初级阶段掌握MediaRecorder多媒体录制类的相关使用将会更加实用。

Android系统编程入门系列之硬件交互——多媒体麦克风的更多相关文章

  1. Android系统编程入门系列之硬件交互——多媒体摄像头

    多媒体系列硬件 多媒体包括图片.动画.音频.视频,这些多媒体素材的采集(输入)主要依靠摄像头和麦克风等硬件设备转化为基础数据,而他们的播放渲染(输出),则需要依靠具有相关功能的编解码软件.当然随着硬件 ...

  2. Android系统编程入门系列之硬件交互——多媒体展示

    前两篇文章通过麦克风硬件和摄像头硬件分别采集音频和视频的多媒体数据,在得到的多媒体数据通常是以编码文件的格式存储,在用户需要展示时,可通过设备的内置扩音器或蓝牙耳机等硬件播放音频,通过设备的显示屏或外 ...

  3. Android系统编程入门系列之硬件交互——传感器

    到目前为止,关于应用程序与用户之间的相关内容便比较肤浅的大致介绍完毕.而在整个系统架构中,应用程序与用户之间的交互,犹如参天大树上的枝干和树叶,交互起来五彩缤纷,但使整个生态系统保持生命力的核心,在于 ...

  4. Android系统编程入门系列之硬件交互——通信硬件USB

    在硬件交互的首篇对设备硬件的分类中,互联通信系列硬件主要用来与其他设备进行数据交互.从本文开始,将重点介绍该系列相关硬件. 互联通信系列硬件 根据硬件的可通信距离,由近及远分为USB.NFC.蓝牙.W ...

  5. Android系统编程入门系列之硬件交互——通信硬件Bluetooth

    通信硬件NFC的文章,虽然可以在Android系统中通过非直接接触的形式与支持NFC硬件的设备通信,但是也只能交互一些简短的标签内容,对大量的持续性数据,却并不能很好的支持.因此针对这个弊端,可以考虑 ...

  6. Android系统编程入门系列之硬件交互——通信硬件NFC

    在上篇文章介绍了接入式USB硬件的简单使用,接下来将介绍不依赖物理连接的硬件通信了.本文的重点是近距离通信的硬件NFC. NFC硬件 应用程序中可以通过NFC硬件读取或发送指定协议的技术实现,在And ...

  7. Android系统编程入门系列之硬件交互——无线通信WLAN

    Android系统的移动设备大多支持无线WLAN技术.利用该技术,不仅能实现互联网通信,还能实现无线定位,热点共享等远程通信功能.针对使用WLAN的不同功能,可能需要分别申请不同的权限声明,同时调用不 ...

  8. Android系统编程入门系列之硬件交互——通信硬件电信SIM卡

    现在的SIM卡通常具备基站定位.语音通话.短信消息.网络流量这四大功能,而在移动端是无法对SIM卡使用基站定位功能的,所以这里只介绍移动端如何使用SIM卡实现语音通话.短信消息.数据流量三个功能. 语 ...

  9. Android系统编程入门系列之加载界面Activity

    上回说到应用初始化加载及其生命周期,在Android系统调用Applicaiton.onCreate()之后,继续创建并加载清单文件中注册的首个界面即主Activity,也可称之为入口界面.主Acti ...

随机推荐

  1. Gitlab-CI使用及.gitlab-ci.yml配置入门一篇就够了

    转载:Gitlab-CI使用及.gitlab-ci.yml配置入门一篇就够了 - 简书 (jianshu.com) 一. Gitlab-CI/CD使用场景 首先,公司使用Gitlab作为工作仓库进行代 ...

  2. 认识Linux系统中的inode,硬链接和软链接

    在学习和创建软链接遇到了一点问题,总结一下: 在当前文件夹下面建立了两个临时文件夹tempdir1和tempdir2,然后在tempdir2里面创建了一个hello文件,然后用指令ln -s temp ...

  3. cloudstack部署

    参考文档 https://blog.csdn.net/u012124304/article/details/80960504#Mysql_37 cloudstack的rpm包下载地址 http://d ...

  4. shell 脚本二进制安装mysql

    以下脚本的手动安装连接:https://www.cnblogs.com/leihongnu/p/12581793.html [ #/bin/bash#脚本安装 mysql,上传安装包至 /rootcd ...

  5. MarkdownPad2弹窗显示HTML Rendering Error(HTML 渲染错误)的解决办法

    MarkdownPad2弹窗显示HTML Rendering Error(HTML 渲染错误)的解决办法 我在打开.md文件的时候,出现以下错误: 解决方式:下载Awesomium SDK并安装,重启 ...

  6. 羽夏看Win系统内核——系统调用篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  7. 菜鸡的Java笔记 第四 - java 基础运算符

    数学运算符,逻辑运算,三目运算,位运算 double d2 = 314e2; //采用科学计数法的写法,表示10的2次方.= 31400.0 代码写的越简单越好   简化运算符 代码:x=x+y 可以 ...

  8. CSS学习笔记:grid布局

    目录 一.Grid布局简介 二.Grid布局的一些概念 三. 容器元素属性 1. grid-template-* 1.1 网格行和列的设置 1.2 repeat的使用 1.3 使用fr 1.4 aut ...

  9. [atARC127F]±AB

    (为了方便,以下除$V$外都改为小写字母) 结论1:若$a+b\le m+1$,则答案为$m+1$(即任意$x$都可以被得到) 任取$y\in [0,m]$,由$\gcd(a,b)=1$存在$y-V= ...

  10. [atARC070F]HonestOrUnkind

    考虑当$a\le b$时,构造两种方案,满足诚实的人不交,接下来要求对于任意询问,这两种方案的答案都有可能相同 考虑询问$(i,j)$,若$i$在两种方案中有一种不诚实,那么总可以让答案相同,又因为诚 ...