Je travaille dans l'application d'enregistrement d'appels automatique, je peux enregistrer un appel vocal sous Android 6 à l'aide de MediaRecorder.AudioSource.VOICE_CALL
, Sous Android 6, il est impossible d'enregistrer un appel vocal à l'aide de VOICE_CALL. J'ai réussi à enregistrer en utilisant MediaRecorder.AudioSource.MIC
, mais la voix entrante n'est pas enregistrée et je souhaite enregistrer un appel vocal en mode normal, pas en mode haut-parleur activé. S'il vous plaît aidez-moi sur ce point. (J'avais essayé Xiomi Redmi 4a (Android 6), ne fonctionnait 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 autorisations.
Update: tout le monde sait comment forcer un autre flux vers une source audio MIC. Cela nécessite du code Android natif. Aidez-moi s'il vous plaît sur ceRéférez-vous à cette question pour plus de détails sur le routage audio
Vous devez utiliser ndk. Voici des exemples de fonctions à effectuer.
Charger 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;}
Jeu de fonctionsParamètres
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;}
Tâche 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 existe une bibliothèque et un exemple d'utilisation https://github.com/ViktorDegtyarev/CallRecLib
Les périphériques Xiaomi ont toujours des problèmes de demandes d’autorisation, même lors de l’exécution ou de l’installation.
J'ai un Xiaomi Redmi 3 pro et force toujours à refuser une autorisation lorsque j'installe des applications. Je dois donc manuellement l'autoriser . Si votre problème est identique, j'ai trouvé une solution de contournement et cela a fonctionné pour moi: Comment obtenir l'autorisation de démarrage automatique de l'application MIUI Security par programme?
Cela pourrait être un problème lié à l'autorisation.
Avec l'introduction d'Android 6.0 Marshmallow, aucune autorisation ne sera accordée à l'application au moment de l'installation. Au lieu de cela, l'application doit demander à l'utilisateur une autorisation une par une au moment de l'exécution.
J'espère que vous avez inclus le code qui demande explicitement des autorisations sur les appareils avec Marshmallow et les versions ultérieures.
Dans l’appel d’appel automatique (callU), sélectionnez l’option "SoundFX" si Enable Record Call Two Side
essayer
MediaRecorder.AudioSource.VOICE_COMMUNICATION
et voir
https://androidforums.com/threads/Android-phone-with-call-recording-function.181663/