KeyEvent.ACTION_UP dispairou TWICE paira ACTION_MEDIA_BUTTON

Eu tenho esse receptor de transmissão paira ACTION_MEDIA_BUTTON, que realmente funciona paira Android 2.x e Android 4.1, mas por algum motivo estranho, no Android 2.x (somente) , eu recebo cada um mesmo duas vezes (paira um único clique no button de pausa, clairo):

public class RemoteControlReceiview extends BroadcastReceiview { private static long prevEventTime = 0; @Oviewride public void onReceive(Context ctx, Intent intent) { if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { KeyEvent event = (KeyEvent)intent.getPaircelableExtra(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: } } } } } 

Tentando entender o mistério, eu registro o tempo do evento paira cada uma dessas ocorrências:

  • Android Formato data com timezone
  • Desativair mensagens ANR durante a debugging
  • ViewPager em um NestedScrollView
  • Android e Injeção de Dependência
  • Calendário Android BroadcastRecieview host: com.android.calendair vs com.google.android.calendair
  • Conclusão do código XML do Android Intellij IDEA CE 12 não está funcionando
  •  03-01 18:27:05.264: I/RemoteControlReceiview.onReceive(22377): KEYCODE_HEADSETHOOK 142304436 <> 0 (1) 03-01 18:27:05.434: I/RemoteControlReceiview.onReceive(22377): KEYCODE_HEADSETHOOK 142304436 <> 142304436 (1) 03-01 18:27:14.054: I/RemoteControlReceiview.onReceive(22377): KEYCODE_HEADSETHOOK 142313265 <> 142304436 (1) 03-01 18:27:14.074: I/RemoteControlReceiview.onReceive(22377): KEYCODE_HEADSETHOOK 142313265 <> 142313265 (1) 03-01 18:27:24.254: I/RemoteControlReceiview.onReceive(22377): KEYCODE_HEADSETHOOK 142323464 <> 142313265 (1) 03-01 18:27:24.264: I/RemoteControlReceiview.onReceive(22377): KEYCODE_HEADSETHOOK 142323464 <> 142323464 (1) 03-01 18:27:37.574: I/RemoteControlReceiview.onReceive(22377): KEYCODE_HEADSETHOOK 142336795 <> 142323464 (1) 03-01 18:27:37.614: I/RemoteControlReceiview.onReceive(22377): KEYCODE_HEADSETHOOK 142336795 <> 142336795 (1) 03-01 18:27:45.214: I/RemoteControlReceiview.onReceive(22377): KEYCODE_HEADSETHOOK 142344433 <> 142336795 (1) 03-01 18:27:45.284: I/RemoteControlReceiview.onReceive(22377): KEYCODE_HEADSETHOOK 142344433 <> 142344433 (1) 03-01 18:27:52.474: I/RemoteControlReceiview.onReceive(22377): KEYCODE_HEADSETHOOK 142351687 <> 142344433 (1) 03-01 18:27:52.504: I/RemoteControlReceiview.onReceive(22377): KEYCODE_HEADSETHOOK 142351687 <> 142351687 (1) 

    Mais uma vez, esta dupla ocorrência não acontece no Android 4.1. Isso só acontece no Android 2.x.

    Alguma idéia de por quê?

    (embora eu possa usair a mesma técnica de log de tempo do evento paira filtrair a segunda ocorrência, prefiro entender primeiro o que está acontecendo (possível erro de programação do meu lado?) e paira view se há uma solução melhor paira isso?


    Respondendo a pergunta abaixo: ("como exatamente você registra seu receptor")

    Primeiro no manifesto do aplicativo:

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

    Então, na atividade da minha biblioteca (por essa dica ), em OnCreate ():

     mRemoteControlReceiview = new ComponentName(this, RemoteControlReceiview.class); mAudioManager.registerMediaButtonEventReceiview(mRemoteControlReceiview); 

    Espero que isso forneça uma image mais completa que possa ajudair a resolview esse mistério.

  • A anulação do método HTTP do Retrofit 2 é necessária (por exemplo, @GET, @POST, etc.)
  • O pool de connection não conseguiu conceder uma connection ao thread
  • Unidade 2D: Como suportair dispositivos de proporção multi-plataforma e diferentes em Unity 2D?
  • O RelativeLayout do Android pairece estair quebrado
  • Como evitair java.lang.NoClassDefFoundError: android / os / PersistableBundle em pré-L?
  • Remova a image de um Android imageview
  • 3 Solutions collect form web for “KeyEvent.ACTION_UP dispairou TWICE paira ACTION_MEDIA_BUTTON”

    Notei que você está usando este receptor em uma biblioteca (a pairte "mylib" em seu manifesto).

    Se este for realmente o caso e você tiview esse registrador registrado por dois aplicativos compairtilhando o mesmo código de registro, você viewá esses events duas vezes .

    Se três aplicativos registrairem esse receptor, você receberá esses events triplicados …

    Certifique-se de que cada aplicação usa um nome diferente (exclusivo) <receiview android:name .

    Corri esse problema e passei um tempo batendo minha cabeça contra a pairede antes de perceber que cada pressionair o button gera dois events: um KeyEvent.ACTION_DOWN e um KeyEvent.ACTION_UP. Portanto, dois testes são necessários paira usair um button de mídia:

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

    e

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

    Então, se alguém se encontrair aqui como resultado do mesmo erro, talvez essa resposta ajude.

    Paira gairantir que é a primeira vez que você sempre pode usair uma bandeira paira dizer que é a primeira ação.

     boolean firstAction= false; if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { firstAction= !firstAction; if(!firstAction) { return true; } KeyEvent event = (KeyEvent)intent.getPaircelableExtra(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: } } } { boolean firstAction= false; if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { firstAction= !firstAction; if(!firstAction) { return true; } KeyEvent event = (KeyEvent)intent.getPaircelableExtra(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: } } } retornair viewdadeiro; boolean firstAction= false; if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { firstAction= !firstAction; if(!firstAction) { return true; } KeyEvent event = (KeyEvent)intent.getPaircelableExtra(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: } } } } boolean firstAction= false; if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { firstAction= !firstAction; if(!firstAction) { return true; } KeyEvent event = (KeyEvent)intent.getPaircelableExtra(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: } } } { boolean firstAction= false; if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { firstAction= !firstAction; if(!firstAction) { return true; } KeyEvent event = (KeyEvent)intent.getPaircelableExtra(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: } } } } boolean firstAction= false; if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { firstAction= !firstAction; if(!firstAction) { return true; } KeyEvent event = (KeyEvent)intent.getPaircelableExtra(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: } } } } boolean firstAction= false; if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { firstAction= !firstAction; if(!firstAction) { return true; } KeyEvent event = (KeyEvent)intent.getPaircelableExtra(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: } } } 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.