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
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" />
-
MediaRecorder.AudioSource.VOICE_CALL
no es compatible con todos los teléfonos, por lo que debe seguir utilizandoMediaRecorder.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);
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.
Los dispositivos Xiaomi siempre tienen problemas con la solicitud de permisos, incluso en tiempo de ejecución o de instalación.
Tengo un Xiaomi Redmi 3 pro, y siempre obliga a Denegar algún permiso cuando instalo aplicaciones, así que debo permitirlo manualmente. Si su problema es el mismo, encontré una solución provisional y funcionó para mí: ¿Cómo obtener el permiso de inicio automático de la aplicación MIUI Security mediante programación?
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
tratar
MediaRecorder.AudioSource.VOICE_COMMUNICATION
y ver
https://androidforums.com/threads/android-phone-with-call-recording-function.181663/