android - 蓝牙耳塞触摸手势应触发应用程序中的 onClick 侦听器
问题描述
我正在尝试制作一个 android 应用程序,当在配对的蓝牙耳塞上执行任何触摸手势(耳塞支持触摸手势)时,它会触发应用程序中的点击监听器/某些操作。谷歌了很多,但仍然无法使其工作。根据接收到的意图的动作,想要弄清楚手势是什么,然后相应地在我的应用程序中触发一些动作。谁能指导我或指出我正确的方法?提前致谢。
我的设备是 android 9,api 级别 28。想让它适用于版本 >= 8 的 android 设备。
尝试了以下方法:
- 注册了一个监听器,将intent过滤器的优先级设置为2147483647,但是在onReceive方法中无法接收到广播。
- 尝试在 onKeyDown/onKeyUp/dispatchKeyEvent 中捕获键事件,但未在这些方法中接收调用。
- 尝试使用 Media Session 类并设置回调和播放状态并将其设置为 Active,但未收到 onMediaButtonEvent 中的调用或回调的任何重写方法。
第一种方法:
AndroidManifest.xml
内部应用程序标签:
<receiver android:name="MediaButtonBroadcastReceiver" android:enabled="true">
<intent-filter android:priority="2147483647">
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
外部应用程序标签:
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
onCreate() 中的 MainActivity.java
AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
ComponentName mReceiverComponent = new ComponentName(this, MediaButtonBroadcastReceiver.class);
mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent)
MediaButtonBroadcastReceiver.java
public class MediaButtonBroadcastReceiver extends BroadcastReceiver {
// Constructor is mandatory
public MediaButtonBroadcastReceiver ()
{
super ();
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Hello2 ",Toast.LENGTH_SHORT).show();
abortBroadcast();
}
}
第二种方法:在 MainActivity.java 的 onCreate() 中添加这些 -
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Toast.makeText(this,"Hello1 ",Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onKeyLongPress(int keyCode, KeyEvent event) {\
Toast.makeText(this,"Hello3 ",Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
Toast.makeText(this,"Hello4 ",Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {\
Toast.makeText(this,"Hello5 ",Toast.LENGTH_SHORT).show();
return super.dispatchKeyEvent(event);
}
第三种方法 -
MediaSession.Callback callback = new MediaSession.Callback() {
@Override
public boolean onMediaButtonEvent(final Intent mediaButtonIntent) {
Log.e("KISHIE", "HELLO");
Toast toast= Toast. makeText(getApplicationContext(),"Hello ",Toast. LENGTH_SHORT);
toast.setMargin(50,50);
toast.show();
return true;
}
@Override
public void onPlay() {
Log.e("KISHIE", "HELLO");
}
@Override
public void onPause() {
Log.e("KISHIE", "HELLO");
}
@Override
public void onSkipToNext() {
Log.e("KISHIE", "HELLO");
}
@Override
public void onSkipToPrevious() {
Log.e("KISHIE", "HELLO");
}
@Override
public void onFastForward() {
Log.e("KISHIE", "HELLO");
}
@Override
public void onRewind() {
Log.e("KISHIE", "HELLO");
}
@Override
public void onStop() {
Log.e("KISHIE", "HELLO");
}
};
MediaSession mediaSession = new MediaSession(getApplicationContext(),"KISHIE"); // Debugging tag, any string
mediaSession.setFlags( MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);
mediaSession.setCallback(callback);
// Set up what actions you support and the state of your player
PlaybackState state = new PlaybackState.Builder()
.setActions(PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PAUSE | PlaybackState.ACTION_PLAY_PAUSE)
.setState(PlaybackState.STATE_PLAYING, 0, 0, 0)
.build();
mediaSession.setPlaybackState(state);
// Call this when you start playback after receiving audio focus
mediaSession.setActive(true);
解决方案
推荐阅读
- c++ - 为什么使用`array`读取文件成功读取文件并以未知错误终止?
- go - 为什么不将 0 转换为 *int32?
- serialization - 在打印或发送到数据库之前存储串行读取的字符数据
- javascript - 使用自定义标头 Javascript 将 JSON 转换为 CSV 和 CSV 到 JSON
- php - PHP循环逻辑混乱:如何在正确位置遍历数组时进行空白追加?
- c# - 编译时未知类型的嵌套委托调用
- reactjs - 如何减少下一个 JS 中的包大小?
- python - 在 Python 3.9 中使用正则表达式在已知分隔符之间提取文本(以“johab”编码进行编码)
- php - 如何通过 jquery $.ajax() 正确传递图像文件?
- r - 运行闪亮的应用程序时如何仅运行特定的mac地址