我正在尝试制作一个 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);