Android 当电话传入或传出时录制语音(仅麦克风)
我遵循的示例,将其放在广播接收器上,尝试在电话呼入和呼出时录制麦克风声音(我知道它仍然限于录制另一侧)。 我的问题是:当用户拿起电话时,如何获取状态。因为当它响起时,它也会进入“android.intent.action.PHONE_STATE”的状态 我的代码:Android 当电话传入或传出时录制语音(仅麦克风),android,broadcastreceiver,mediarecorder,Android,Broadcastreceiver,Mediarecorder,我遵循的示例,将其放在广播接收器上,尝试在电话呼入和呼出时录制麦克风声音(我知道它仍然限于录制另一侧)。 我的问题是:当用户拿起电话时,如何获取状态。因为当它响起时,它也会进入“android.intent.action.PHONE_STATE”的状态 我的代码: public class PhoneCallReceiver extends BroadcastReceiver { @Override public void onReceive(Context context,
public class PhoneCallReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
String action = intent.getAction();
if (action.equals("android.intent.action.PHONE_STATE")
{
// Phone call recording
try {
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
recorder.setOutputFile(<my output dir>);
recorder.prepare();
recorder.start();
recordStarted = true;
telManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
telManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
} catch(Exception ex) {
}
}
}
}
private final PhoneStateListener phoneListener = new PhoneStateListener() {
@Override
public void onCallStateChanged(int state, String incomingNumber) {
try {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING: {
//
break;
}
case TelephonyManager.CALL_STATE_OFFHOOK: {
//
break;
}
case TelephonyManager.CALL_STATE_IDLE: {
if (recordStarted) {
recorder.stop();
recordStarted = false;
}
break;
}
default: { }
}
} catch (Exception ex) {
}
}
};
公共类PhoneCallReceiver扩展了BroadcastReceiver
{
@凌驾
公共void onReceive(上下文、意图)
{
String action=intent.getAction();
if(action.equals(“android.intent.action.PHONE_STATE”)
{
//电话录音
试一试{
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
setOutputFile();
记录器。准备();
recorder.start();
recordStarted=true;
telManager=(TelephonyManager)context.getSystemService(context.TELEPHONY_服务);
telManager.listen(phoneListener,PhoneStateListener.listen\u CALL\u STATE);
}捕获(例外情况除外){
}
}
}
}
private final PhoneStateListener phoneListener=新PhoneStateListener(){
@凌驾
public void onCallStateChanged(int状态,字符串incomingNumber){
试一试{
开关(状态){
case TelephonyManager.CALL_STATE_响铃:{
//
打破
}
case TelephonyManager.CALL_STATE_OFFHOOK:{
//
打破
}
case TelephonyManager.CALL_STATE_IDLE:{
如果(记录已启动){
录音机。停止();
recordStarted=false;
}
打破
}
默认值:{}
}
}捕获(例外情况除外){
}
}
};
AndroidManifest.xml中的代码
<receiver android:name=".PhoneCallReceiver" android:enabled="true">
<intent-filter android:priority="1000">
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
基于安卓2.1 SDK并在HTC EVO 4G(安卓2.2)中测试。您可以使用
安卓.intent.action.ANSWER
操作,而不是使用安卓.intent.action.PHONE\u状态
操作。您可以在接听电话时录制语音。如果您想录制两端的语音,请使用(根据Android文档)
我没有尝试过这个,但希望对您有用,为了回答您的问题,您是否查看了
TelephonyManager
的函数getCallState()
?谢谢。但我发现当我拿起电话和意图时,它会触发TelephonyManager.CALL\u STATE\u OFFHOOK STATE。getAction()永远不要成为android.intent.action.ANSWER,但始终是android.intent.action.PHONE_STATE。顺便说一句,我使用2.1 SDK开发并在android 2.2(HTC EVO 4G)上测试它。我认为这在任何手机上都不起作用,包括Nexus手机。
recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);