Detener y iniciar música en las llamadas entrantes

He implementado una actividad que reproduce medios desde una URL en android

Para agregar funcionalidad de pausa cuando la llamada entrante es entrante creé un receptor que establece una variable aa cuando la llamada está llegando. La actividad lee esta variable y luego pausa la música en su método onPause () y se restablece cuando se realiza la llamada y la actividad reanuda la música en su método onResume ()

Esto funciona bien mientras la actividad tenga el foco. Si vuelvo a la pantalla de inicio mientras la música está sonando, y luego la llamada llega, la onpausa de la actividad no se llama y por lo tanto puedo 'parar y comenzar la música

¿Cuál es la salida para esto? ¿Alguien implementó un reproductor multimedia para que intercepte las llamadas entrantes y salientes en todos los tiempos y paradas e inicie la música correctamente?

Hay algunas cosas que puedes hacer:

En primer lugar, puede escuchar los cambios en el estado de la llamada utilizando un PhoneStateListener . Puede registrar el oyente en TelephonyManager:

 PhoneStateListener phoneStateListener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String incomingNumber) { if (state == TelephonyManager.CALL_STATE_RINGING) { //Incoming call: Pause music } else if(state == TelephonyManager.CALL_STATE_IDLE) { //Not in call: Play music } else if(state == TelephonyManager.CALL_STATE_OFFHOOK) { //A call is dialing, active or on hold } super.onCallStateChanged(state, incomingNumber); } }; TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); if(mgr != null) { mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE); } 

Recuerde anular el registro del oyente cuando ya no sea necesario usar el PhoneStateListener.LISTEN_NONE :

 TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); if(mgr != null) { mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); } 

Para más información lea la documentación .

Otra cosa que puedes hacer es escuchar la emisión android.intent.action.PHONE_STATE . Contendrá el TelephonyManager.EXTRA_STATE adicional que le proporcionará información sobre la llamada. Echa un vistazo a la documentación aquí .

Tenga en cuenta que necesitará el permiso android.permission.READ_PHONE_STATE en ambos casos.

Creo que AudioManager es la mejor y rápida solución. Aquí está mi ejemplo de implementación:

 public class MyActivity extends Activity implements OnAudioFocusChangeListener { private AudioManager mAudioManager; @Override public void onCreate(Bundle savedInstanceState) { ... mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); mAudioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); ... } @Override public void onDestroy(){ super.onDestroy(); ... mAudioManager.abandonAudioFocus(this); ... } @Override public void onAudioFocusChange(int focusChange) { if(focusChange<=0) { //LOSS -> PAUSE } else { //GAIN -> PLAY } } 

}

Espero que sea útil para usted 🙂

Creo que requestAudioFocus () debería ser capaz de manejar este caso automáticamente. No es necesario comprobar explícitamente el estado de la llamada.

Audio Focus es cooperativo en la naturaleza. Es decir, las aplicaciones se esperan (y altamente alentadas) para cumplir con las directrices de enfoque de audio, pero las reglas no son aplicadas por el sistema. Si una aplicación desea reproducir música fuerte incluso después de perder el foco de audio, nada en el sistema evitará eso. Sin embargo, es más probable que el usuario tenga una mala experiencia y será más probable que desinstale la aplicación de mala conducta.

Para solicitar el enfoque de audio, debe llamar a requestAudioFocus () desde AudioManager, como muestra el siguiente ejemplo:

 AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // could not get audio focus. } 

O – Puede probar una Solicitud de Receptor.

Cree un receptor llamado CallRecord.java

 package com.example.callreceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; public class CallReceiver extends BroadcastReceiver{ TelephonyManager telManager; Context context; @Override public void onReceive(Context context, Intent intent) { this.context=context; telManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); telManager.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE); } private final PhoneStateListener phoneListener = new PhoneStateListener() { @Override public void onCallStateChanged(int state, String incomingNumber) { try { switch (state) { case TelephonyManager.CALL_STATE_RINGING: { //PAUSE break; } case TelephonyManager.CALL_STATE_OFFHOOK: { break; } case TelephonyManager.CALL_STATE_IDLE: { //PLAY break; } default: { } } } catch (Exception ex) { } } }; } 

A continuación, agregue esta línea en el archivo manifest.xml para registrarlo en la aplicación

 <receiver android:name="CallReceiver" > <intent-filter> <action android:name="android.intent.action.PHONE_STATE" > </action> </intent-filter> </receiver> 

Para mí el estado ocioso estaba viniendo mientras había llamada entrante, la solución rápida es comprobar en el receptor de la difusión

 BroadcastReceiver phonestatereceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Bundle extras = intent.getExtras(); if (extras != null) { String state = extras.getString(TelephonyManager.EXTRA_STATE); if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { //pause here } else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) { //pause here } else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) { //play here } } } }; 
  • Ecualizador - Biblioteca de efectos no cargada
  • Transmisión en vivo de audio retrasos mientras se reproduce en android-16?
  • Android Media Grabación utilizando hilos
  • Android - QCMediaPlayer mediaplayer NO está presente - no puede reproducir sonido en absoluto
  • Android - MediaPlayer + PowerManager.PARTIAL_WAKE_LOCK
  • Surafce ha sido liberado error
  • Android Cómo obtener información de ID de una sola canción desde un URI conocido
  • Android MediaPlayer Streaming desde un redireccionamiento PHP no funciona-out!
  • Flujo de problemas de audio en ICS
  • MediaPlayer.setDataSource provoca IOException para archivo válido
  • Android: MediaPlayer, ¿Cómo obtener las propiedades de un flujo de audio?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.