Android通话录音未录制来电语音

时间:2017-07-21 07:08:49

标签: android android-ndk native android-mediarecorder phone-call

我正在使用自动呼叫记录器应用程序,我可以使用MediaRecorder.AudioSource.VOICE_CALL在android 6下方录制语音呼叫, 从Android 6无法使用 VOICE_CALL 录制语音通话。我设法使用MediaRecorder.AudioSource.MIC进行录制,但是这里传入的语音没有录制,我想在正常模式下录制语音通话,而不是在扬声器模式下录制。请帮帮我。 (我曾尝试过Xiomi Redmi 4a(机器人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音频源。这需要原生的android代码。请帮帮我 Refer this question for more details on routing audio

6 个答案:

答案 0 :(得分:11)

您需要使用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;}

功能setParameters

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

任务AudioSetParameters

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

的例子

答案 1 :(得分:2)

如果设备位于Marshmallow之上,那么Manifest首先需要这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" />
    并非所有手机都支持
  1. MediaRecorder.AudioSource.VOICE_CALL,因此您需要继续使用MediaRecorder.AudioSource.MIC
  2. 我使用它并在大多数设备上正常工作,

    recorder = new MediaRecorder();
      recorder.setAudioSource(audioSource);
      recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
      recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
      recorder.setOutputFile(your_path);
    
    1. 您需要将其设置为正确记录您的电话,

      audioManager.setMode(AudioManager.MODE_IN_CALL);

    2. 开始录制时提高音量 audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL), 0);

      当您停止录制时将模式设置为正常, audioManager.setMode(AudioManager.MODE_NORMAL);并设置流量以支持它的运行方式。

答案 2 :(得分:2)

即使是运行时或安装时,小米设备也始终遇到权限请求问题。

我有一个小米Redmi 3专业版,当我安装应用程序时它总是强制拒绝一些权限,所以我必须手动允许它。 如果您的问题相同,我找到了一些解决方案,它对我有用:How to get MIUI Security app auto start permission programmatically?

答案 3 :(得分:1)

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

随着Android 6.0 Marshmallow的推出,该应用程序在安装时不会获得任何权限。相反,应用程序必须在运行时逐个询问用户权限。

我希望您已经包含明确要求使用Marshmallow及以上设备的权限的代码。

答案 4 :(得分:1)

在自动呼叫记录器(callU)中有一个选项“SoundFX”如果启用记录呼叫双方

Link

enter image description here

答案 5 :(得分:0)

尝试

 MediaRecorder.AudioSource.VOICE_COMMUNICATION

并查看

  

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