【问题标题】:Android Call Recording Incoming voice not getting recordedAndroid 通话录音 来电未录音
【发布时间】:2023-03-17 11:16:01
【问题描述】:

我正在使用自动通话记录器应用程序,我可以使用 MediaRecorder.AudioSource.VOICE_CALL 在 android 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 上也能完美运行

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


【解决方案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" />
  1. 并非所有手机都支持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);
  1. 您需要设置此项才能正确记录您的通话,

    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/

【讨论】:

  • 感谢您的回答,但是这种方法也行不通。
猜你喜欢
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多