¿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.

  • Escuchar el botón de volumen cuando el teléfono está bloqueado android
  • BroadcastReceiver no funciona cuando la aplicación no se está ejecutando
  • Compruebe si el servicio se está ejecutando desde un receptor de difusión
  • BroadcastReceiver no recibe BOOT_COMPLETED
  • El receptor de difusión de Android no recibe ACTION_SCREEN_ON
  • Obtenga nivel de batería antes de que el receptor responda por Intent.ACTION_BATTERY_CHANGED
  • SMS enviados / entregados: ¿cómo identificas a qué SMS pertenece la emisión?
  • Actividad abierta dos veces
  • Determinar la entrada específica del cargador
  • Restricción de Android Broadcast Receiver de una aplicación específica
  • BroadcastReceiver recibe varios mensajes idénticos para un evento
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.