Android呼叫录制传入语音未被录制

Android呼叫录制传入语音未被录制,android,android-ndk,native,android-mediarecorder,phone-call,Android,Android Ndk,Native,Android Mediarecorder,Phone Call,我正在使用自动通话记录应用程序,我能够使用MediaRecorder.AudioSource.voice_call在android 6下录制语音通话, 从android 6无法使用语音通话录制语音通话。我设法用MediaRecorder.AudioSource.MIC录制了声音,但这里没有录制传入的声音,我想在正常模式下录制语音通话,而不是在扬声器打开模式下录制。请帮我做这个。(我在Xiomi Redmi 4a(安卓6)上试过,没有用) 编辑:权限没有问题。 更新:任何人都知道如何强制另一个流到

我正在使用自动通话记录应用程序,我能够使用MediaRecorder.AudioSource.voice_call在android 6下录制语音通话, 从android 6无法使用语音通话录制语音通话。我设法用MediaRecorder.AudioSource.MIC录制了声音,但这里没有录制传入的声音,我想在正常模式下录制语音通话,而不是在扬声器打开模式下录制。请帮我做这个。(我在Xiomi Redmi 4a(安卓6)上试过,没有用)


编辑:权限没有问题。

更新:任何人都知道如何强制另一个流到麦克风音频源。这需要本地android代码。请在这方面帮助我
这可能是与权限相关的问题

随着安卓6.0棉花糖的推出,该应用程序在安装时将不会被授予任何权限。相反,应用程序必须在运行时逐个向用户请求权限


我希望您已经包含了明确要求对含有棉花糖和棉花糖以上的设备拥有权限的代码。

首先,清单中需要这3个权限,如果设备位于棉花糖以上,则需要运行时权限请求

<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" />
  • 您需要设置此选项以正确记录通话

    audioManager.setMode(audioManager.MODE在调用中)

  • 开始录制时提高音量

    audioManager.setStreamVolume(audioManager.STREAM\u VOICE\u CALL,audioManager.getStreamMaxVolume(audioManager.STREAM\u VOICE\u CALL),0);
    
    停止录制时,将模式设置为正常,
    audioManager.setMode(audioManager.MODE_正常)并将流卷设置为原来的状态。

    小米设备总是在权限请求方面存在问题,即使是在运行时或安装时

    我有一个小米红米3专业版,当我安装应用程序时,它总是强制拒绝一些权限,所以我必须手动允许它。 如果你的问题是相同的,我找到了一些解决办法,它对我很有效:

    试试看

     MediaRecorder.AudioSource.VOICE_COMMUNICATION
    
    看看


    您需要使用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);
        }
    }
    
    任务AudioSetParameters

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

    自动通话记录器(callU)中有一个库和一个使用示例,如果启用记录通话,则有一个选项“SoundFX”



    您如何请求权限?@GiacomoLai仅限运行时!大家好,我在三星S7和S8上也遇到了同样的问题(没有得到对方的声音)。从其他方面来说,我的程序在其他手机上运行得很好。你知道???@BharathKumar你现在的状态吗?你成功了吗?@BharathKumar你见过立方体呼叫记录器吗。即使在Xiomi Redmi 4a上,该应用程序也能完美运行。在SD卡中记录和创建文件的权限没有问题。我这边的声音被录下来了,另一边的声音不来了。在oneplus 5和android 7上运行良好,谢谢您的回答。但传入的声音非常非常低(可忽略不计的语音传入)。(测试日期:Xiomi Redmin 4A android 6)您是否正确提高了音频管理器中的音量?我已经在Redmi Note 3、三星Galaxy J2、Coolpad、三星Galaxy 2 duos上进行了测试,它运行良好。@BharathKumar请告诉我您是否需要更多帮助,因为我之前已经完成了这项工作,并且知道哪些有效,哪些无效。.嗨,我遇到了相同的问题(没有听到对方的声音)有了三星S7和S8,我的程序在其他手机上运行得很好,你知道吗?你找到解决方案了吗?如果是的,请分享它谢谢你的回答。但问题是在通话录音过程中,对方的声音没有被录音。只有我的声音被录下来了。你有解决办法吗?我在三星Galaxy s7、s8HI中也遇到了同样的问题。我在三星s7和S8中遇到了同样的问题(没有得到对方的声音)。从其他方面来说,我的程序在其他手机上运行得很好。你知道吗?谢谢你的回答,但这种方法也不起作用。@ishmaelMakitla抱歉。编辑。嗨@Viktor Degtyarev谢谢你的回答,它实际上正在工作。如果你在解释中解释你的答案,那会更有帮助。(很抱歉反应太晚,事实上我正在做其他项目。)嗨,Viktor将在三星S7和S8(Noughat设备)上使用此库,因为我在通话中录制传入语音时遇到问题。请帮助Hi@BharathKumar请帮助您如何使用上述代码记录传入语音。请提供源代码。@ViktorDegtyarev其他用户的语音在mi设备中仍然记录得很低。你有什么解决办法吗?这到底是干什么的?我不知道兄弟。但我认为它可以记录单独的输入和输出声音。最后,它将声音混合在一起。可以同时从两个来源录制吗?我从来没有试过,可能是。但如果只使用录音机录制(不要使用接收器)传入和录制的语音。