2011-04-10 15 views
50

he implementado una Actividad que reproduce archivos multimedia desde una URL en AndroidDetener y A partir de la música en las llamadas entrantes

Con el fin de agregar funcionalidad de pausa cuando la llamada entrante es entrante creé un receptor que establece aa variable cuando la llamada está viniendo. 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 regreso a la pantalla principal mientras se reproduce la música, y luego entra la llamada, onPause de la actividad no se llama & por lo tanto, no puedo dejar de & iniciar la música

¿Cuál es la forma de salir de esto? ¿Alguien implementó un reproductor multimedia para interceptar las llamadas entrantes & salientes en todos los momentos & para y comienza la música correctamente?

Respuesta

88

Hay algunas cosas que puede hacer:

En primer lugar, se pueden detectar cambios en el estado de la llamada utilizando un PhoneStateListener. Puede registrar el detector en el 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 a anular el registro del oyente cuando es ya no es necesario usar el PhoneStateListener.LISTEN_NONE:

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

For more information read the documentation.

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. Take a look at the documentation here.

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

+0

¿Es necesario registrarse el PhoneStateListener en mi actividad que reproduce música? ¿Qué pasa si esa actividad ha perdido el enfoque? ¿Seguirá trabajando el oyente? – user669231

+2

Sí, el oyente debe estar registrado en la actividad que reproduce música, y se llamará si la actividad ha perdido el enfoque (siempre que no se haya eliminado). Sin embargo, puede ser más apropiado usar un Servicio para reproducir la música en lugar de una Actividad ya que la Actividad puede ser eliminada. – Kaloer

+2

Esto funcionó para mí. Creé un servicio y registré elteléfonoteléfono en él. Ahora, incluso si mi actividad pierde el foco (como el usuario va a la pantalla de inicio presionando el botón de inicio), se detectan las llamadas entrantes y puedo detener e iniciar la música – user669231

12

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

Audio Focus es de naturaleza cooperativa. 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.

Solicitar enfoque de audio, debe llamar requestAudioFocus() desde el Administrador de audio, como el ejemplo siguiente demuestra:

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. 
} 
+0

Esto no manejará bien las llamadas entrantes. - Parecen esquivar el audio automáticamente, pero las llamadas entrantes no activan 'onAudioFocusChange'. –

+2

Esta es la forma recomendada de acuerdo con los documentos: http://developer.android.com/intl/ru/guide/topics/media/mediaplayer.html – david72

12

O - Usted puede tratar de un receptor de aplicación.

Crear un receptor nombrado 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, añadir esta línea en manifiesto.xml archivo para registrarlo en la App

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

No me gusta el nombre de ese receptor :) –

+0

100% de trabajo código. muy bueno –

1

Para mi estado de reposo venía mientras que no hubo llamada entrante, la solución rápida es comprobar en el receptor de radiodifusió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 
     } 
    } 
    } 
}; 
34

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 usted :-)

+3

Aquellos que quieren controlar no solo GSM entrantes sino también Voz VOIP como Skype, Facebook y luego seguir el camino como se explica en @mickesource. –

+1

He implementado esto en mi servicio de música como "ServiceMusicPlayer clase pública se extiende servicio implementa AudioManager.OnAudioFocusChangeListener" y funciona muy bien Gracias! –

Cuestiones relacionadas