Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android模拟按键_Java_Android_Key_Keypress_Simulate - Fatal编程技术网

Java Android模拟按键

Java Android模拟按键,java,android,key,keypress,simulate,Java,Android,Key,Keypress,Simulate,如何以编程方式模拟Droid上的按键?我想模拟手动按键(droid上显示有人在按键,但这是通过编程完成的) 有一些解决方案涉及到IWindowManager,但在新的SDK中,这不再是一个选项。您可以使用检测,即在创建活动时调用以下代码将导致菜单多次打开和关闭: new Thread(new Runnable() { @Override public void run() { try { I

如何以编程方式模拟Droid上的按键?我想模拟手动按键(droid上显示有人在按键,但这是通过编程完成的)


有一些解决方案涉及到
IWindowManager
,但在新的SDK中,这不再是一个选项。

您可以使用检测,即在创建活动时调用以下代码将导致菜单多次打开和关闭:

    new Thread(new Runnable() {         
        @Override
        public void run() {
            try {
            Instrumentation inst = new Instrumentation();
            for ( int i = 0; i < 10; ++i ) {
                inst.sendKeyDownUpSync(KeyEvent.KEYCODE_MENU);
                Thread.sleep(2000);
                inst.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
                Thread.sleep(2000);
            }
            }
            catch(InterruptedException e){
            }
        }   
    }).start();
new线程(new Runnable(){
@凌驾
公开募捐{
试一试{
仪器仪表=新仪器仪表();
对于(int i=0;i<10;++i){
inst.sendKeyDownUpSync(KeyEvent.KEYCODE_菜单);
《睡眠》(2000年);
inst.sendKeyDownUpSync(KeyEvent.KEYCODE\u BACK);
《睡眠》(2000年);
}
}
捕捉(中断异常e){
}
}   
}).start();

…但我不确定这是否是您所追求的

如果您有一个想要使用事件的视图,则可以使用类及其方法

要使用它,您需要指定将接收KeyEvent的目标视图(例如EditText)。例如:

EditText editText;
BaseInputConnection inputConnection = new BaseInputConnection(editText, true);
inputConnection.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_POUND));

这样做的结果就像用户实际按下了#键(同时聚焦编辑文本)。

如果您正在运行UI Automator测试,根据设备的Android版本,您可以使用两种技术:

API 21+ 如果您只针对API 18或更高版本,则只需使用shell即可:

UiDevice device=UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
device.executeShellCommand(“输入文本1234”);//输入“1234”
device.executeShellCommand(“input keyevent 66”);//按回车键
API 18+ 如果您还支持API 18-19,则无法使用shell,因为它不可用;如果您与非您自己的应用程序(如系统UI)交互,则无法使用instrumentation key injection。相反,使用

抓取一个
UiAutomation
的实例,然后将其存储在某个地方:

UiAutomation=InstrumentationRegistry.getInstrumentation().getUiAutomation();
然后定义一些辅助方法:

private void sendKey(int-keyCode){
sendKeyEvent(keyCode,KeyEvent.ACTION_DOWN);
sendKeyEvent(keyCode,KeyEvent.ACTION\u UP);
}
私有void sendKeyEvent(int-keyCode,int-action){
长时间停机=SystemClock.uptimeMillis();
KeyEvent事件=新的KeyEvent事件(
停工期
停工期
行动,
键码,
0,
0,
KeyCharacterMap.VIRTUAL\u键盘,
0,
KeyEvent.FLAG_来自_系统,
InputDevice.SOURCE\u键盘
);
uiAutomation.injectInputEvent(事件,true);
}
然后像这样使用它:

sendKey(KeyEvent.KEYCODE_1);
sendKey(KeyEvent.KEYCODE_2);
sendKey(KeyEvent.KEYCODE_3);
sendKey(KeyEvent.KEYCODE_4);
sendKey(KeyEvent.KEYCODE\u输入);

这正是我想要的,但是。。。仪器不是严格用于测试吗?我正在寻找一个解决方案,我可以在一个实时应用程序中使用,而不是测试。提前谢谢。@calcrisk33我还没有找到任何关于这是否是一个可行的实时应用解决方案的信息。你最终是以这种方式使用它的吗?@Kirk我是这样做的,它在模拟按键/按下时效果很好。它非常适合我的需要(JNI的自定义键盘),虽然我不需要try/catch块,但发现它必须在线程中。需要INJECT\u EVENTS权限,这仅适用于系统应用程序。测试工具、修改应用程序以响应实际触摸以外的内容以及“根”设备以在linux级别注入事件是您的三个选择。这让我想知道,您是否还需要调度
KeyEvent.ACTION\u UP
。我想这样做是合乎逻辑的。这种方法也适用于其他视图吗?例如:如果我想在RecyclerView上模拟DPAD_?