前言
Android系统在实现录音以及录像的功能均是通过使用MediaRecorder实现的。本篇文章主要介绍如何借助MediaRecorder实现后台录音功能。
MediaRecoder
MediaRecoder主要方法介绍
- void prepar():准备录制
- void start():开始录制
- void stop():停止录制
- void reset():重置MediaRecorder
- void release():释放MediaRecorder占用的资源
- void setAudioEncoder(int):设置音频记录的编码格式
- void setAudioSource(int):设置音频记录的音频源
- void setOutoutFormat(int):设置记录的媒体文件的输出转换格式
- void setOutputFile(String):媒体文件输出路径
audiosource的来源设定
来源 | 描述 |
---|---|
CAMCORDER | 录音来源于同方向的相机麦克风相同,若相机无内置相机或无法识别,则使用预设的麦克风 |
DEFAULT | 默认音频源 |
MIC | 录音来源为主麦克风 |
REMOTE_SUBMIX | 用于远程呈现的音频流的子混音的音频源,需要Manifest.permission.CAPTURE_AUDIO_OUTPUT权限,第三方应用无法申请 |
UNPROCESSED | 与默认相同 |
VOICE_CALL | 记录上行与下行音频源,需要Manifest.permission.CAPTURE_AUDIO_OUTPUT权限,第三方应用无法申请 |
VOICE_COMMUNICATION | 麦克风音频源针对VoIP等语音通信进行了调整,可以接收到通话的双方语音 |
VOICE_DOWNLINK、VOICE_UPLINK | 上行下行的语音,需要Manifest.permission.CAPTURE_AUDIO_OUTPUT权限,第三方应用无法申请 |
VOICE_PERFORMANCE | 捕获音频的来源意味着要实时处理并播放以进行现场演出 |
VOICE_RECOGNITION | 用于获取语音进行语音识别 |
编码格式以及输出格式
编码格式
- ACC、ACC-ELD、AMR_NB、AMR_WB、DEFAULT、HE_AAC、OPUS、VORBIS
输出格式
- AAC_ADTS、AMR_NB、AMR_WB、DEFAULT、MPEG_2_TS、MPEG_4、OGG、THREE_GPP、WEBM
录音部分源码
开始录音
public void startRecord() {
if (mMediaRecorder == null)
mMediaRecorder = new MediaRecorder();
try {
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
fileName = DateFormat.format("yyyyMMdd_HHmmss", Calendar.getInstance(Locale.CHINA)) + ".m4a";
File destDir = new File(Environment.getExternalStorageDirectory()+"/test/");
if (!destDir.exists()) {
destDir.mkdirs();
}
filePath = Environment.getExternalStorageDirectory()+"/test/"+ fileName;
mMediaRecorder.setOutputFile(filePath);
mMediaRecorder.prepare();
mMediaRecorder.start();
} catch (IllegalStateException e) {
Log.i("failed!" , e.getMessage());
} catch (IOException e) {
Log.i("failed!" ,e.getMessage());
}
结束录音
public void stopRecord() {
try {
mMediaRecorder.stop();
mMediaRecorder.release();
mMediaRecorder = null;
} catch (RuntimeException e) {
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder = null;
File file = new File(filePath);
if (file.exists())
file.delete();
}
}
权限部分
- 为实现录音以及将录音后的文件保存到手机当中,需要在Manifest里面声明申请的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
申请权限
- 其中的权限是需要动态申请的
- 动态权限申请的类如下
- 此类具有申请权限的通用性,可以拓展使用
- 其使用方法是
RequestPermission requestPermission = new RequestPermission();
requestPermission.RequestPermission(this);
- 权限申请类
package com.example.intent.recordbackgroud;
import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
/**
* Created by baoqingyang on 2018/3/8.
*/
public class RequestPermission {
public static final String PERMISSION_FILE = Manifest.permission.WRITE_EXTERNAL_STORAGE;
public static final String PERMISSION_RECORD = Manifest.permission.RECORD_AUDIO;
public static final String PERMISSION_READ = Manifest.permission.READ_EXTERNAL_STORAGE;
private static final String[] requestPermissions = {
PERMISSION_FILE,
PERMISSION_RECORD,
PERMISSION_READ
};
public RequestPermission(){
}
interface PermissionGrant {
void onPermissionGranted(int requestCode);
}
public void RequestPermission(Activity activity){
String[] permissions;
List<String> mPermissionList = new ArrayList<>();
mPermissionList.clear();
for (int i = 0; i < requestPermissions.length; i++) {
if (ContextCompat.checkSelfPermission(activity, requestPermissions[i]) != PackageManager.PERMISSION_GRANTED) {
mPermissionList.add(requestPermissions[i]);
}
}
if (mPermissionList.isEmpty()) {//未授予的权限为空,表示都授予了
} else {//请求权限方法
permissions = mPermissionList.toArray(new String[mPermissionList.size()]);//将List转为数组
ActivityCompat.requestPermissions(activity, permissions, 1);
}
String res = getProperty("CAPTURE_AUDIO_OUTPUT","1111");
Log.d("show",res);
}
public String getProperty(String key, String defaultValue) {
String value = defaultValue;
try {
Class<?> c = Class.forName("android.os.SystemProperties");
Method get = c.getMethod("get", String.class, String.class);
value = (String)(get.invoke(c, key, "unknown" ));
} catch (Exception e) {
e.printStackTrace();
}finally {
return value;
}
}
public static void setprop(String key, String defaultValue) {
String value = defaultValue;
try {
Class<?> c = Class.forName("android.os.SystemProperties");
Method get = c.getMethod("set", String.class, String.class );
get.invoke(c, key, value );
} catch (Exception e) {
e.printStackTrace();
}
}
}