如何在带有广播接收器的HTC手机中双击耳机按钮?

时间:2013-12-21 11:43:54

标签: android android-broadcast headset

我正在开发耳机按钮控制器,并使用广播接收器来检测耳机按钮按下。

((AudioManager) getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(getPackageName(), MediaButtonIntentReceiver.class.getName()));

onReceive方法:

public void onReceive(Context context, Intent intent) {
    String intentAction = intent.getAction();
    if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
        return;
    }
    KeyEvent event = (KeyEvent) intent
            .getParcelableExtra(Intent.EXTRA_KEY_EVENT);
    if (event == null) {
        return;
    }
    int action = event.getAction();

    switch (event.getKeyCode()) {
    case KeyEvent.KEYCODE_HEADSETHOOK:
        if (action == KeyEvent.ACTION_DOWN) {
            long time = SystemClock.uptimeMillis();
            // double click
            if (time - sLastClickTime < DOUBLE_CLICK_DELAY)
                // do something
                Toast.makeText(context, "BUTTON PRESSED DOUBLE!",
                        Toast.LENGTH_SHORT).show();
            // single click
            else {
                // do something
                Toast.makeText(context, "BUTTON PRESSED!",
                        Toast.LENGTH_SHORT).show();
            }
            sLastClickTime = time;
        }
        break;
    }
    abortBroadcast();

}

它工作正常。 问题是在HTC android手机中它无法接收双击。当您双击耳机按钮时,它默认拨打您的最后一个电话,我无法在我的应用程序中检测到双击。 有没有办法用android API禁用这个动作?

我尝试将广播接收器的优先级设置为大量,但它不起作用。 即使我试图在电话的通话记录中放置假/无效通话,但我不能这样做。 任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

解决方案非常简单。在清单文件中将优先级设置为最大整数(2147483647)而不是Google(1000)定义的最大值,解决了问题,并且电话不会通过双击拨打最后一个号码,并且广播接收器检测到双击耳机按钮。

<receiver
        android:name=".MediaButtonIntentReceiver"
        android:enabled="true" >
        <intent-filter android:priority="2147483647">
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
</receiver>

答案 1 :(得分:0)

您的解决方案对我来说也不起作用,这也不是最佳做法。

对于遇到同样问题的其他人。这就是我在音乐播放器中用来处理单击和双击耳机控制的内容。这适用于所有耳机。

static final long CLICK_DELAY = 500;
static long lastClick = 0; // oldValue
static long currentClick = System.currentTimeMillis();

@Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_MEDIA_BUTTON)) {

            KeyEvent keyEvent = (KeyEvent) intent.getExtras().get(Intent.EXTRA_KEY_EVENT);

            if (keyEvent.getAction() != KeyEvent.ACTION_DOWN)return;

            lastClick = currentClick ;

            currentClick = System.currentTimeMillis();

            if(currentClick - lastClick < CLICK_DELAY ){

                 //This is double click

            } else { 

                 //This is single click

            }
        }