studio play mediaplayer example developer android broadcastreceiver android-audiomanager

android - play - KeyEvent.ACTION_UP disparó DOS VECES para ACTION_MEDIA_BUTTON



play video android (3)

Tengo este receptor de difusión para ACTION_MEDIA_BUTTON que en realidad funciona con Android 2.xy Android 4.1, pero por alguna extraña razón, en Android 2.x (solo) , recibo cada uno dos veces (para un solo clic en el botón de pausa, por supuesto):

public class RemoteControlReceiver extends BroadcastReceiver { private static long prevEventTime = 0; @Override public void onReceive(Context ctx, Intent intent) { if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); long curEventTime = event.getEventTime(); if (event != null && (event.getAction() == KeyEvent.ACTION_UP) /*&& (curEventTime != prevEventTime)*/) { int keycode = event.getKeyCode(); switch (keycode) { case KeyEvent.KEYCODE_MEDIA_NEXT: Log.i(TAG, "KEYCODE_MEDIA_NEXT"); break; case KeyEvent.KEYCODE_HEADSETHOOK: Log.i(TAG, "KEYCODE_HEADSETHOOK" + " " + curEventTime + " <> " + prevEventTime + " (" + event.getAction() + ")"); prevEventTime = curEventTime; break; case KeyEvent.KEYCODE_MEDIA_PREVIOUS: Log.i(TAG, "KEYCODE_MEDIA_PREVIOUS"); break; default: } } } } }

Intentando entender el misterio, registro el tiempo del evento para cada evento:

03-01 18:27:05.264: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142304436 <> 0 (1) 03-01 18:27:05.434: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142304436 <> 142304436 (1) 03-01 18:27:14.054: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142313265 <> 142304436 (1) 03-01 18:27:14.074: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142313265 <> 142313265 (1) 03-01 18:27:24.254: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142323464 <> 142313265 (1) 03-01 18:27:24.264: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142323464 <> 142323464 (1) 03-01 18:27:37.574: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142336795 <> 142323464 (1) 03-01 18:27:37.614: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142336795 <> 142336795 (1) 03-01 18:27:45.214: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142344433 <> 142336795 (1) 03-01 18:27:45.284: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142344433 <> 142344433 (1) 03-01 18:27:52.474: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142351687 <> 142344433 (1) 03-01 18:27:52.504: I/RemoteControlReceiver.onReceive(22377): KEYCODE_HEADSETHOOK 142351687 <> 142351687 (1)

Una vez más, esta doble aparición no ocurre en Android 4.1. Solo pasa en Android 2.x.

¿Alguna idea de por qué?

(Si bien puedo usar la misma técnica de registro de tiempo de eventos para filtrar la segunda aparición, prefiero entender primero lo que está pasando (¿es posible un error de programación?) y ver si hay una mejor solución para eso)

Respondiendo a la pregunta a continuación: ("cómo registra exactamente su receptor")

Primero en el manifiesto de la aplicación:

<receiver android:name="com.example.mylib.RemoteControlReceiver" android:enabled="true"> <intent-filter android:priority="2147483647" > <action android:name="android.intent.action.MEDIA_BUTTON" /> </intent-filter> </receiver>

Luego, en la actividad de mi biblioteca (según este consejo ), en OnCreate ():

mRemoteControlReceiver = new ComponentName(this, RemoteControlReceiver.class); mAudioManager.registerMediaButtonEventReceiver(mRemoteControlReceiver);

Espero que esto proporcione una imagen más completa que pueda ayudar a resolver este misterio.


Me encontré con este problema y pasé un rato golpeando mi cabeza contra la pared antes de darme cuenta de que cada pulsación del botón genera dos eventos: un KeyEvent.ACTION_DOWN y un KeyEvent.ACTION_UP. Así que se necesitan dos pruebas para usar un botón de medios:

if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {}

y

if (event.getAction() == KeyEvent.ACTION_DOWN) {}

Entonces, si alguien más se encuentra aquí como resultado del mismo error, tal vez esta respuesta ayude.


Noté que está utilizando este receptor en una biblioteca (la parte "mylib" en su manifiesto).

Si este es el caso y tiene el receptor registrado por dos aplicaciones que comparten el mismo código de registro, verá esos eventos dos veces .

Si tres aplicaciones registran ese receptor, recibirás esos eventos triplicados ...

Asegúrese de que cada aplicación use un nombre diferente (único) <receiver android:name .


Para asegurarse de que sea la primera vez, siempre puede usar una marca para indicar que es la primera acción.

boolean firstAction= false; if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { firstAction= !firstAction; if(!firstAction) { return true; } KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); long curEventTime = event.getEventTime(); if (event != null && (event.getAction() == KeyEvent.ACTION_UP) /*&& (curEventTime != prevEventTime)*/) { int keycode = event.getKeyCode(); switch (keycode) { case KeyEvent.KEYCODE_MEDIA_NEXT: Log.i(TAG, "KEYCODE_MEDIA_NEXT"); break; case KeyEvent.KEYCODE_HEADSETHOOK: Log.i(TAG, "KEYCODE_HEADSETHOOK" + " " + curEventTime + " <> " + prevEventTime + " (" + event.getAction() + ")"); prevEventTime = curEventTime; break; case KeyEvent.KEYCODE_MEDIA_PREVIOUS: Log.i(TAG, "KEYCODE_MEDIA_PREVIOUS"); break; default: } } }