蓝牙设备按钮按下应在应用程序中触发Onclick监听器

Sid*_*yak 6 android bluetooth broadcastreceiver android-broadcastreceiver

我正在尝试制作一个在配对的蓝牙设备上按下按钮时触发点击侦听器的应用程序。搜寻了几个小时后,我认为我无法将蓝牙设备按钮的键码发送到广播接收器,如果该键码匹配,那么我可以呼叫点击监听器,或者我的方法和理解是错误的,所以有人可以指导我吗或指出正确的方法?提前致谢

蓝牙设备:蓝牙自拍遥控器AB快门3

我想要这样的东西 http://www.barbatricks.com/en/android-zh/remap-ab-shutter-3-selfie-remote/

我尝试了以下链接作为参考,但未成功

如何使用Android从蓝牙耳机捕获关键事件

ACTION_MEDIA_BUTTON的BroadcastReceiver无法正常工作

如何在Android应用程序中检测蓝牙通话/媒体按钮按下

http://blog.phonedeveloper.com/2015/04/how-to-receive-bluetooth-broadcast.html

Mar*_*nen 6

自拍遥控器在 Android 中显示为蓝牙键盘,对吗?或者作为一般的 HID(人机接口设备)。

如果是这种情况,则添加到 Activity 的onCreate();

takeKeyEvents(true);
Run Code Online (Sandbox Code Playgroud)

在文档中进行了解释:

要求关键事件来此活动。如果您的 Activity 没有具有焦点的视图,但该 Activity 仍然希望有机会处理关键事件,请使用此选项。

覆盖onKeyUp()(在您的活动中)并将一些操作分配给您希望使用的键:

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {

    switch (keyCode) {

        case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
            Log.d(this.getClass().getName(), "KEYCODE_MEDIA_PLAY_PAUSE");
            // Do something...

            return true;
        case KeyEvent.KEYCODE_MEDIA_PREVIOUS:
            Log.d(this.getClass().getName(), "KEYCODE_MEDIA_PREVIOUS");
            // Do something...

            return true;
        case KeyEvent.KEYCODE_MEDIA_NEXT:
            Log.d(this.getClass().getName(), "KEYCODE_MEDIA_NEXT");
            // Do something...

            return true;
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            Log.d(this.getClass().getName(), "KEYCODE_VOLUME_DOWN");
            // Do something...

            return true;
        case KeyEvent.KEYCODE_VOLUME_UP:
            Log.d(this.getClass().getName(), "KEYCODE_VOLUME_UP");
            // Do something...

            return true;
        case KeyEvent.KEYCODE_ENTER:
            Log.d(this.getClass().getName(), "KEYCODE_ENTER");
            // Do something...

            return true;
        default:
            return super.onKeyUp(keyCode, event);
    }
}
Run Code Online (Sandbox Code Playgroud)

onKeyUp()方法进行说明

当一个键被释放并且未被活动内部的任何视图处理时调用。因此,例如,当光标在 TextView 内时按下按键不会触发事件(除非它是到另一个对象的导航),因为 TextView 处理自己的按键按下。

默认实现处理 KEYCODE_BACK 以停止活动并返回。

只需让系统处理您不想捕获的任何键即可。这是由default块完成的。

只需检查来自遥控器的密钥代码是什么,并删除不必要的案例。这些只是遥控器可能发送的键码的一些候选。

当然,任何适用于一般键盘操作的东西也适用于遥控器。(假设它是一个 HID。但它们通常是。带按钮的蓝牙耳机是一个完全不同的故事。)

这将允许您在自己的应用程序中使用遥控器。我不明白为什么应该涉及 BroadcastReceivers 或 onClickListeners,但也许我错过了这一点。

如果您想要在后台运行并将按键事件发送到其他应用程序/将遥控器的按键重新映射到其他按键代码以触发系统服务的东西,那么这也是另一回事。


Sid*_*yak 4

好吧,Android - 我的应用程序中使用的音量按钮和 Markus Kauppinen 的解释解决了我的问题。MainActivity 中的以下代码可以帮助您在单击AB Shutter 3 自拍遥控器上的按钮时触发应用程序中的功能。遥控器的按钮在我的应用程序中被检测为 Android 按钮ENTER键码66和 iOS 按钮VOLUME_UP键码24

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    takeKeyEvents(true);
    }

@Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        int action = event.getAction();
        int keyCode = event.getKeyCode();
        switch (keyCode) {

            case KeyEvent.KEYCODE_VOLUME_UP:
                if (action == KeyEvent.ACTION_DOWN) {
                    Log.i("VOL_UP_pressed", String.valueOf(event.getKeyCode()));
                    Toast.makeText(getApplication(), "IOS button clicked", Toast.LENGTH_SHORT).show();
                }                                  
                return true;

            case KeyEvent.KEYCODE_ENTER:
                if(action==KeyEvent.ACTION_DOWN){
                    Log.i("ENTER_pressed", String.valueOf(event.getKeyCode()));
                    Toast.makeText(getApplication(), "ANDROID button clicked", Toast.LENGTH_SHORT).show();
                }
            default:
                return super.dispatchKeyEvent(event);
        }
    }
Run Code Online (Sandbox Code Playgroud)

但请注意:它只会KeyEvents在您的应用程序内进行检测,而不会在应用程序未运行时进行检测。我的下一步是找到如何在配对的 AB Shutter 3 自拍遥控器上按下按钮时启动该应用程序以及该应用程序中的 on clicklistener有人能提供建议、指导或任何形式的帮助吗?提前致谢