为了在 Android 应用中录制声音,Android提供了 MediaRecorder 类,关于MediaRecorder的详解大家可以参考《Android开发之MediaRecorder类详解》。
使用MediaRecorder录制声音的步骤:
1) 创建 MediaRecorder 对象。
2) 调用MediaRecorder对象的setAudioSource()方法设置声音来源,一般传入 MediaRecorder. AudioSource.MIC参数指定录制来自麦克风的声音。
3) 调用MediaRecorder对象的setOutputFormat()设置所录制的音频文件的格式。
4) 调用MediaRecorder 对象的setAudioEncoder()、setAudioEncodingBitRate(intbitRate)、 setAudioSamplingRate(int samplingRate)设置所录制的声音的编码格式、编码位率、采样率等, 这些参数将可以控制所录制的声音的品质、文件的大小。一般来说,声音品质越好,声音文件越大。
5) 调用MediaRecorder的setOutputFile(Stringpath)方法设置录制的音频文件的保存位置。
6) 调用MediaRecorder的prepare()方法准备录制。
7) 调用MediaRecorder对象的start()方法开始录制。
8) 录制完成,调用MediaRecorder对象的stop()方法停止录制,并调用release()方法释放资源。
提示:1.上面的步骤中第3和第4两个步骤千万不能搞反,否则程序将会抛出lllegalStateException 异常。
2. 设置声音编码格式要和声音的输出格式相对应,不然录制的音频文件不标准。如果编码格式和输出格式不对应,录制出的音频文件虽然可以播放,但是将多个这类音频文件合并之后,会出现只播放合并文件中的部分文件。
应用实例
使用MediaRecorder录制声音:
实例代码:
MainActivity.代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void click(View v){
Intent intent = new Intent(this,RecorderService.class);
startService(intent);
}
RecorderService文件中的代码
<span style="color: rgb(51, 51, 51); font-family: 宋体; font-size: 14px; line-height: 28px; text-indent: 28px; background-color: rgb(240, 240, 240);">package com.demo.tel;</span>
import java.io.IOException;
import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
public class RecorderService extends Service {
private MediaRecorder recorder;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
//在创建服务的时候就开始监听
public void onCreate() {
super.onCreate();
//获取电话管理器
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
/**
* 监听电话状态
* arg0:电话状态监听
* arg1:监听的什么事件
*/
tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);
}
//设置监听
class MyListener extends PhoneStateListener{
//电话状态改变时回调
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
//判断当前电话的状态
switch (state) {
//电话闲置
case TelephonyManager.CALL_STATE_IDLE:
//8) 录制完成,调用MediaRecorder对象的stop()方法停止录制,并调用release()方法释放资源。
if(recorder != null){
//停止录音
recorder.stop();
//释放资源
recorder.release();
recorder = null;
}
break;
//电话响铃
case TelephonyManager.CALL_STATE_RINGING:
System.out.println("电话响铃");
if(recorder == null){
//1)创建 MediaRecorder 对象。
recorder = new MediaRecorder();
/**
* 2) 调用MediaRecorder对象的setAudioSource()方法设置声音来源,
* 一般传入 MediaRecorder. AudioSource.MIC参数指定录制来自麦克风的声音。
*/
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//3) 调用MediaRecorder对象的setOutputFormat()设置所录制的音频文件的格式。
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
/**
* 4) 调用MediaRecorder 对象的setAudioEncoder()、
* setAudioEncodingBitRate(intbitRate)、
* setAudioSamplingRate(int samplingRate)
* 设置所录制的声音的编码格式、编码位率、采样率等,
* 这些参数将可以控制所录制的声音的品质、文件的大小。
* 一般来说,声音品质越好,声音文件越大。
*/
recorder.setAudioEncoder(MediaRecorder.OutputFormat.THREE_GPP);
//5) 调用MediaRecorder的setOutputFile(Stringpath)方法设置录制的音频文件的保存位置。
recorder.setOutputFile("sdcard/voice.3gp");
//6) 调用MediaRecorder的prepare()方法准备录制。
try {
recorder.prepare();
} catch (Exception e) {
e.printStackTrace();
}
}
break;
//电话摘机
case TelephonyManager.CALL_STATE_OFFHOOK:
//7) 调用MediaRecorder对象的start()方法开始录制。
if(recorder != null){
recorder.start();
}
break;
}
}
}
}
xml文件添加权限和注册Service
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<service android:name="com.demo.tel.RecorderService"></service>