Android 通话录音 来电未录音

Posted

技术标签:

【中文标题】Android 通话录音 来电未录音【英文标题】:Android Call Recording Incoming voice not getting recorded 【发布时间】:2017-12-27 03:01:31 【问题描述】:

我正在使用自动通话记录器应用程序,我可以使用 MediaRecorder.Audiosource.VOICE_CALLandroid 6 以下记录语音通话, 从 android 6 开始,无法使用 VOICE_CALL 录制语音通话。我设法使用MediaRecorder.AudioSource.MIC 进行录制,但这里传入的语音没有被录制,我想在正常模式下录制语音通话,而不是在扬声器开启模式下录制。请帮我解决这个问题。 (我试过小米红米4a(android 6),不行)。

 myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
 myRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
 myRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
 myRecorder.setMaxDuration(60 * 60 * 1000);
 AudioManager audiomanager =
 (AudioManager)getSystemService(AUDIO_SERVICE);
 audiomanager.setMode(2);

编辑:权限没有问题。

更新:任何人都知道如何强制另一个流到 MIC 音频源。这需要原生安卓代码。请帮我解决这个问题 Refer this question for more details on routing audio

【问题讨论】:

你是如何申请权限的? @GiacomoLai 仅运行时间! 嗨,我在三星 S7 和 S8 上遇到了同样的问题(没有得到对方的声音),否则我的 prog 在其他手机上运行得非常好任何想法?? @BharathKumar 你现在是什么状态?你成功了吗? @BharathKumar 你看过 CUBE CALL RECORDER。这个应用程序即使在小米红米 4a 上也能完美运行 【参考方案1】:

您需要使用 ndk。以下是需要完成的功能示例。

加载 libmedia.so 和 libutils.so

int load(JNIEnv *env, jobject thiz) 
    void *handleLibMedia;
    void *handleLibUtils;
    int result = -1;
    lspr func = NULL;

    pthread_t newthread = (pthread_t) thiz;

    handleLibMedia = dlopen("libmedia.so", RTLD_NOW | RTLD_GLOBAL);
    if (handleLibMedia != NULL) 
        func = dlsym(handleLibMedia, "_ZN7android11AudioSystem13setParametersEiRKNS_7String8E");
        if (func != NULL) 
            result = 0;
        
        audioSetParameters = (lasp) func;
     else 
        result = -1;
    

    handleLibUtils = dlopen("libutils.so", RTLD_NOW | RTLD_GLOBAL);
    if (handleLibUtils != NULL) 
        fstr = dlsym(handleLibUtils, "_ZN7android7String8C2EPKc");
        if (fstr == NULL) 
            result = -1;
        
     else 
        result = -1;
    

    cmd = CM_D;

    int resultTh = pthread_create(&newthread, NULL, taskAudioSetParam, NULL);

    return result;

函数集参数

int setParam(jint i, jint as) 
pthread_mutex_lock(&mt);

audioSession = (int) (as + 1);

kvp = "input_source=4";
kvps = toString8(kvp);

cmd = (int) i;

pthread_cond_signal(&cnd);
pthread_mutex_unlock(&mt);

return 0;

任务音频设置参数

void *taskAudioSetParam(void *threadid) 
    while (1) 
        pthread_mutex_lock(&mt);
        if (cmd == CM_D) 
            pthread_cond_wait(&cnd, &mt);
         else if (audioSetParameters != NULL) 
             audioSetParameters(audioSession, kvps);
        
        pthread_mutex_unlock(&mt);
    

有一个库和一个使用例子https://github.com/ViktorDegtyarev/CallRecLib

【讨论】:

@ishmaelMakitla 对不起。已编辑。 嗨@Viktor Degtyarev 感谢您的回答,它实际上正在工作。如果您在解释中解释您的答案,它会更有帮助。 (抱歉回复晚了,其实我在做其他项目。) 嗨 Viktor 这个库能否在三星 S7 和 S8(Noughat 设备)上工作,因为我在通话过程中无法录制传入的语音。请帮忙 嗨@BharathKumar,请帮助您如何设法使用上述代码来记录传入的声音,也请提供源代码。 @ViktorDegtyarev 其他用户的声音仍然在 mi 设备中录制这么低。您对此有什么解决方案吗?【参考方案2】:

