这是一个简单的android 录音单元功能实现的源码,不涉及其他线程或服务之类的深入知识,详细针对 mediaRecorder 实现录音功能做记录和解析。
一 静态权限
现在的Android机已经普遍都是6.0以上的系统了,所以很多权限是需要动态申请的,这里录音权限就需要进行动态申请,我们把需要的权限先在 manifest.xml
文件中静态声明一下
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>
用到的就是上面这三个,包括存储空间的读,写,录音权限
这里只是静态权限的申请,6.0以上的系统还需要动态申请权限,后面的代码会逐步解析。
二 录音文件存放的位置
这里要说明的是,从Android 7.0 之后,系统加强了SD卡的权限管理,即使App声明了完整的SD卡操作权限,系统仍然默认禁止该App访问外部存储。不过系统默认关闭的存储只是外部存储的公共空间,而外部存储的私有空间依然可以正常读写。这个私有空间是只有应用自己才可访问的专享空间,而当这个APP卸载时这个空间也就一起被清理掉了。
在网上很多源码中提到使用 Environment.getExternalStroagePublicDirector 方法获取文件的存放路径,但其实这个方法在比较高版本的SDK中已经废弃了,当使用AS写代码时会有废弃的提示。因为这个方法返回的是公共空间的地址,App自身要操作这个空间很多时候是无法使用的。
那么我们就要获取App的私有空间地址,这里要用到的方法就是 getExternalFilesDir() 。这个方法返回的是一个File类的对象,详细的用法可参考这篇文章app私有空间路径的获取
简单的示例如下
var privatePath = getExternalFilesDir(null).toString()
这个 privatePath 获取的路径位于 “外部存储根目录/Android/data/应用包名/files” 下,注意这里最后是没有 “ / ” 的,也就是说后期要组合一些其他的下级文件路径不要忘了给它后面加“ / ”
三 录音API mediaRecorder 的使用
这个的用法还是挺简单的,下面直接通过源码说明
(1)布局文件源码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView