Android KeyEvent.ACTION\u为ACTION\u MEDIA\u按钮启动两次

Android KeyEvent.ACTION\u为ACTION\u MEDIA\u按钮启动两次,android,broadcastreceiver,android-audiomanager,Android,Broadcastreceiver,Android Audiomanager,我有一个用于ACTION_MEDIA_的广播接收器按钮,它实际上适用于Android 2.x和Android 4.1,但出于某种奇怪的原因,在Android 2.x(仅)上,我会让每个按钮两次都是偶数(当然,在暂停按钮上单击): 我希望这能提供一个更完整的画面,有助于解开这个谜团。为了确保这是第一次,你可以使用一个标志来告诉自己这是第一次行动 boolean firstAction= false; if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getA

我有一个用于ACTION_MEDIA_的广播接收器按钮,它实际上适用于Android 2.x和Android 4.1,但出于某种奇怪的原因,在Android 2.x(仅)上,我会让每个按钮两次都是偶数(当然,在暂停按钮上单击):


我希望这能提供一个更完整的画面,有助于解开这个谜团。

为了确保这是第一次,你可以使用一个标志来告诉自己这是第一次行动

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:
        }
    }     
}
boolean firstAction=false;
if(Intent.ACTION\u MEDIA\u BUTTON.equals(Intent.getAction())){
firstAction=!firstAction;
如果(!firstAction)
{
返回true;
}
KeyEvent事件=(KeyEvent)intent.getParcelableExtra(intent.EXTRA\u KEY\u事件);
long curEventTime=event.getEventTime();
if(event!=null&&(event.getAction()==KeyEvent.ACTION\u UP)/*&&(curEventTime!=preventTime)*/){
int keycode=event.getKeyCode();
开关(钥匙代码)
{
case KeyEvent.KEYCODE\u媒体\u下一步:
Log.i(标记“KEYCODE\u MEDIA\u NEXT”);
打破
case KeyEvent.KEYCODE_头方法确定:
Log.i(标记,“KEYCODE_HEADSETHOOK”+“”+curEventTime+“”+preventTime+“(“+event.getAction()+”));
prevEventTime=curEventTime;
打破
case KeyEvent.KEYCODE_MEDIA_先前版本:
Log.i(标签“KEYCODE\u MEDIA\u PREVIOUS”);
打破
违约:
}
}     
}

我注意到您正在库中使用此接收器(清单中的“mylib”部分)

如果确实是这种情况,并且两个应用程序共享相同的注册码,您将通过注册该接收器,您将看到这些事件两次

如果三个应用程序注册了该接收器,您将收到三倍的事件


确保每个应用程序使用不同的(唯一的)
我遇到了这个问题,花了一段时间把头撞在墙上,才意识到每次按下按钮都会生成两个事件:一个是KeyEvent.ACTION\u DOWN,一个是KeyEvent.ACTION\u UP。因此,使用媒体按钮需要两个测试:

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


因此,如果其他人因为同样的错误而发现自己在这里,也许这个回答会有所帮助。

你是如何注册你的接收者的?现在我无法编辑我的赏金文本(可怜)。“我没有使用任何库”的意思是,我没有超过一个应用程序注册同一个侦听器。请注意,在我的原始代码中注释掉了
/*&&&(curEventTime!=prevEventTime)*/
:这已经解决了上述问题。我想问的是为什么会发生这种情况,而不是如何解决这个问题。谢谢你的帮助。:)这为我解决了问题。现在看起来很明显,但以前从未想过。谢谢这就是魔法。啊!我甚至读过一次,认为这不是问题所在。谢谢不是我的情况,我确实观察到了这个问题。我只在清单中定义了筛选器。这只发生在Android2.x中。这显然是一个错误,因为我已经验证了我自己的接收器被实例化并触发了两次(两次用于向上,两次用于向下),并且它只注册了一个(通过PackageManager.QueryBroadcastReceiver检查)。检查事件时间的解决方法可靠吗?它是唯一一个吗?
<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>
mRemoteControlReceiver = new ComponentName(this, RemoteControlReceiver.class);
mAudioManager.registerMediaButtonEventReceiver(mRemoteControlReceiver);
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:
        }
    }     
}
if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {}
if (event.getAction() == KeyEvent.ACTION_DOWN) {}