在安卓系统中使用MediaRecorder进行语音通话录制

3

我在录制电话通话时遇到了问题。我创建了一个服务并调用了 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()时会抛出recoder失败的异常。
那么,我该如何录制语音通话呢?
4个回答

4

一年前我也有同样的疑问 AudioSource.VOICE_CALL在安卓4.0上不起作用但在安卓2.3上能用

recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); 只适用于部分设备,会在不支持电话录音的设备上抛出异常,所以捕获异常并重新使用麦克风开始录制,这将确保在不支持此功能的设备上仍能正常录制。


当我使用.MIC时,它不会记录传入的声音,只会记录我的声音。 - user2064024
你正在使用哪个设备? - Auto-Droid ツ
1
audioSource = MediaRecorder.AudioSource.CAMCORDER; 尝试一下。 - Auto-Droid ツ
@Auto,你是如何检测到呼出电话被接听的? - Ayush Bansal
我能够通过MediaRecorder.AudioSource.MIC,MediaRecorder.AudioSource.CAMCORDER和MediaRecorder.AudioSource.VOICE_CALL这三个选项记录呼叫者的声音... 但是无法记录接收端的声音... 我在Moto E和Moto G4 Plus上尝试过。 - Imran Khan Saifi
显示剩余8条评论

0

我认为我们没有听到另一方的声音的问题是因为无障碍访问。 需要为录音应用程序打开无障碍功能。这样问题就会得到解决。 同时使用 recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_COMMUNICATION);


你有这个问题的可行解决方案吗?@pushpo rani - Akshay Kumar Both
尝试在您的应用程序中添加辅助功能服务,可以参考这篇文章:https://medium.com/@vanshikaa937/a-complete-guide-to-accessibility-service-part-1-c00387230019 然后,将以下内容添加到您的应用程序活动中,以启用来自应用程序的辅助功能:https://dev59.com/wFoT5IYBdhLWcg3wngm1 - pushpo rani

-1

只要音量太低,您就无法记录呼叫者的声音。这在编程上是不可能的,因为AudioRecorder或MediaRecorder只能通过麦克风进行录制。您唯一能做的就是尽可能将扬声器的音量设置得更大。

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

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

这个问题到目前为止还没有得到解决,我认为在未来也不会得到解决,因为在大多数国家是不允许录制电话通话的。


即使音量已满,输入的声音也不会被记录。 - user2064024
我认为这取决于设备。我很久以前尝试过在我的三星Galaxy S3上做这样的事情,它可以正常工作......你正在创建哪个音频文件?我使用.wav文件,因为它具有最好和最清晰的声音。 - Opiatefuchs
我正在创建.amr文件并使用HTC One S手机。 - user2064024
与.wav文件相同的结果 - user2064024
1
使用audioSource = MediaRecorder.AudioSource.CAMCORDER是能够工作的,但声音非常低。 - user2064024
有什么办法可以只监听振幅变化吗?我只想知道是否有人在使用麦克风,不需要录音。 - j2emanue

-1

一个麦克风的音频源应该记录进来的电话。您可以将录音音量设置为最大级别,并像下面这样打开扬声器:

//录音前 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(),只需按照指南了解每个常量的工作原理即可。


使用Voice_Call和Voice_communication时,我在recorder.start()处遇到了录音器失败的异常。 - user2064024
这是因为您使用的设备不支持它们中的任何一个。我在应用程序中使用麦克风,它可以正常工作。如果您像我在答案中所做的那样增加系统音量并打开扬声器,问题是否仍然存在? - Nana Ghartey
你也在其他设备上测试过吗? - Nana Ghartey
麦克风的音频源应该记录来电 - 你确定吗? - CopsOnRoad
嗨。我遇到了和其他人一样的问题。告诉我,打开扬声器电话实际上是把它打开吗?我的意思是,用户会注意到这一点,并且必须在扬声器模式下通话吗? - Manish Kumar Sharma
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接