首页 > 解决方案 > 蓝牙耳塞触摸手势应触发应用程序中的 onClick 侦听器

问题描述

我正在尝试制作一个 android 应用程序,当在配对的蓝牙耳塞上执行任何触摸手势(耳塞支持触摸手势)时,它会触发应用程序中的点击监听器/某些操作。谷歌了很多,但仍然无法使其工作。根据接收到的意图的动作,想要弄清楚手势是什么,然后相应地在我的应用程序中触发一些动作。谁能指导我或指出我正确的方法?提前致谢。

我的设备是 android 9,api 级别 28。想让它适用于版本 >= 8 的 android 设备。

尝试了以下方法:

  1. 注册了一个监听器,将intent过滤器的优先级设置为2147483647,但是在onReceive方法中无法接收到广播。
  2. 尝试在 onKeyDown/onKeyUp/dispatchKeyEvent 中捕获键事件,但未在这些方法中接收调用。
  3. 尝试使用 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);

标签: androidbluetoothtouchgestureandroid-bluetooth

解决方案


推荐阅读