¿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.
- No se puede encontrar el receptor definido Definido ~ 1% del tiempo
- Cómo anular el registro de escuchas y detener el servicio desde dentro de broadcastreceiver
- PendingIntent obtener requestCode
- SMS recibidos en mi aplicación de SMS y en Hangouts, aunque llamo a abortBroadcast ()
- No se puede instanciar el receptor, java.lang.IllegalAccessException: acceso a la clase no permitido
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?
- ¿No puedo recibir la emisión en el cambio de estado de la batería?
- Android: ¿por qué se detuvo la notificación de alarma después de reiniciar el sistema
- Extras de Android PendingIntent, no recibidos por BroadcastReceiver
- ¿Cómo distinguir el estado de encendido / apagado de la pantalla durante la llamada entrante?
- Administrador de alarmas que no funciona en intervalos de tiempo específicos
- Android detectar Bluetooth desconectar inmediatamente Máximo 2 segundos
- Aplicación de inicio automático después del arranque completado en Android
- ¿Dónde debo usar Servicio, AsyncTask y Broadcast Receiver?
¿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.
- Las dependencias circulares no pueden existir en RelativeLayout, android?
- Datepicker: Cómo popup datepicker cuando haga clic en el botón y almacenar valor en variable