Android 通话录音未录制来电
Android Call Recording Incoming voice not getting recorded
我正在使用自动通话记录器应用程序,我可以使用 MediaRecorder.AudioSource.VOICE_CALL
在 android 6 以下录制语音通话,
来自 android 6 无法使用 VOICE_CALL 录制语音通话。我设法使用 MediaRecorder.AudioSource.MIC
进行了录音,但这里没有录制传入的语音,我想在正常模式下而不是在扬声器打开模式下录制语音通话。请帮我解决这个问题。 (我试过Xiomi Redmi 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 音频源。这需要本机 android 代码。请帮我解决这个问题
这可能是与权限相关的问题。
随着 Android 6.0 Marshmallow 的推出,该应用程序在安装时将不会被授予任何权限。相反,应用程序必须在 运行 时逐一请求用户许可。
我希望你已经包含了明确要求在 Marshmallow 及更高版本的设备上获得权限的代码。
首先,如果设备在 Marshmallow 之上,则清单中需要这 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" />
并非所有手机都支持 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);
并且还将流音量设置为原来的样子。
小米设备总是在请求权限时出现问题,即使是 运行 时间或安装时间。
我有一个小米红米3 pro,安装应用程序时总是强制拒绝某些权限,所以我必须手动允许它。
如果你的问题是一样的,我找到了一些解决方法,它对我有用:
尝试
MediaRecorder.AudioSource.VOICE_COMMUNICATION
并查看
https://androidforums.com/threads/android-phone-with-call-recording-function.181663/
你需要使用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);
}
}
在自动通话记录器 (callU) 中有一个选项 "SoundFX" 如果启用录音通话双方
我正在使用自动通话记录器应用程序,我可以使用 MediaRecorder.AudioSource.VOICE_CALL
在 android 6 以下录制语音通话,
来自 android 6 无法使用 VOICE_CALL 录制语音通话。我设法使用 MediaRecorder.AudioSource.MIC
进行了录音,但这里没有录制传入的语音,我想在正常模式下而不是在扬声器打开模式下录制语音通话。请帮我解决这个问题。 (我试过Xiomi Redmi 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 音频源。这需要本机 android 代码。请帮我解决这个问题
这可能是与权限相关的问题。
随着 Android 6.0 Marshmallow 的推出,该应用程序在安装时将不会被授予任何权限。相反,应用程序必须在 运行 时逐一请求用户许可。
我希望你已经包含了明确要求在 Marshmallow 及更高版本的设备上获得权限的代码。
首先,如果设备在 Marshmallow 之上,则清单中需要这 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" />
-
并非所有手机都支持
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);
并且还将流音量设置为原来的样子。
小米设备总是在请求权限时出现问题,即使是 运行 时间或安装时间。
我有一个小米红米3 pro,安装应用程序时总是强制拒绝某些权限,所以我必须手动允许它。
如果你的问题是一样的,我找到了一些解决方法,它对我有用:
尝试
MediaRecorder.AudioSource.VOICE_COMMUNICATION
并查看
https://androidforums.com/threads/android-phone-with-call-recording-function.181663/
你需要使用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);
}
}
在自动通话记录器 (callU) 中有一个选项 "SoundFX" 如果启用录音通话双方