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:

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

Yo tuve el mismo problema. Cuando comenté esta línea

 am.setMode(AudioManager.MODE_IN_CALL); 

Todo funcionó bien para mí.

  • Forzar el vídeo para que se reproduzca en Orientación vertical sólo con MediaPlayer y VideoView
  • Java.lang.RuntimeException: No se puede inicializar el motor Visualizer, error: -4
  • El reproductor de video apaga el modo en Android usando appcompat-v7
  • MediaPlayer java.io.IOException: Prepare failed .: status = 0x1 con Huawei ALE-L21
  • Transmisión al MediaPlayer de Android
  • Android lo que hace exactamente error mediaplayer 1, -107
  • ¿Cómo puedo solucionar mi error de "No puedo crear un reproductor multimedia"?
  • Android Reproducción de archivos de película en un fondo de pantalla en vivo
  • ¿Cómo apoyar MOV (tiempo rápido) en android?
  • AudioTrack, SoundPool o MediaPlayer ¿Qué debo usar?
  • Compruebe si onStop se llama desde la interacción del usuario, o se atenúa la pantalla
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.