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:
- Eclipse salta líneas mientras depura
- Convertir json a objeto Map.Entry con Gson
- Instalando sun-java6-jdk en ubuntu 10.04 64 bit os
- La orientación de la vista previa en el modo horizontal se gira en el sentido de las agujas del reloj con Camera2 api
- Convertir HashMap a una cadena separada por comas
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"
- CancelaciónExcepción al utilizar ExecutorService
- Java: Debería usar constructor para hacer algo más que la inicialización de las variables
- Añadir vista sobre teclado android
- Android - ViewCompat setBackgroundTintList no funciona en la API 21
- Slider en la aplicación para Android
- ¿Por qué obtengo una InvocationTargetException? Juego de Android 2D
- Cómo pasar una gran colección entre actividades (flujo de detalle maestro)
- Retrofit y Jackson y análisis de JSON
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
- Cómo configurar la imagen de pantalla de bloqueo de Android
- Android IntentService no puede instanciar clase; Sin constructor vacío