我用到的是MediaRecorder的API用来录制手机音频,接下来就是演示一个demo了,我选择的是录制通话过程的音频,也就是实现了一个监听手机通话的小demo。
步骤:
1.开启一个服务;
2.使用TelephonyManager获取系统通话服务;
3.根据通话服务返回的状态码进行对应操作;
4.如果状态码为通话状态则:
1)实例化一个音频捕获器(录音器)MediaRecorder mr = new MediaRecorder();
2)指定录音器的生源,MIC是话筒的声音、VOICE_CALL是通话双方的声音 mr.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
3)设置录制文件的格式 mr.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
4)设置录制文件的路径以及名称 mr.setOutputFile(file);
5)设置录制音频的品质 mr.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
6)让录音机处于就绪状态 mr.prepare();
7)启动录音 mr.start()。
注意以上设置顺序不要乱。
5.如果状态码为空闲状态则判断录音机是否被实例化,如果已经实例化则停止录音,并释放录音机资源,把录音机实例至null。
需要的权限:
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/>
主要代码:
PhoneListenerService.java
package com.example.phonelistener; import android.app.Service; import android.content.Context; import android.content.Intent; import android.media.MediaRecorder; import android.os.Environment; import android.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import java.io.File; import java.io.IOException; /** * Created by pactera on 2017/2/10. */ public class PhoneListenerService extends Service { private TelephonyManager tm; private MediaRecorder mr;//通话音频捕获器 private PhoneStateListener listener; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); listener = new PhoneStateListener(){ @Override public void onCallStateChanged(int state, String incomingNumber) { switch (state) { case TelephonyManager.CALL_STATE_IDLE://电话空闲状态 if (mr != null) { mr.stop(); mr.release(); mr = null; } break; case TelephonyManager.CALL_STATE_OFFHOOK://通话状态 //实例化音频捕获器 mr = new MediaRecorder(); //指定录音机的生源,VOICE_CALL代表的是话筒和对方的声音 mr.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); //设置录制文件的格式 mr.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); //设置录制文件的路径以及名称 File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".3gp"); mr.setOutputFile(file.getAbsolutePath()); //设置音频的品质 mr.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); //就绪录音机 try { mr.prepare(); } catch (IOException e) { e.printStackTrace(); } //启动录音机 mr.start(); break; case TelephonyManager.CALL_STATE_RINGING://响铃状态 break; } } }; tm.listen(listener,PhoneStateListener.LISTEN_CALL_STATE); } @Override public void onDestroy() { if (mr != null) { mr.stop(); mr.release(); mr = null; } tm.listen(listener,PhoneStateListener.LISTEN_NONE); listener = null; } }