使用MediaRecorder在Android中进行语音呼叫录音

时间:2014-06-10 11:00:55

标签: android mediarecorder telephonymanager

我在录制通话时遇到问题我已拨打电话并拨打BroadcastReceiver以获取通话状态。收到电话时TelephonyManager.EXTRA_STATE_OFFHOOK。我正在使用以下代码来记录电话

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);                               recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
recorder.setOutputFile(audiofile.getAbsolutePath());
try {
     recorder.prepare();
     recorder.start();
} 
catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) { 
e.printStackTrace();
} catch (Exception ex)
{
ex.printStackTrace();
}

此代码工作正常并创建音频文件,但是当我收听音频文件时,我只能收听传出的语音,不会记录来电者的语音。

当我使用

recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);

而不是

recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

在上面的代码中,它会在recoder.start();

上抛出重新编码失败的异常

那么,我该如何录制语音通话?

4 个答案:

答案 0 :(得分:4)

一年前我也有同样的疑问AudioSource.VOICE_CALL not working in android 4.0 but working in android 2.3

recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); 在有限的设备上工作,它只会在不支持语音呼叫的设备上提供例外,因此请抓住异常并重新开始麦克风录音,这将使您在不受支持的设备上更安全。

答案 1 :(得分:0)

我认为我们不听对方声音的问题是无障碍访问。 需要打开记录器应用程序的辅助功能。这样问题就会得到解决。 也使用 recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION);

答案 2 :(得分:-1)

只要音量较低,您就无法录制来电者的声音。它在编程上是不可能的,因为AudioRecorder或MediaRecorder只能通过麦克风录音。您唯一能做的就是尽可能大地设置扬声器的音量。

将AudioSoucre更改为.MIC无济于事,有一个未解决的问题:

https://code.google.com/p/android/issues/detail?id=4075

此问题直到现在才解决,我认为将来不会修复,因为大多数国家/地区都不允许录制电话

答案 3 :(得分:-1)

MIC的音频源应记录来电。您可以将录音音量设置为最大音量,并按如下方式打开扬声器:

录音前

//     AudioManager audioManager;

    //turn on speaker
     audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
     audioManager.setSpeakerphoneOn(true);
    //increase Volume
     audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL, audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL), 0);

//开始录制

    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    File audioFile = File.createTempFile("temp", "3gp", path);
    recorder.setOutputFile(audioFile.getAbsolutePath());
    recorder.prepare();     
    recorder.start();   

还有其他常量可以与setAudioSource()一起使用,只需按照guide了解每个常量如何工作