Подтвердить что ты не робот

Запись звонков в 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. Пожалуйста, помогите мне в этом Обратитесь к этому вопросу за дополнительной информацией о маршрутизации звука

4b9b3361

Ответ 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" />
  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);, а также установите объем потока обратно, как это было.

Ответ 3

У устройств Xiaomi всегда есть проблемы с запросом на разрешение даже во время выполнения или времени установки.

У меня есть Xiaomi Redmi 3 pro, и он всегда заставляет отказаться от разрешения, когда я устанавливаю приложения, поэтому я должен вручную разрешить это. Если ваша проблема такая же, я нашел некоторое решение для решения проблемы, и это сработало для меня: Как получить программное разрешение на запуск программного обеспечения MIUI программно?

Ответ 4

Это может быть проблема, связанная с разрешением.

С введением Android 6.0 Marshmallow приложение не получит разрешения во время установки. Вместо этого приложение должно запрашивать у пользователя разрешение один за другим во время выполнения.

Надеюсь, вы включили код, который явно запрашивает разрешения на устройства с Marshmallow и выше.

Ответ 6

В автоматическом устройстве записи вызовов (callU) есть опция "SoundFX", если Enable Record Calls Two Side

Ссылка

введите описание изображения здесь