studio recibir intent ejemplos ejemplo definicion java android

java - recibir - service android definicion



Al registrar un botón de auricular, haga clic con BroadcastReceiver en Android (5)

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

En este momento 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); } }

Sin embargo, no sucede nada cuando presiono el botón.

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

<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" />

Noté en LogCat que cuando presiono el botón recibo un error de "BluetoothIntentReceiver" que dice "onReceive () Action: android.intent.action.MEDIA_BUTTON"


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>

NB: esto es en lugar de llamar a registerReceiver .

En la actividad principal de onCreate necesito llamar al AudioManager:

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

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


No deberías usar setPriority

Registra su receptor de difusión en el manifiesto

A continuación, registra tu receptor de emisión usando:

AudioManager # registerMediaButtonEventReceiver

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



Si no desea utilizar BroadcastReceiver, puede hacer esto para Android> 5.0 (API nivel 21 LOLLIPOP) utilizando MediaSession que se describe aquí: https://.com/a/39413753/1386969


Solo quería responder mi propia pregunta en caso de que otros encuentren problemas similares.

El código funciona, simplemente no estaba viendo el Toast porque tenía instalada otra aplicación de controlador de botón para auriculares (y se ejecutaba en segundo plano), así que supongo que tenía prioridad sobre la mía. Sin embargo cuando puse

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);

Pudo funcionar incluso con la otra aplicación instalada. Además, no necesita tanto el anterior como el XML, uno u otro está bien como formas de registrar el receptor intencionado.