按下蓝牙设备按钮应触发应用程序中的 Onclick 侦听器
Bluetooth Device Button Press Should Trigger Onclick Listener in the app
我正在尝试制作一个应用程序,当在配对的蓝牙设备上按下按钮时,它会在应用程序中触发点击监听器。谷歌搜索几个小时后,我认为我无法将蓝牙设备按钮的键码发送到广播接收器,如果键码匹配,那么我可以调用点击监听器,或者我的方法和理解是错误的,所以有人可以指导我吗或者指出我正确的方法?提前致谢
蓝牙设备:蓝牙自拍遥控AB快门3
我想要这样的东西
http://www.barbatricks.com/en/android-en/remap-ab-shutter-3-selfie-remote/
我尝试了以下链接作为参考但没有成功
How to capture key events from bluetooth headset with android
BroadcastReceiver for ACTION_MEDIA_BUTTON not working
How to detect bluetooth call/media button press in android app
http://blog.phonedeveloper.com/2015/04/how-to-receive-bluetooth-broadcast.html
我用 BT 创建了很多应用程序..这是我给你的简单建议:
1- 从 BluetoothChat 示例开始:link
2- 在 ids.xml 中定义您自己的 ID 即:
<resources>
<id name="keyboard" />
</resources>
3- 根据该 ID 在地图中保留所有常用按钮实例
4- 创建网桥作为设备之间的通信通道,这样您就可以
双向发送数据
5- 使用该桥广播事件 from/to 设备
6- 当接收到事件数据时,只需通过 ID 获取该按钮并调用:
mView.performClick();
就是这样。
自拍遥控器在 Android 中显示为蓝牙键盘,对吧?或者作为一般的 HID(人机接口设备)。
如果是这样,则添加到 Activity 的 onCreate()
;
takeKeyEvents(true);
这是解释in the documentation:
Request that key events come to this activity. Use this if your
activity has no views with focus, but the activity still wants a
chance to process key events.
覆盖 onKeyUp()
(在您的 Activity 中)并为您希望使用的键分配一些操作:
@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);
}
}
onKeyUp()
方法is explained:
Called when a key was released and not handled by any of the views
inside of the activity. So, for example, key presses while the cursor
is inside a TextView will not trigger the event (unless it is a
navigation to another object) because TextView handles its own key
presses.
The default implementation handles KEYCODE_BACK to stop the activity
and go back.
让系统处理您不想捕获的任何键。这是由 default
块完成的。
只需检查一下来自遥控器的键码是什么,并删除不必要的情况。这些只是遥控器可能发送的键码的一些候选。
当然,一般适用于处理键盘的任何内容也适用于遥控器。 (假设它是一个 HID。但它们通常是。带按钮的蓝牙耳机是一个完全不同的故事。)
这将允许您在自己的应用程序中使用遥控器。我不明白为什么要涉及 BroadcastReceivers 或 onClickListeners,但也许我错过了重点。
如果您想要在后台运行的东西并将按键事件发送到其他应用程序/将遥控器的按键重新映射到其他按键代码以触发系统服务,那么这也是另一回事。
好吧,Android - Volume Buttons used in my application & Markus Kauppinen 的解释解决了我的问题。 MainActivity 中的以下代码可以帮助您在单击 AB Shutter 3 自拍遥控器 上的按钮时触发应用程序中的功能。遥控器的按钮在我的应用程序中被检测为 Android button ENTER
Keycode 66
& iOS button VOLUME_UP
Keycode 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);
}
}
但请注意:它只会在您的应用内检测到 KeyEvents
,而不是在应用未 运行 时检测到。我的下一步是找到如何在配对的 AB Shutter 3 自拍遥控器上按下按钮时在该应用程序中启动应用程序和点击监听器任何有建议、指导或任何类型的人帮助?提前致谢
我正在尝试制作一个应用程序,当在配对的蓝牙设备上按下按钮时,它会在应用程序中触发点击监听器。谷歌搜索几个小时后,我认为我无法将蓝牙设备按钮的键码发送到广播接收器,如果键码匹配,那么我可以调用点击监听器,或者我的方法和理解是错误的,所以有人可以指导我吗或者指出我正确的方法?提前致谢
蓝牙设备:蓝牙自拍遥控AB快门3
我想要这样的东西 http://www.barbatricks.com/en/android-en/remap-ab-shutter-3-selfie-remote/
我尝试了以下链接作为参考但没有成功
How to capture key events from bluetooth headset with android
BroadcastReceiver for ACTION_MEDIA_BUTTON not working
How to detect bluetooth call/media button press in android app
http://blog.phonedeveloper.com/2015/04/how-to-receive-bluetooth-broadcast.html
我用 BT 创建了很多应用程序..这是我给你的简单建议:
1- 从 BluetoothChat 示例开始:link
2- 在 ids.xml 中定义您自己的 ID 即:
<resources>
<id name="keyboard" />
</resources>
3- 根据该 ID 在地图中保留所有常用按钮实例
4- 创建网桥作为设备之间的通信通道,这样您就可以 双向发送数据
5- 使用该桥广播事件 from/to 设备
6- 当接收到事件数据时,只需通过 ID 获取该按钮并调用:
mView.performClick();
就是这样。
自拍遥控器在 Android 中显示为蓝牙键盘,对吧?或者作为一般的 HID(人机接口设备)。
如果是这样,则添加到 Activity 的 onCreate()
;
takeKeyEvents(true);
这是解释in the documentation:
Request that key events come to this activity. Use this if your activity has no views with focus, but the activity still wants a chance to process key events.
覆盖 onKeyUp()
(在您的 Activity 中)并为您希望使用的键分配一些操作:
@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);
}
}
onKeyUp()
方法is explained:
Called when a key was released and not handled by any of the views inside of the activity. So, for example, key presses while the cursor is inside a TextView will not trigger the event (unless it is a navigation to another object) because TextView handles its own key presses.
The default implementation handles KEYCODE_BACK to stop the activity and go back.
让系统处理您不想捕获的任何键。这是由 default
块完成的。
只需检查一下来自遥控器的键码是什么,并删除不必要的情况。这些只是遥控器可能发送的键码的一些候选。
当然,一般适用于处理键盘的任何内容也适用于遥控器。 (假设它是一个 HID。但它们通常是。带按钮的蓝牙耳机是一个完全不同的故事。)
这将允许您在自己的应用程序中使用遥控器。我不明白为什么要涉及 BroadcastReceivers 或 onClickListeners,但也许我错过了重点。
如果您想要在后台运行的东西并将按键事件发送到其他应用程序/将遥控器的按键重新映射到其他按键代码以触发系统服务,那么这也是另一回事。
好吧,Android - Volume Buttons used in my application & Markus Kauppinen 的解释解决了我的问题。 MainActivity 中的以下代码可以帮助您在单击 AB Shutter 3 自拍遥控器 上的按钮时触发应用程序中的功能。遥控器的按钮在我的应用程序中被检测为 Android button ENTER
Keycode 66
& iOS button VOLUME_UP
Keycode 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);
}
}
但请注意:它只会在您的应用内检测到 KeyEvents
,而不是在应用未 运行 时检测到。我的下一步是找到如何在配对的 AB Shutter 3 自拍遥控器上按下按钮时在该应用程序中启动应用程序和点击监听器任何有建议、指导或任何类型的人帮助?提前致谢