¿Cómo detectar cuando un usuario se conecta auriculares en el dispositivo Android? (Opuesto de ACTION_AUDIO_BECOMING_NOISY)

Estoy desarrollando una aplicación que tiene el siguiente requisito: Si hay un auricular conectado al dispositivo y el usuario lo elimina, necesito silenciar todas las secuencias. Para hacer eso necesito escuchar el AudioManager.ACTION_AUDIO_BECOMING_NOISY Broadcast. ¡Esto esta bien! No hay problema aquí.

Pero cuando el usuario vuelva a conectar el auricular , necesito desmutar el dispositivo. Pero no hay un AudioManager.ACTION_AUDIO_BECOMING_NOISY frente a la emisión. No puedo saber cuando el auricular está enchufado de nuevo.

Una solución es ver periódicamente si AudioManager.isWiredHeadsetOn() es true pero esto no parece ser una buena solución para mí.

¿Hay una manera de detectar cuando el usuario conecta un auricular en el dispositivo?

Editado : Traté de usar Intent.ACTION_HEADSET_PLUG esta manera, pero no funcionó .

En el manifest.xml puse:

 <receiver android:name=".MusicIntentReceiver" > <intent-filter> <action android:name="android.intent.action.HEADSET_PLUG" /> </intent-filter> </receiver> 

Y aquí está el código de mi MusicIntentReceiver.java :

 public class MusicIntentReceiver extends BroadcastReceiver { public void onReceive(Context ctx, Intent intent) { AudioManager audioManager = (AudioManager)ctx.getSystemService(Context.AUDIO_SERVICE); if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) { Log.d("Let's turn the sound on!"); //other things to un-mute the streams } } } 

¿Alguna otra solución para intentarlo?

¿Qué tal esta llamada: http://developer.android.com/reference/android/content/Intent.html#ACTION_HEADSET_PLUG que encontré en Droid Incredible Headphones Detection ?

El código actualizado que veo en su pregunta ahora no es suficiente. Esa difusión sucede cuando el estado conectado cambia, ya veces cuando no lo hace, según Intent.ACTION_HEADSET_PLUG se recibe cuando la actividad comienza así que escribiría:

 package com.example.testmbr; import android.os.Bundle; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.util.Log; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private MusicIntentReceiver myReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); myReceiver = new MusicIntentReceiver(); } @Override public void onResume() { IntentFilter filter = new IntentFilter(Intent.ACTION_HEADSET_PLUG); registerReceiver(myReceiver, filter); super.onResume(); } private class MusicIntentReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) { int state = intent.getIntExtra("state", -1); switch (state) { case 0: Log.d(TAG, "Headset is unplugged"); break; case 1: Log.d(TAG, "Headset is plugged"); break; default: Log.d(TAG, "I have no idea what the headset state is"); } } } } @Override public void onPause() { unregisterReceiver(myReceiver); super.onPause(); } } 

La llamada de AudioManager.isWiredHeadsetOn () que he recomendado anteriormente resulta estar obsoleta desde la API 14, así que la reemplazé con la extracción del estado de la intención de difusión. Es posible que pueda haber múltiples transmisiones para cada conexión o desenchufado, tal vez debido a rebote de contacto en el conector.

No he trabajado con esto, pero si estoy leyendo correctamente los documentos, ACTION_AUDIO_BECOMING_NOISY es para permitir que una aplicación sepa que la entrada de audio podría comenzar a escuchar la salida de audio. Cuando desconecte el auricular, el micrófono del teléfono podría comenzar a recoger el altavoz del teléfono, de ahí el mensaje.

Por otro lado, ACTION_SCO_AUDIO_STATE_UPDATED está diseñado para informarle cuando hay un cambio en el estado de conexión de un dispositivo bluetooth.

Esa segunda es probablemente lo que quieres escuchar.

  • Android: ejecutando una tarea de fondo con AlarmManager
  • Servicios Roboeléctricos y de Intención
  • Enviar una transmisión sólo a actividades específicas
  • ¿Cómo detectar el cambio de estado Bluetooth con un receptor de difusión?
  • ¿Cómo utilizo la acción de intento USER_PRESENT?
  • ¿Cómo registrar el intentfilter personalizado para transmitir el receptor en el archivo de manifiesto?
  • Cómo ejecutar la aplicación en segundo plano en android?
  • ¿Es el contexto de la aplicación siempre el mismo sin importar la clase?
  • Registro dinámico del receptor C2DM usando registerReceiver
  • Repetir alarmas cada lunes en Android usig AlarmManager / BroadcastReceiver
  • Cómo detectar cuando se pulsa el botón de encendido en la clase Receptor de difusión cuando se activa el permiso Administrador de dispositivos en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.