Estoy tratando de detener la música que se está reproduciendo cuando el auricular está desenchufado.

He creado un BroadcastReceiver que escucha ACTION_HEADSET_PLUG las intenciones y los actos sobre ellos cuando el estado extra es 0 (desconectado). Mi problema es que una ACTION_HEADSET_PLUG intención es recibido por mi BroadcastReceiver siempre que la actividad se ha iniciado. Este no es el comportamiento que se esperaría. Yo esperaría que la Intención de ser despedido sólo cuando el auricular está conectado o desconectado.

Hay una razón por la que el ACTION_HEADSET_PLUG Intención es capturado inmediatamente después de registrar un receptor con el que IntentFilter? Es allí una manera clara que puedo trabajar con este problema?

Quiero suponer que ya que por defecto el reproductor de música implementa una funcionalidad similar cuando el auricular está desconectado de que sería posible.

Lo que me estoy perdiendo?

Este es el código de registro

registerReceiver(new HeadsetConnectionReceiver(), 
                 new IntentFilter(Intent.ACTION_HEADSET_PLUG));

Esta es la definición de HeadsetConnectionReceiver

public class HeadsetConnectionReceiver extends BroadcastReceiver {

    public void onReceive(Context context, Intent intent) {
        Log.w(TAG, "ACTION_HEADSET_PLUG Intent received");
    }

}

OriginalEl autor Doug Miller | 2010-11-03

3 Comentarios

  1. 16

    Gracias por la respuesta de Jake. Yo debería haber actualizado el post original para indicar que he descubierto el problema que estaba teniendo. Después de un poco de investigación, descubrí que el ACTION_HEADSET_PLUG Intención es transmitir utilizando el sendStickyBroadcast método en el Contexto.

    Pegajosa Intentos se llevan a cabo por el sistema después de su emisión. Que la Intención será capturado cuando un nuevo BroadcastReceiver está registrado para recibir. Se activa inmediatamente después de la inscripción que contiene el último valor actualizado. En el caso de los auriculares, esto es útil para poder determinar que el auricular está conectado al primer registro de su receptor.

    Este es el código que he utilizado para recibir la ACTION_HEADSET_PLUG Intención:

     private boolean headsetConnected = false;
    
     public void onReceive(Context context, Intent intent) {
         if (intent.hasExtra("state")){
             if (headsetConnected && intent.getIntExtra("state", 0) == 0){
                 headsetConnected = false;
                 if (isPlaying()){
                    stopStreaming();
                 }
             } else if (!headsetConnected && intent.getIntExtra("state", 0) == 1){
                headsetConnected = true;
             }
         }
     }
    Una solución alternativa sería el uso de la removeStickyBroadcast() método, para los casos donde no se puede simplemente ignorar las órdenes cuando su servicio isPlaying.
    Creo que una mejor solución es el uso de isInitialStickyBroadcast() en su receptor. Esto no requiere de la definición de el permiso para eliminar pegajosa emisiones, y no causa efectos secundarios a otras aplicaciones.
    Hola de nuevo Doug. Yo podría haber entendido algo acerca de este propósito, el receptor de sistema de android. Pero, ¿cómo tener acceso a isPlaying, me gustaría reconocer ellas en su actividad original? 🙂
    Anders: Siento que me tomó tanto tiempo para encontrar a su pregunta. Estoy definiendo mi HeadsetBroadcastReceiver dentro de un Servicio. El isPlaying método está definido en el Servicio.
    Doug he resuelto la comprobación de isInitialStickyBroadcast() 🙂 Gracias de todos modos por la pregunta

    OriginalEl autor Doug Miller

  2. 0

    Yo uso un enfoque diferente para detener la reproducción cuando el auricular se desconecte. No quiero que lo use, ya que ya están bien, pero otras personas pueden encontrar útil. Si usted tiene el control de audio de enfoque, Android enviaremos un evento de audio convertirse en ruido, por lo que si usted escribe un receptor para este evento se verá como

     public void onReceive(Context context, Intent intent) {
    if  (AudioManager.ACTION_AUDIO_BECOMING_NOISY.equals(intent.getAction())) { 
           if (isPlaying()){
                stopStreaming();
            }
        }
     }

    OriginalEl autor Don Cesar D’Bazar

  3. -2

    Me encontré con el mismo problema. No estoy seguro de cuál es su causa, pero al menos en mis pruebas parece ser coherente, lo que significa que usted puede trabajar alrededor de ella. Lo hizo mediante la adición de una variable miembro boolean que comienza como verdadero, y está establecida en false en el primer onReceive(Context, Intent) llamada. Este indicador, a continuación, controla si yo en realidad el proceso de la desenchufe el evento o no.

    Para su referencia, aquí está el código que uso para hacer precisamente eso, que está disponible en el contexto aquí.

    private boolean isFirst;
    
    public void onReceive(Context context, Intent intent)
    {
        if(!isFirst)
        {
            //Do stuff...
        }
        else
        {
            Log.d("Hearing Saver", "First run receieved.");
            isFirst = false;
        }
    }
    Mejor uso isInitialStickyBroadcast (), como se sugiere en otro comentario.

    OriginalEl autor Jake Basile

Dejar respuesta

Please enter your comment!
Please enter your name here