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:
- Ciclo de vida de BroadcastReciever - Variables estáticas
- Cómo detectar nuevas aplicaciones en un dispositivo Android
- ¿Por qué no hay instrumentación de prueba para BroadcastReceiver?
- Implementar receptor de difusión dentro del servicio
- Enviar la emisión con la combinación de localbroadcastmanager sendorderedbroadcast
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.
- Detectar qué tarjeta SIM ha recibido el mensaje
- Bloquear Auth0 para android no devolver UserProfile en la autenticación
- Cómo supervisar el cambio de estado de SIM
- Android: errores de difusión no ordenados con GCM
- Cómo modificar la vista de la pantalla de llamadas entrantes y salientes en android
- Android: ¿por qué se detuvo la notificación de alarma después de reiniciar el sistema
- Receptor de difusión para llamadas perdidas en android
- ¿Cómo enviar sms al apagar el teléfono en android?
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: } } }
- Androide logcat registra la línea del módulo chatty expirar mensaje
- SDK Manager no tiene imágenes de sistema Android más antiguas para el emulador