demo_电话录音_Service

为了在 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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值