Interferencias de AudioManager MODE_IN_CALL
Estoy usando AudioManager para reproducir un sonido a través del auricular justo antes de que se coloque una llamada, así que utilizo AudioManager setMode (MODE_IN_CALL).
No estoy teniendo ningún problema, excepto en el Galaxy S3, donde después de reproducir la música correctamente, ringtone suena muy distorsionada y muy ruidosa. He leído la documentación de setMode:
- OnCompletion escucha con MediaPlayer
- Android Detener música de fondo cuando la tecla Inicio presionada
- Detener y iniciar música en las llamadas entrantes
- Cambiar la fuente de datos para la reproducción de audio usando MediaPlayer existente?
- Android ExoPlayer: ¿Resuelve el problema de reproducción sin interrupciones / sin fisuras que está roto para el reproductor de medios Android
The audio mode encompasses audio routing AND the behavior of the telephony layer. Therefore this method should only be used by applications that replace the platform-wide management of audio settings or the main telephony application. In particular, the MODE_IN_CALL mode should only be used by the telephony application when it places a phone call, as it will cause signals from the radio layer to feed the platform mixer.
Por lo tanto, sospecho que puede haber señales de la plataforma de alimentación de plataforma de la plataforma mezcladora.
Así que el código que estoy usando es así:
am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); speakerWasOn = am.isSpeakerphoneOn(); speakerPrevMode = am.getMode(); bthA2dpWasOn = am.isBluetoothA2dpOn(); bthScoWasOn = am.isBluetoothScoOn(); if (BluetoothBR.bthOn && BluetoothBR.conectarBluetooth()) { am.setMode(AudioManager.STREAM_VOICE_CALL); am.setBluetoothA2dpOn(true); am.setBluetoothScoOn(true); } else { am.setSpeakerphoneOn(false); am.setMode(AudioManager.MODE_IN_CALL); }
Luego utilizo MediaPlayer para reproducir el archivo .mp3 en un hilo separado:
private OnPreparedListener opl = new OnPreparedListener() { public void onPrepared(MediaPlayer mp) { try { mp.setVolume(1.0f, 1.0f); mp.start(); } catch (Throwable e) { e.printStackTrace(); mp.release(); } } }; private OnCompletionListener ocl = new OnCompletionListener() { public void onCompletion(MediaPlayer mp) { stop(); } }; public void run() { synchronized (mp) { FileInputStream fis = null; try { fis = new FileInputStream(getMp3FilePath()); mp.setDataSource(fis.getFD()); mp.setOnPreparedListener(opl); mp.setOnCompletionListener(ocl); mp.prepare(); fis.close(); } catch (Exception e) { mp.release(); if (fis != null) { try { fis.close(); } catch (IOException e1) { e1.printStackTrace(); } } } } } public void stop() { if (mp != null) { try { mp.stop(); mp.release(); mp.setVolume(0.5f, 0.5f); mp.reset(); } catch (Exception ignored) { } } if (BluetoothBR.bthOn) { BluetoothBR.desconectarBluetooth(); } }
Y cuando la música se hace llamo:
am.setSpeakerphoneOn(speakerWasOn); am.setMode(speakerPrevMode); am.setBluetoothA2dpOn(bthA2dpWasOn); am.setBluetoothScoOn(bthScoWasOn);
Esto sólo está ocurriendo en Samsung Galaxy S3 (afaik) y ha sido probado en S2, Huawei, SonyEricsson y otros y funciona correctamente.
¿Algunas ideas? Gracias
ACTUALIZAR:
He descubierto que todo funciona bien si el hilo espera 5 segundos cuando la música termina y después de configurar AudioManager a su estado original.
am.setSpeakerphoneOn(speakerWasOn); am.setMode(speakerPrevMode); am.setBluetoothA2dpOn(bthA2dpWasOn); am.setBluetoothScoOn(bthScoWasOn); long ctime = System.currentTimeMillis(); while (System.currentTimeMillis() - ctime < 5000);
- Error de MediaPlayer de Android: Error de MediaPlayer (1, -2147483648) en Stream de Internet
- Reproductor de video nativo de Android con subtítulos
- Cambiar URI de MediaPlayer
- Reproductor multimedia de Android juega en el fondo, pero no se detiene cuando se mata la aplicación
- Android Media Player: Inicio llamado en estado 4 error (-38,0)
- Contexto dentro de un Runnable
- Android 4.0.4 MediaPlayer prepara el problema usando urls RTSP
- MediaPlayer.setDataSource provoca IOException para archivo válido
Yo tuve el mismo problema. Cuando comenté esta línea
am.setMode(AudioManager.MODE_IN_CALL);
Todo funcionó bien para mí.
- Hit fetch sugerido límite de tasa de clúster de grupo
- Phonegap vs nativo en la prueba de rendimiento de Android