在进行电话录音中,我们需要监听Phone的状态,通过PhoneStateListener 对phone的状态判断当前通话中的各种状态,根据状态进行对应的处理,
1,注册phone状态Receiver
<receiver android:name="com.internal.telephony.TelReceiver" android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
<action android:name="android.intent.action.PHONE_STATE"/>
<action android:name="android.intent.action.CAL"/>
</intent-filter>
</receiver>
这里使用service进行具体实现
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class TelReceiver extends BroadcastReceiver {
final String tel="android.intent.action.PHONE_STATE";
@Override
public void onReceive(Context context, Intent intent) {
if(intent!=null){
if(intent.getAction().equals(tel)){
Intent i=new Intent("com.tel.listner");
context.startService(i);
}
}
}
}
录音处理:
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Service;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.provider.ContactsContract;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
public class TelListenner extends Service{
private final String tag="com.tel.listner";
@Override
public void onCreate() {
TelephonyManager telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
TelListner listener = new TelListner() ;
// 监听电话的状态
telManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
}
class TelListner extends PhoneStateListener{
private String number;//监听电话号码
private boolean isRecord;
private MediaRecorder recorder;
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:/* 无任何状态 */
number = null;
if (recorder != null && isRecord) {
Log.e("msg", "record ok");
recorder.stop();//录音完成
recorder.reset();
recorder.release();
isRecord = false;//录音完成,改变状态标志
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK:/* 接起电话 */
number=incomingNumber;
Log.e("msg", "recording");// 录制声音,这是录音的核心代码
recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 定义声音来自于麦克风
recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);//存储格式
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//设置编码
SimpleDateFormat format = new SimpleDateFormat("yy-MM-dd-HH:mm:ss");//此处定义一个format类,方便对录音文件进行命名
String fileName = number + "_" + format.format(new Date());
File file=new File(Environment.getExternalStorageDirectory(),"myapp");
if(!file.exists()){
file.mkdirs();
}
recorder.setOutputFile(file.getAbsolutePath()+File.separator+fileName + ".amr");
try {
recorder.prepare();
recorder.start(); // 开始刻录
isRecord = true;
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
break;
case TelephonyManager.CALL_STATE_RINGING:/* 电话进来 */
Log.e("msg", "coming");
number = incomingNumber;
getContactPeople(incomingNumber);
break;
default:
break;
}
}
}
/**
* 根据来电号码查找联系人
* @param incomingNumber
*/
private void getContactPeople(String incomingNumber){
ContentResolver contentResolver = getContentResolver();
Cursor cursor = null;
//查询字段名称
String[] projection = new String[]{ ContactsContract.Contacts._ID, ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER };
//根据电话号码查找该联系人
cursor = contentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection,
ContactsContract.CommonDataKinds.Phone.NUMBER + "=?", new String[]
{ incomingNumber }, null);
// 找不到联系人
if (cursor.getCount() == 0){
Log.e("msg", "unknown Number:" + incomingNumber);
}
else if (cursor.getCount() > 0){
cursor.moveToFirst();
String name = cursor.getString(1);
Log.e("msg", name+" :" + incomingNumber);
}
cursor.close();
cursor=null;
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
}
录音还开可这样设置
MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
可以录制上下行端口的通话语音
注册服务:
<service android:name="com.internal.telephony.TelListenner">
<intent-filter>
<action android:name="com.tel.listner"/>
</intent-filter>
</service>
以上是以电话号和日期命名的录音文件,可以改成已联系人进行命名这样会方便查看文件。
最后别忘记加权限
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>