小米设备在运行时或安装时总是存在权限请求问题。

我有一个小米红米3 pro,我安装应用时总是强制拒绝某些权限,所以我必须手动允许它。 如果你的问题是一样的,我找到了一些解决方法,它对我有用:How to get MIUI Security app auto start permission programmatically?

【讨论】:

感谢您的回答。但问题是在通话录音期间,对方的声音没有录音。只有我的声音被记录下来。 你有解决办法吗?我在三星 Galaxy s7、s8 中也有同样的问题 大家好,我在三星 S7 和 S8 上遇到了同样的问题(没有得到对方的声音),否则我的 prog 在其他手机上运行得非常好有什么想法吗??【参考方案3】:

首先在Manifest中需要这3个权限,如果设备在Marshmallow之上,则需要一个运行时权限请求,

<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" />
    并非所有手机都支持MediaRecorder.AudioSource.VOICE_CALL,因此您需要继续使用MediaRecorder.AudioSource.MIC

我使用它并且在大多数设备上都可以正常工作,

      recorder = new MediaRecorder();
      recorder.setAudioSource(audioSource);
      recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
      recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
      recorder.setOutputFile(your_path);

    您需要设置此项才能正确记录您的通话,

    audioManager.setMode(AudioManager.MODE_IN_CALL);

开始录音时提高音量

audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL), 0);

当您停止录制时,将模式设置为正常, audioManager.setMode(AudioManager.MODE_NORMAL); 并将流音量设置回原来的样子。

【讨论】:

感谢您的回答。但是传入的声音非常非常低(可以忽略不计的声音)。 (测试于:小米 Redmin 4A android 6) 您是否正确提高了音频管理器的音量?我已经在 Redmi Note 3、Samsung Galaxy J2、Coolpad、Samsung Galaxy 2 duos 上进行了测试,它运行良好.. @BharathKumar 如果您需要更多帮助,请告诉我,因为我之前已经完成了这项工作,并且知道哪些有效,哪些无效.. 嗨,我在三星 S7 和 S8 上遇到了同样的问题(没有得到对方的声音),否则我的 prog 在其他手机上运行得非常好任何想法?? 你找到解决方法了吗?如果有请分享一下【参考方案4】:

这可能是与权限相关的问题。

随着 Android 6.0 Marshmallow 的引入,应用在安装时不会被授予任何权限。相反,应用程序必须在运行时一一请求用户许可。

我希望你已经包含了明确要求使用 Marshmallow 及更高版本的设备的权限的代码。

【讨论】:

权限没有问题,它在 sdcard 中录制和创建文件。事情是我这边的声音被录下来了,另一边的声音没有来。它在带有 android 7 的 oneplus 5 上运行良好【参考方案5】:

在自动通话记录器 (callU) 中有一个选项“SoundFX”如果启用记录通话两侧

Link

【讨论】:

这到底是做什么的? 我不知道兄弟。但我认为记录单独的输入和输出声音。最后,它将声音混合在一起 可以同时从2个来源录制吗?我从未尝试过。 可能是。但如果使用录音机只用于记录(不要使用接收器)传入和录音。【参考方案6】:

试试

 MediaRecorder.AudioSource.VOICE_COMMUNICATION

看看

https://androidforums.com/threads/android-phone-with-call-recording-function.181663/

【讨论】:

感谢您的回答,但是这种方法也行不通。

以上是关于Android 通话录音 来电未录音的主要内容,如果未能解决你的问题,请参考以下文章

在 android 7 的通话录音中听不到来电?

手把手教你Android来去电通话自动录音的方法

电话录音服务仅记录来电者的声音。 (安卓)

android 10 (2019) 可以恢复语音通话录音吗?

使用 ALSA/CAF 进行 Android 通话录音

Android 通话录音功能