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>
本文介绍了通过Android系统实现手机通话录音与存储的功能,包括获取去电与来电号码、使用MediaRecorder进行录音,并将录音文件保存到外部存储设备。
529

被折叠的 条评论
为什么被折叠?



