Android 当电话传入或传出时录制语音(仅麦克风)

Android 当电话传入或传出时录制语音(仅麦克风),android,broadcastreceiver,mediarecorder,Android,Broadcastreceiver,Mediarecorder,我遵循的示例,将其放在广播接收器上,尝试在电话呼入和呼出时录制麦克风声音(我知道它仍然限于录制另一侧)。 我的问题是:当用户拿起电话时,如何获取状态。因为当它响起时,它也会进入“android.intent.action.PHONE_STATE”的状态 我的代码: public class PhoneCallReceiver extends BroadcastReceiver { @Override public void onReceive(Context context,

我遵循的示例,将其放在广播接收器上,尝试在电话呼入和呼出时录制麦克风声音(我知道它仍然限于录制另一侧)。 我的问题是:当用户拿起电话时,如何获取状态。因为当它响起时,它也会进入“android.intent.action.PHONE_STATE”的状态

我的代码:

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);