Detener e iniciar música en llamadas entrantes

Implementé una actividad que reproduce medios desde una URL en android

Para agregar una funcionalidad de pausa cuando la llamada entrante es entrante, creé un receptor que establece una variable cuando se produce la llamada. 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 siempre que la actividad tenga el foco. Si vuelvo a la pantalla de inicio mientras se reproduce la música, y luego llega la llamada, no se llama a la actividad en pausa y, por lo tanto, puedo “detener y comenzar la música”.

¿Cuál es la salida para esto? ¿Alguien implementó un reproductor de medios para que intercepte las llamadas entrantes y salientes en todo momento y se detenga 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 usando 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 utilizando 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 puede hacer es escuchar la transmisión android.intent.action.PHONE_STATE . Contendrá el TelephonyManager.EXTRA_STATE adicional que le dará información sobre la llamada. Eche un vistazo a la documentación aquí .

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

Creo que AudioManager es la mejor y más 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 ti 🙂

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

Audio Focus es cooperativo en la naturaleza. Es decir, se espera que las aplicaciones (y altamente recomendadas) cumplan con las pautas de enfoque de audio, pero el sistema no aplica las reglas. Si una aplicación desea reproducir música a alto volumen 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 que funciona mal.

Para solicitar el enfoque de audio, debe llamar a requestAudioFocus () desde AudioManager, como se muestra en 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 bien, puede probar una aplicación de receptor.

Crear 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

       

En mi humilde opinión mejor manera se describe en fuera de los documentos: http://developer.android.com/training/managing-audio/audio-focus.html

Para mí, el estado inactivo se acercaba cuando había una llamada entrante, la solución rápida es verificar el receptor de 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 } } } }; 
Intereting Posts