package org.homeway.phonerecorder;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.telephony.TelephonyManager;
import android.util.Log;
import java.io.File;
import java.io.IOException;
/**
* Created by Administrator on 15-2-27.
*/
public class PhoneBroadcastReceiver extends BroadcastReceiver {
// 本机拨出的电话号码
private static String outgoingNumber;
// 来电的电话号码
private static String incomingNumber;
// 系统录音机
private static MediaRecorder mediaRecorder;
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Log.d("PhoneBroadcastReceiver", "intent.getAction() = " + action);
// 如果是去电, 获取拨出的电话号码
if (action.equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
outgoingNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.d("PhoneBroadcastReceiver", "outgoingNumber = " + outgoingNumber);
} else if (action.equals("android.intent.action.PHONE_STATE")) {
TelephonyManager tm = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);
int phoneState = tm.getCallState();
Log.d("PhoneBroadcastReceiver", "phoneState = " + phoneState);
switch (phoneState) {
case TelephonyManager.CALL_STATE_RINGING:
incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
Log.d("PhoneBroadcastReceiver", "incomingNumber = " + incomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
new Thread(){
@Override
public void run() {
File dirFile = Environment.getExternalStorageDirectory();
File file;
if (null != incomingNumber && incomingNumber.length() > 0) {
file = new File(dirFile, "IN_" + incomingNumber + "_" + System.currentTimeMillis() + ".amr");
} else {
file = new File(dirFile, "OUT_" + outgoingNumber + "_" + System.currentTimeMillis() + ".amr");
}
mediaRecorder = new MediaRecorder();
// mediaRecorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);
/**
* !!! 红米note必须设置为VOICE_CALL才能收到声音.设置为其他类型时, 录音文件在播放时无声音.
* !!! coolpad手机在设置为VOICE_CALL时, 执行mediaRecorder.start()时抛出异常. 若设置为DEFAULT或MIC时则程序正确执行.
*/
// mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mediaRecorder.setOutputFile(file.getAbsolutePath());
try {
mediaRecorder.prepare();
mediaRecorder.start();
Log.d("PhoneBroadcastReceiver", "record file path = " + file.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
Log.e("PhoneBroadcastReceiver", e.getMessage());
mediaRecorder = null;
} catch (Exception e) {
e.printStackTrace();
Log.e("PhoneBroadcastReceiver", e.getMessage());
mediaRecorder = null;
}
}
}.start();
break;
case TelephonyManager.CALL_STATE_IDLE:
if (null != mediaRecorder) {
mediaRecorder.stop();
mediaRecorder.reset();
mediaRecorder.release();
mediaRecorder = null;
incomingNumber = null;
outgoingNumber = null;
}
Log.d("PhoneBroadcastReceiver", "finished!");
break;
}
}
}
}
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.homeway.phonerecorder" > <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".PhoneBroadcastReceiver"> <intent-filter> <!-- 获取来电广播 --> <action android:name="android.intent.action.PHONE_STATE"/> <!-- 获取去电广播 --> <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> </intent-filter> </receiver> </application> </manifest>