Enregistrement de L'appel sur Android La Voix entrante n'est pas enregistrée

je travaille application enregistreur d'appels automatique, je suis en mesure d'enregistrer l'appel vocal sur android ci-dessous 6 en utilisant MediaRecorder.AudioSource.VOICE_CALL , D'android 6 ne peut pas enregistrer l'appel vocal en utilisant VOICE_CALL . J'ai réussi à enregistrer en utilisant MediaRecorder.AudioSource.MIC mais ici la voix entrante n'est pas enregistrée et je veux enregistrer l'appel vocal en mode normal pas en mode haut-parleur sur. Merci de m'aider sur ce point. (J'avais essayé sur Xiomi Redmi 4a (android 6), ne fonctionne pas).

 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);

Edit: il n'y a pas de problème avec les permissions.

mise à Jour : quelqu'un sait comment forcer un autre flux de MICRO de la source audio. Cela nécessite le code natif android. S'il vous plaît aidez-moi sur ce se Réfèrent à cette question pour plus de détails sur le routage audio

20
demandé sur Vadim Kotov 2017-07-21 10:08:49

6 réponses

vous devez utiliser ndk. Voici des exemples de fonctions à accomplir.

Load libmedia.so et 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 de fonction

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;}

Task 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);
    }
}

il y a une bibliothèque et un exemple d'utilisation https://github.com/ViktorDegtyarev/CallRecLib

9
répondu Viktor Degtyarev 2017-10-18 08:37:07

les appareils Xiaomi ont toujours des problèmes avec la demande de permission, même le temps d'exécution ou le temps d'installation.

J'ai un Xiaomi Redmi 3 pro, et il force toujours à refuser une permission quand j'installe des applications, donc je dois l'autoriser manuellement. Si votre problème est le même, j'ai trouvé une solution de contournement et cela a fonctionné pour moi: Comment obtenir la permission de démarrage automatique de L'application de sécurité MIUI programmatically?

2
répondu nhoxbypass 2017-08-06 16:08:09

tout d'abord, ces 3 permissions sont nécessaires dans le manifeste ainsi qu'une demande de permission d'exécution si l'appareil est au-dessus de 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" />
  1. MediaRecorder.AudioSource.VOICE_CALL n'est pas supporté sur tous les téléphones donc vous devez continuer à utiliser MediaRecorder.AudioSource.MIC .

je l'utiliser et fonctionne très bien sur la plupart des dispositifs,

recorder = new MediaRecorder();
  recorder.setAudioSource(audioSource);
  recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  recorder.setOutputFile(your_path);
  1. vous devez régler ceci pour enregistrer vos appels correctement,

    audioManager.setMode(AudioManager.MODE_IN_CALL);

augmenter le niveau de volume lorsque vous commencez à enregistrer audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL), 0);

quand vous arrêtez d'enregistrer, réglez le mode à normal, audioManager.setMode(AudioManager.MODE_NORMAL); et aussi régler le volume du flux à l'arrière comment il était.

1
répondu Bat Cat 2017-07-21 07:31:40

il pourrait s'agir d'une question liée à la Permission.

avec L'introduction de Android 6.0 Marshmallow, l'application ne sera accordée aucune autorisation au moment de l'installation. Au lieu de cela, l'application doit demander à l'utilisateur une permission un par un à l'exécution.

j'espère que vous avez inclus le code qui demande explicitement des permissions sur les appareils avec Marshmallow et au-dessus.

1
répondu Mukesh Sharma 2017-07-26 07:42:01

dans l'enregistreur automatique d'appels (Call recorder) ont une option "SoundFX" si activer les appels D'enregistrement de deux côtés

Lien

enter image description here

1
répondu pere plop 2017-10-29 06:03:11

essayer

 MediaRecorder.AudioSource.VOICE_COMMUNICATION

et voir

https://androidforums.com/threads/android-phone-with-call-recording-function.181663 /

0
répondu user8256287 2017-08-10 05:35:54