una samsung llamadas llamada grabar entrante conversación como celular aplicaciones android android-ndk native android-mediarecorder phone-call

android - samsung - como grabar una llamada entrante en iphone



Grabación de llamadas Android La voz entrante no se graba (6)

Estoy trabajando en la aplicación de grabación automática de llamadas, puedo grabar llamadas de voz en la parte inferior de Android 6 usando MediaRecorder.AudioSource.VOICE_CALL , desde android 6 no puedo grabar llamadas de voz usando VOICE_CALL . MediaRecorder.AudioSource.MIC grabar usando MediaRecorder.AudioSource.MIC pero aquí la voz entrante no se graba y quiero grabar llamadas de voz en modo normal y no en modo de altavoz activado. Por favor ayúdame con esto. (He probado Xiomi Redmi 4a (Android 6), no funciona).

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

Editar: no hay problemas con los permisos.

Actualización: cualquiera sabe cómo forzar otra transmisión a la fuente de audio MIC. Esto requiere un código nativo de Android. Por favor, ayúdenme en esto. Refiera esta pregunta para más detalles sobre enrutamiento de audio


En el registrador automático de llamadas (callU) tiene una opción "SoundFX" si Habilita Grabar Llamadas en dos lados

Enlazar


En primer lugar, estos 3 permisos son necesarios en Manifiesto, así como una solicitud de permiso de tiempo de ejecución si el dispositivo está por encima 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 no es compatible con todos los teléfonos, por lo que debe seguir utilizando MediaRecorder.AudioSource.MIC .

Lo uso y funciona bien en la mayoría de los dispositivos,

recorder = new MediaRecorder(); recorder.setAudioSource(audioSource); recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); recorder.setOutputFile(your_path);

  1. Debe configurar esto para grabar sus llamadas correctamente,

    audioManager.setMode(AudioManager.MODE_IN_CALL);

suba el nivel de volumen cuando comience a grabar audioManager.setStreamVolume(AudioManager.STREAM_VOICE_CALL,audioManager.getStreamMaxVolume(AudioManager.STREAM_VOICE_CALL), 0);

Cuando detenga la grabación, establezca el modo en normal, audioManager.setMode(AudioManager.MODE_NORMAL); y también configura el volumen de la secuencia para retroceder cómo era.


Esto podría ser un problema relacionado con el Permiso.

Con la introducción de Android 6.0 Marshmallow, la aplicación no recibirá ningún permiso en el momento de la instalación. En cambio, la aplicación tiene que pedirle al usuario permiso uno por uno en el tiempo de ejecución.

Espero que haya incluido el código que explícitamente solicita permisos en dispositivos con Marshmallow y más.



Necesitas usar ndk. Aquí hay ejemplos de las funciones que deben hacerse.

Carga libmedia.so y 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;}

Función 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;}

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

Hay una biblioteca y un ejemplo de uso https://github.com/ViktorDegtyarev/CallRecLib