Запись звонков в Android Входящий голос не записывается
Я работаю с устройством автоматического вызова, я могу записывать голосовые вызовы ниже android 6, используя MediaRecorder.AudioSource.VOICE_CALL
,
От 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. Пожалуйста, помогите мне в этом
Обратитесь к этому вопросу за дополнительной информацией о маршрутизации звука
Ответы
Ответ 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;}
Функция 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
Ответ 2
Сначала эти 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
У устройств Xiaomi всегда есть проблемы с запросом на разрешение даже во время выполнения или времени установки.
У меня есть Xiaomi Redmi 3 pro, и он всегда заставляет отказаться от разрешения, когда я устанавливаю приложения, поэтому я должен вручную разрешить это.
Если ваша проблема такая же, я нашел некоторое решение для решения проблемы, и это сработало для меня: Как получить программное разрешение на запуск программного обеспечения MIUI программно?
Ответ 4
Это может быть проблема, связанная с разрешением.
С введением Android 6.0 Marshmallow приложение не получит разрешения во время установки. Вместо этого приложение должно запрашивать у пользователя разрешение один за другим во время выполнения.
Надеюсь, вы включили код, который явно запрашивает разрешения на устройства с Marshmallow и выше.
Ответ 5
попробуйте
MediaRecorder.AudioSource.VOICE_COMMUNICATION
и см.
https://androidforums.com/threads/android-phone-with-call-recording-function.181663/
Ответ 6
В автоматическом устройстве записи вызовов (callU) есть опция "SoundFX", если Enable Record Calls Two Side
Ссылка
![введите описание изображения здесь]()