android shell 命令--- input
来源:互联网 发布:淘宝全职客服工资多少 编辑:程序博客网 时间:2024/06/15 14:06
1 . input命令简介
input 命令主要模拟android输入时间, 比如文本字符输入,或者按键输入
bash# input usage: input[text|keyevent] input text <string> input keyevent <event_code>
3.aosp源码位置
myandroid/frameworks/base/cmds/input/src/com/android/commands/input/Input.java
/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.android.commands.input;import android.hardware.input.InputManager;import android.os.SystemClock;import android.util.Log;import android.view.InputDevice;import android.view.KeyCharacterMap;import android.view.KeyEvent;import android.view.MotionEvent;import java.util.HashMap;import java.util.Map;/** * Command that sends key events to the device, either by their keycode, or by * desired character output. */public class Input { private static final String TAG = "Input"; private static final String INVALID_ARGUMENTS = "Error: Invalid arguments for command: "; private static final Map<String, Integer> SOURCES = new HashMap<String, Integer>() {{ put("keyboard", InputDevice.SOURCE_KEYBOARD); put("dpad", InputDevice.SOURCE_DPAD); put("gamepad", InputDevice.SOURCE_GAMEPAD); put("touchscreen", InputDevice.SOURCE_TOUCHSCREEN); put("mouse", InputDevice.SOURCE_MOUSE); put("stylus", InputDevice.SOURCE_STYLUS); put("trackball", InputDevice.SOURCE_TRACKBALL); put("touchpad", InputDevice.SOURCE_TOUCHPAD); put("touchnavigation", InputDevice.SOURCE_TOUCH_NAVIGATION); put("joystick", InputDevice.SOURCE_JOYSTICK); }}; /** * Command-line entry point. * * @param args The command-line arguments */ public static void main(String[] args) { (new Input()).run(args); } private void run(String[] args) { if (args.length < 1) { showUsage(); return; } int index = 0; String command = args[index]; int inputSource = InputDevice.SOURCE_UNKNOWN; if (SOURCES.containsKey(command)) { inputSource = SOURCES.get(command); index++; command = args[index]; } final int length = args.length - index; try { if (command.equals("text")) { if (length == 2) { inputSource = getSource(inputSource, InputDevice.SOURCE_KEYBOARD); sendText(inputSource, args[index+1]); return; } } else if (command.equals("keyevent")) { if (length >= 2) { final boolean longpress = "--longpress".equals(args[index + 1]); final int start = longpress ? index + 2 : index + 1; inputSource = getSource(inputSource, InputDevice.SOURCE_KEYBOARD); if (length > start) { for (int i = start; i < length; i++) { int keyCode = KeyEvent.keyCodeFromString(args[i]); if (keyCode == KeyEvent.KEYCODE_UNKNOWN) { keyCode = KeyEvent.keyCodeFromString("KEYCODE_" + args[i]); } sendKeyEvent(inputSource, keyCode, longpress); } return; } } } else if (command.equals("tap")) { if (length == 3) { inputSource = getSource(inputSource, InputDevice.SOURCE_TOUCHSCREEN); sendTap(inputSource, Float.parseFloat(args[index+1]), Float.parseFloat(args[index+2])); return; } } else if (command.equals("swipe")) { int duration = -1; inputSource = getSource(inputSource, InputDevice.SOURCE_TOUCHSCREEN); switch (length) { case 6: duration = Integer.parseInt(args[index+5]); case 5: sendSwipe(inputSource, Float.parseFloat(args[index+1]), Float.parseFloat(args[index+2]), Float.parseFloat(args[index+3]), Float.parseFloat(args[index+4]), duration); return; } } else if (command.equals("press")) { inputSource = getSource(inputSource, InputDevice.SOURCE_TRACKBALL); if (length == 1) { sendTap(inputSource, 0.0f, 0.0f); return; } } else if (command.equals("roll")) { inputSource = getSource(inputSource, InputDevice.SOURCE_TRACKBALL); if (length == 3) { sendMove(inputSource, Float.parseFloat(args[index+1]), Float.parseFloat(args[index+2])); return; } } else { System.err.println("Error: Unknown command: " + command); showUsage(); return; } } catch (NumberFormatException ex) { } System.err.println(INVALID_ARGUMENTS + command); showUsage(); } /** * Convert the characters of string text into key event's and send to * device. * * @param text is a string of characters you want to input to the device. */ private void sendText(int source, String text) { StringBuffer buff = new StringBuffer(text); boolean escapeFlag = false; for (int i=0; i<buff.length(); i++) { if (escapeFlag) { escapeFlag = false; if (buff.charAt(i) == 's') { buff.setCharAt(i, ' '); buff.deleteCharAt(--i); } } if (buff.charAt(i) == '%') { escapeFlag = true; } } char[] chars = buff.toString().toCharArray(); KeyCharacterMap kcm = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD); KeyEvent[] events = kcm.getEvents(chars); for(int i = 0; i < events.length; i++) { KeyEvent e = events[i]; if (source != e.getSource()) { e.setSource(source); } injectKeyEvent(e); } } private void sendKeyEvent(int inputSource, int keyCode, boolean longpress) { long now = SystemClock.uptimeMillis(); injectKeyEvent(new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keyCode, 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, inputSource)); if (longpress) { injectKeyEvent(new KeyEvent(now, now, KeyEvent.ACTION_DOWN, keyCode, 1, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, KeyEvent.FLAG_LONG_PRESS, inputSource)); } injectKeyEvent(new KeyEvent(now, now, KeyEvent.ACTION_UP, keyCode, 0, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, 0, inputSource)); } private void sendTap(int inputSource, float x, float y) { long now = SystemClock.uptimeMillis(); injectMotionEvent(inputSource, MotionEvent.ACTION_DOWN, now, x, y, 1.0f); injectMotionEvent(inputSource, MotionEvent.ACTION_UP, now, x, y, 0.0f); } private void sendSwipe(int inputSource, float x1, float y1, float x2, float y2, int duration) { if (duration < 0) { duration = 300; } long now = SystemClock.uptimeMillis(); injectMotionEvent(inputSource, MotionEvent.ACTION_DOWN, now, x1, y1, 1.0f); long startTime = now; long endTime = startTime + duration; while (now < endTime) { long elapsedTime = now - startTime; float alpha = (float) elapsedTime / duration; injectMotionEvent(inputSource, MotionEvent.ACTION_MOVE, now, lerp(x1, x2, alpha), lerp(y1, y2, alpha), 1.0f); now = SystemClock.uptimeMillis(); } injectMotionEvent(inputSource, MotionEvent.ACTION_UP, now, x2, y2, 0.0f); } /** * Sends a simple zero-pressure move event. * * @param inputSource the InputDevice.SOURCE_* sending the input event * @param dx change in x coordinate due to move * @param dy change in y coordinate due to move */ private void sendMove(int inputSource, float dx, float dy) { long now = SystemClock.uptimeMillis(); injectMotionEvent(inputSource, MotionEvent.ACTION_MOVE, now, dx, dy, 0.0f); } private void injectKeyEvent(KeyEvent event) { Log.i(TAG, "injectKeyEvent: " + event); InputManager.getInstance().injectInputEvent(event, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH); } /** * Builds a MotionEvent and injects it into the event stream. * * @param inputSource the InputDevice.SOURCE_* sending the input event * @param action the MotionEvent.ACTION_* for the event * @param when the value of SystemClock.uptimeMillis() at which the event happened * @param x x coordinate of event * @param y y coordinate of event * @param pressure pressure of event */ private void injectMotionEvent(int inputSource, int action, long when, float x, float y, float pressure) { final float DEFAULT_SIZE = 1.0f; final int DEFAULT_META_STATE = 0; final float DEFAULT_PRECISION_X = 1.0f; final float DEFAULT_PRECISION_Y = 1.0f; final int DEFAULT_DEVICE_ID = 0; final int DEFAULT_EDGE_FLAGS = 0; MotionEvent event = MotionEvent.obtain(when, when, action, x, y, pressure, DEFAULT_SIZE, DEFAULT_META_STATE, DEFAULT_PRECISION_X, DEFAULT_PRECISION_Y, DEFAULT_DEVICE_ID, DEFAULT_EDGE_FLAGS); event.setSource(inputSource); Log.i(TAG, "injectMotionEvent: " + event); InputManager.getInstance().injectInputEvent(event, InputManager.INJECT_INPUT_EVENT_MODE_WAIT_FOR_FINISH); } private static final float lerp(float a, float b, float alpha) { return (b - a) * alpha + a; } private static final int getSource(int inputSource, int defaultSource) { return inputSource == InputDevice.SOURCE_UNKNOWN ? defaultSource : inputSource; } private void showUsage() { System.err.println("Usage: input [<source>] <command> [<arg>...]"); System.err.println(); System.err.println("The sources are: "); for (String src : SOURCES.keySet()) { System.err.println(" " + src); } System.err.println(); System.err.println("The commands and default sources are:"); System.err.println(" text <string> (Default: touchscreen)"); System.err.println(" keyevent [--longpress] <key code number or name> ..." + " (Default: keyboard)"); System.err.println(" tap <x> <y> (Default: touchscreen)"); System.err.println(" swipe <x1> <y1> <x2> <y2> [duration(ms)]" + " (Default: touchscreen)"); System.err.println(" press (Default: trackball)"); System.err.println(" roll <dx> <dy> (Default: trackball)"); }}
3.模拟按键输入
// 模拟HOME按键 KEYCODE_HOMEbash# input keyevent 3//模拟返回按键 KEYCODE_BACKbash# input keyevent 4//模拟菜单键 KEYCODE_MENU bash# input keyevent 1
event_code 所对应的事件:
0 --> "KEYCODE_UNKNOWN" 1 --> "KEYCODE_MENU" 2 --> "KEYCODE_SOFT_RIGHT" 3 --> "KEYCODE_HOME" 4 --> "KEYCODE_BACK" 5 --> "KEYCODE_CALL" 6 --> "KEYCODE_ENDCALL" 7 --> "KEYCODE_0" 8 --> "KEYCODE_1" 9 --> "KEYCODE_2" 10 --> "KEYCODE_3" 11 --> "KEYCODE_4" 12 --> "KEYCODE_5" 13 --> "KEYCODE_6" 14 --> "KEYCODE_7" 15 --> "KEYCODE_8" 16 --> "KEYCODE_9" 17 --> "KEYCODE_STAR" 18 --> "KEYCODE_POUND" 19 --> "KEYCODE_DPAD_UP" 20 --> "KEYCODE_DPAD_DOWN" 21 --> "KEYCODE_DPAD_LEFT" 22 --> "KEYCODE_DPAD_RIGHT" 23 --> "KEYCODE_DPAD_CENTER" 24 --> "KEYCODE_VOLUME_UP" 25 --> "KEYCODE_VOLUME_DOWN" 26 --> "KEYCODE_POWER" 27 --> "KEYCODE_CAMERA" 28 --> "KEYCODE_CLEAR" 29 --> "KEYCODE_A" 30 --> "KEYCODE_B" 31 --> "KEYCODE_C" 32 --> "KEYCODE_D" 33 --> "KEYCODE_E" 34 --> "KEYCODE_F" 35 --> "KEYCODE_G" 36 --> "KEYCODE_H" 37 --> "KEYCODE_I" 38 --> "KEYCODE_J" 39 --> "KEYCODE_K" 40 --> "KEYCODE_L" 41 --> "KEYCODE_M" 42 --> "KEYCODE_N" 43 --> "KEYCODE_O" 44 --> "KEYCODE_P" 45 --> "KEYCODE_Q" 46 --> "KEYCODE_R" 47 --> "KEYCODE_S" 48 --> "KEYCODE_T" 49 --> "KEYCODE_U" 50 --> "KEYCODE_V" 51 --> "KEYCODE_W" 52 --> "KEYCODE_X"
具体keyevent 的event_code请参考官方文档 https://developer.android.com/reference/android/view/KeyEvent.html
4,模拟输入文本字符
bash# input text "hello"
阅读全文
0 0
- android shell 命令--- input
- adb shell input 命令
- adb shell input 命令
- adb shell input 命令
- adb shell input 命令
- adb shell input 命令
- android shell input
- Adb shell 之 input 命令
- android 命令之input
- android input 命令小结
- Android input命令
- Android Input 命令
- Android- adb shell input keyevent
- adb shell input 命令
- adb shell命令整理之input
- [Android]通过adb shell input上报命令模拟屏幕点击事件
- 【Arch】Android input系统之input命令
- android命令input的用法
- tensorflow io 图片读取
- 避免tomcat运行过程中跳转到debug模式下
- Djistra 最短路算法简单实现、java
- 如何防止手机网页放大缩小
- RegExp() 对象
- android shell 命令--- input
- 测试开发的要求
- Leetcode Path Sum II
- 农村20年前割麦图曝光!那时的端午节后竟是这样过...
- html5调用百度地图APP-WAP端
- RxJava(整理)
- http状态代码(错误代码)各代表什么意思?
- 链表相关问题
- 01 mysql的几条常用命令