KeyEvent.ACTION_UP activado DOS VECES para ACTION_MEDIA_BUTTON

Tengo este receptor de la difusión para ACTION_MEDIA_BUTTON que trabaja realmente para el androide 2.x y el androide 4.1, pero por alguna razón extraña, en 2.x de Androide (solamente) , consigo cada incluso dos veces (para un solo tecleo en el botón de la 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 ocurrencia de este tipo:

 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 ocurrencia no sucede en Android 4.1. Solo ocurre en Android 2.x.

¿Alguna idea de por qué?

(Mientras puedo usar la misma técnica de registro de tiempo de evento para filtrar la segunda ocurrencia, prefiero entender primero lo que está pasando (posible error de programación de mi lado?) Y ver si hay una solución mejor para eso)


Respondiendo a la pregunta a continuación: ("cómo exactamente registra 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> 

Entonces, en la actividad de mi biblioteca (por este consejo ), en OnCreate ():

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

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

Me di cuenta de que está utilizando este receptor en una biblioteca (la parte "mylib" en su manifiesto).

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

Si tres aplicaciones registran ese receptor, usted recibirá esos eventos triplicados …

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

Corrí a través de este problema y pasé un tiempo golpeando mi cabeza contra la pared antes de darse cuenta de que cada pulsación del botón genera dos eventos: un KeyEvent.ACTION_DOWN, y un KeyEvent.ACTION_UP. Por lo tanto, se necesitan dos pruebas para usar un botón multimedia:

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

y

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

Así que si alguien se encuentra aquí como resultado del mismo error, tal vez esta respuesta le ayudará.

Para asegurarse de que es la primera vez siempre se puede utilizar una bandera para decir 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: } } } 
  • Abra la actividad haciendo clic en la notificación push de Parse
  • Clear Aplicaciones recientes limpiar la memoria de aplicaciones y mi receptor dejó de funcionar
  • Repetir alarmas cada lunes en Android usig AlarmManager / BroadcastReceiver
  • ¿Por qué noftificaciones aparecen en la barra de notificación de Android por un tiempo, entonces desaparece
  • Android: la actividad se ha filtrado IntentReceiver
  • Llamar un método de actividad de BroadcastReceiver en Android
  • Mal comportamiento de Backstack de la actividad cuando la actividad destruida
  • SMS Broadcast Receiver no se llama en Android 6
  • Registro y cancelación del registro de BroadcastReceiver en un fragmento
  • Creación de una notificación en un momento determinado mediante el Administrador de alarmas
  • Cómo detectar los eventos de MediaPlayer de youtube desde un servicio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.