Android 通话录音 来电未录音
Posted
技术标签:
【中文标题】Android 通话录音 来电未录音【英文标题】:Android Call Recording Incoming voice not getting recorded 【发布时间】:2017-12-27 03:01:31 【问题描述】:我正在使用自动通话记录器应用程序,我可以使用 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 上也能完美运行 【参考方案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 通话录音 来电未录音的主要内容,如果未能解决你的问题,请参考以下文章