首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android来电录音来电未录音

Android来电录音来电未录音
EN

Stack Overflow用户
提问于 2017-07-21 15:08:49
回答 6查看 27.8K关注 0票数 24

我正在工作的自动通话记录应用程序,我可以在下面的安卓6使用MediaRecorder.AudioSource.VOICE_CALL录制语音通话,从安卓6不能录制语音通话使用VOICE_CALL。我设法使用MediaRecorder.AudioSource.MIC录制,但这里传入的语音没有录制,我想在正常模式下录制语音呼叫,而不是在扬声器打开模式下。请在这方面帮帮我。(我试过小米Redmi 4a(安卓6),不能用)。

代码语言:javascript
复制
 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);

编辑:权限没有问题。

更新:任何人都知道如何强制另一个流到麦克风音频源。这需要原生android代码。请在此 Refer this question for more details on routing audio上帮助我

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-10-18 15:10:58

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

加载libmedia.so和libutils.so

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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的示例

票数 11
EN

Stack Overflow用户

发布于 2017-08-07 00:08:09

即使是在运行时或安装时,小米设备的权限请求都会出现问题。

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

票数 3
EN

Stack Overflow用户

发布于 2017-07-21 15:31:41

首先,在Manifest中需要这3个许可,并且如果设备在棉花糖之上,则需要运行时许可请求,

代码语言:javascript
复制
<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.

我使用这个,并且在大多数设备上都工作得很好,

代码语言:javascript
复制
      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);

开始录制时调高音量

代码语言:javascript
复制
audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL), 0);

当您停止录制时,请将模式设置为normal、audioManager.setMode(AudioManager.MODE_NORMAL);,并将流音量设置为原来的状态。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45231232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档