使用蓝牙鼠标/演示者控制Android应用程序

时间:2012-07-21 23:48:51

标签: android bluetooth

这不是一个容易搜索的问题,因为大多数回复涉及使用手机作为指针,但我想要做的是使用鼠标/演示者/指针来控制Android平板电脑。我买了这个Targus Bluetoogh Presenter (Amazon),我想在我的7in平板电脑上连接到一个应用程序。现在我花了两个小时没有成功搜索Google和stackoverflow,我想我应该寻求帮助。

蓝牙演示者工作正常。它就像一个鼠标,我可以滚动,点击并运行我的应用程序就好了。但这是一个应用程序,平板电脑将在光天化日之下安装在移动的船上,并且使用鼠标指针的这种精细增益调整是行不通的。我确信即使我可以控制指针,我甚至可能看不到它。这是一个高生存能力的应用程序,黑色背景上有1英寸高的白色字母。你只是看不到一个小小的鼠标指针。

我需要的是让演示者上的两个可编程按钮将焦点放在应用程序上的几个按钮上,然后让另一个按钮按下它们。现在,演示者中的一个可编程按钮突出显示我的应用程序中的一个按钮,但使用右键单击只会触发鼠标指针下方的任何按钮。我想我需要两个可编程按钮才能前进并进入,但这只是猜测。我愿意接受任何可行的解决方案。

我甚至不知道从哪里开始。我应该在我的应用程序中编程吗?我是否需要一个界面应用来编程按钮? Play商店中有什么东西可以满足我的需求吗?当我在蓝牙鼠标上搜索时,我看到的是使用手机控制计算机的应用程序。不是我想要的方向。我需要一些帮助或指导。

1 个答案:

答案 0 :(得分:2)

好的,我想我已经找到了适合您的解决方案。事实证明我有一些错误。一个dispatchKeyEvent()优于onKeyDown(),因为它会停止按下音量按钮使其进入系统(在我的设备上,它们会发出哔声,但没有音量变化)。而且事实证明,您需要使用Instrumentation类来发送欺骗性KeyEvents而不是手动调用dispatchKeyEvent()。 Instrumentation类也不会从主线程进行方法调用,所以你必须将调用包装在自己的线程中。

我还了解了为什么设备上的某些按钮发送了两个关键事件117和71.那些匹配 shift + [为了我们的目的,我们可以忽略转移按下并使用 [为我们采取行动。

这是一个重写的dispatchKeyEvent()方法,似乎对我有效。

@Override
public boolean dispatchKeyEvent(KeyEvent ke){
int keyCode = ke.getKeyCode();
if(ke.getAction() == KeyEvent.ACTION_DOWN){
    if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) 
    { 
        /************************************** 
         * What ever code snippet you put 
         * here will run whenever you press the
         * volume down button on your presenter
         * device
         **************************************/
        return true;
    }else if(keyCode == KeyEvent.KEYCODE_VOLUME_UP) 
    { 
        /************************************** 
         * What ever code snippet you put 
         * here will run whenever you press the
         * volume up button on your presenter
         * device
         **************************************/
        return true;
    }else if (keyCode == 30){ 
        /************************************** 
         * What ever code snippet you put 
         * here will run whenever you press the
         * left programmable button on your 
         * presenter device
         **************************************/
         return true;
        }
    else if (keyCode == 59){
        /************************************** 
         * This was an attempt to get it to ignore
         * the shift keypress coming from the
         * left/right arrow keys on the devices
         * ignoring that would in theory make
         * those keys function as up/down focus
         * movers. Didn't seem to work though.
         * you could probably remove this branch
         * of the if statement if you want.
         * However since those buttons do send 
         * key events to the device it should 
         * should still be possible override these
         * buttons somehow.
         **************************************/
        return true;
    }
}else if(ke.getAction() == KeyEvent.ACTION_UP){
    /************************************** 
     * This section will catche the "release"
     * events from all of the keys we are using
     * and tell the system that we've handled
     * them. So that the system will not pass
     * the events along to anything else.
     **************************************/
    if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) 
    { 
        /************************************** 
         * If you had any reason / desire to
         * you could put a code snipet here and it
         * would be run when you let go after 
         * pressing the volume down button on your
         * presenter device.
         **************************************/
        return true;
    }else if(keyCode == KeyEvent.KEYCODE_VOLUME_UP) 
    { 
        return true;
    }else if (keyCode == 59){
        return true;
    }else if (keyCode == 30) {
        return true;
    }
}

/************************************** 
 * The following line is needed so that
 * the system will treat any key events 
 * that we aren't interested in normally.
 * i.e. the back button on the tablet, by
 * by calling super.dispatchKeyEvent(), we
 * ensure that the back button still behaves
 * like normal.
 **************************************/
return super.dispatchKeyEvent(ke);
}

这将允许您控制演示者设备上的3个按钮(Vol Up,Vol Down和Left可编程按钮),方法是将您的代码片段放在if语句的相应分支中,您可以将其中任何一个3个按钮可以随心所欲。

我已经创建了一个实现此项目的测试项目,如果您想要查看整个内容,可以download the zipped project folder here。在这个测试项目中,我已将其设置为上升/下降将作为d-pad上/下功能,这样您就可以将焦点移动到活动中的不同视图。

以下代码可以放在if语句的一个分支中,以欺骗d-pad箭头按钮:

new Thread(new Runnable() {         
    @Override
    public void run() {                 
        new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
    }   
}).start();

您可以将KeyEvent.KEYCODE_DPAD_DOWN替换为您想要的任何其他关键事件KeyEvent.KEYCODE_DPAD_UPKeyEvent.KEYCODE_DPAD_CENTER,后者将作为选择按钮发送点击事件当前具有焦点的按钮。