Registrar un botón de auriculares haga clic con BroadcastReceiver en Android

Tengo un auricular con un solo botón y quiero hacer una simple tostada cuando se presiona el botón.

Ahora tengo el siguiente código:

public class MediaButtonIntentReceiver extends BroadcastReceiver { public MediaButtonIntentReceiver() { super(); } @Override public void onReceive(Context context, Intent intent) { String intentAction = intent.getAction(); if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { return; } KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); if (event == null) { return; } int action = event.getAction(); if (action == KeyEvent.ACTION_DOWN) { // do something Toast.makeText(context, "BUTTON PRESSED!", Toast.LENGTH_SHORT).show(); } abortBroadcast(); } } 

Y mi actividad principal es la siguiente:

 public class mainActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON); MediaButtonIntentReceiver r = new MediaButtonIntentReceiver(); registerReceiver(r, filter); } } 

Nada sucede cuando empujo el botón sin embargo.

Estoy bastante seguro de que algo está mal con mis permisos / xml en el manifiesto. Aquí está el receptor XML hasta ahora:

  <receiver android:name=".MediaButtonIntentReceiver"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </receiver> 

….

y:

 <uses-permission android:name="android.permission.BLUETOOTH" /> 

Observo en LogCat que cuando presiono el botón consigo un error de "BluetoothIntentReceiver" diciendo "onReceive () Acción: android.intent.action.MEDIA_BUTTON"

Sólo quería responder a mi propia pregunta en caso de que otros se enfrentan a problemas similares.

El código funciona, sólo que no estaba viendo el Toast porque tenía otra aplicación controlador de botón de auriculares instalado (y ejecutándose en segundo plano), así que supongo que tuvo prioridad sobre la mía. Sin embargo cuando pongo

  IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);//"android.intent.action.MEDIA_BUTTON" MediaButtonIntentReceiver r = new MediaButtonIntentReceiver(); filter.setPriority(1000); //this line sets receiver priority registerReceiver(r, filter); 

Fue capaz de trabajar incluso con la otra aplicación instalada. Además, no es necesario tanto el anterior y el XML, uno u otro está bien como formas de registrar el receptor intención.

Esto es lo que tengo que funciona en Android 4.2.2

En mi manifest.xml hago esto:

 <receiver android:name=".MediaButtonIntentReceiver"> <intent-filter> <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> 

Nota: esto es en lugar de llamar a registerReceiver .

En la actividad onCreate mi actividad principal necesito llamar al AudioManager:

 ((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver( new ComponentName( getPackageName(), MediaButtonIntentReceiever.class.getName())); 

He encontrado que funcionará sin la llamada AudioManager, pero no por mucho tiempo!

No debes usar setPriority

Registra su receptor de difusión en el manifiesto

A continuación, registre su receptor de difusión utilizando:

AudioManager # registerMediaButtonEventReceiver

El argumento a registerMediaButtonEventReceiver es un ComponentName que apunta a su receptor de difusión.

Para obtener una respuesta totalmente documentada para Android> 4,0 eche un vistazo aquí:

BroadcastReceiver para ACTION_MEDIA_BUTTON no funciona

Si no desea utilizar BroadcastReceiver, puede hacerlo para Android> 5.0 (API nivel 21 LOLLIPOP) utilizando la MediaSession descrita aquí: https://stackoverflow.com/a/39413753/1386969

  • Añadir opaco "sombra" (esquema) a Android TextView
  • Android gms: play-services: 8.1.0 DexIndexOverflowException
  • Problemas después de instalar java 8
  • Com.android.build.transform.api.TransformException
  • Android / Java rara y aparentemente imposible excepción causando fuerza cerrar
  • ¿Dónde está una lista de los códigos de idioma obsoletos que Java todavía utiliza?
  • Error de falta de memoria al analizar un JSON grande con la biblioteca de Jackson en Android
  • Android TextView NullPointerException con onTouchListener y onClickListener en 4.0
  • ¿Howt para conectar dos dispositivos vía bluetooth que envía el código pairng por el parámetro? JAVA-Android
  • ¿Diferencia entre addOnLayoutChangeListener y onLayout (cambiado)?
  • Android: Indicación de Spinner
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.