Android应用程序模拟手机按键

记得以前在做一个C++项目时,需要在某一步操作之后人为用代码模拟敲键盘上的回车键(Enter)效果。出于好奇,这几天研究了一下Android中手机(或平板)上各种按键的键值、模拟方法及最终效果。

  1、先来看看Android中对按键和值的定义方式:

public static final int KEYCODE_UNKNOWN        = 0;
/** Key code constant: Soft Left key. */
public static final int KEYCODE_SOFT_LEFT      = 1;
/** Key code constant: Soft Right key. */
public static final int KEYCODE_SOFT_RIGHT      = 2;
/** Key code constant: Home key. */
public static final int KEYCODE_HOME            = 3;
/** Key code constant: Back key. */
public static final int KEYCODE_BACK            = 4;
/** Key code constant: Call key. */
public static final int KEYCODE_CALL            = 5;
/** Key code constant: End Call key. */
public static final int KEYCODE_ENDCALL        = 6;
/** Key code constant: '0' key. */
public static final int KEYCODE_0              = 7;
/** Key code constant: '1' key. */
public static final int KEYCODE_1              = 8;
/** Key code constant: '2' key. */
public static final int KEYCODE_2              = 9;
/** Key code constant: '3' key. */
public static final int KEYCODE_3              = 10;
/** Key code constant: '4' key. */
public static final int KEYCODE_4              = 11;
/** Key code constant: '5' key. */
public static final int KEYCODE_5              = 12;
/** Key code constant: '6' key. */
public static final int KEYCODE_6              = 13;
/** Key code constant: '7' key. */
public static final int KEYCODE_7              = 14;
/** Key code constant: '8' key. */
public static final int KEYCODE_8              = 15;
/** Key code constant: '9' key. */
public static final int KEYCODE_9              = 16;
/** Key code constant: '*' key. */
public static final int KEYCODE_STAR            = 17;
/** Key code constant: '#' key. */
public static final int KEYCODE_POUND          = 18;
/** Key code constant: Directional Pad Up key.
 * May also be synthesized from trackball motions. */
public static final int KEYCODE_DPAD_UP        = 19;
/** Key code constant: Directional Pad Down key.
 * May also be synthesized from trackball motions. */
public static final int KEYCODE_DPAD_DOWN      = 20;
/** Key code constant: Directional Pad Left key.
 * May also be synthesized from trackball motions. */
public static final int KEYCODE_DPAD_LEFT      = 21;
/** Key code constant: Directional Pad Right key.
 * May also be synthesized from trackball motions. */
public static final int KEYCODE_DPAD_RIGHT      = 22;
/** Key code constant: Directional Pad Center key.
 * May also be synthesized from trackball motions. */
public static final int KEYCODE_DPAD_CENTER    = 23;
/** Key code constant: Volume Up key.
 * Adjusts the speaker volume up. */
public static final int KEYCODE_VOLUME_UP      = 24;
/** Key code constant: Volume Down key.
 * Adjusts the speaker volume down. */
public static final int KEYCODE_VOLUME_DOWN    = 25;
/** Key code constant: Power key. */
public static final int KEYCODE_POWER          = 26;
/** Key code constant: Camera key.
 * Used to launch a camera application or take pictures. */
public static final int KEYCODE_CAMERA          = 27;
/** Key code constant: Clear key. */
public static final int KEYCODE_CLEAR          = 28;
/** Key code constant: 'A' key. */
public static final int KEYCODE_A              = 29;
/** Key code constant: 'B' key. */
public static final int KEYCODE_B              = 30;
/** Key code constant: 'C' key. */
public static final int KEYCODE_C              = 31;
/** Key code constant: 'D' key. */
public static final int KEYCODE_D              = 32;
/** Key code constant: 'E' key. */
public static final int KEYCODE_E              = 33;
/** Key code constant: 'F' key. */
public static final int KEYCODE_F              = 34;
/** Key code constant: 'G' key. */
public static final int KEYCODE_G              = 35;
/** Key code constant: 'H' key. */
public static final int KEYCODE_H              = 36;
/** Key code constant: 'I' key. */
public static final int KEYCODE_I              = 37;
/** Key code constant: 'J' key. */
public static final int KEYCODE_J              = 38;
/** Key code constant: 'K' key. */
public static final int KEYCODE_K              = 39;
/** Key code constant: 'L' key. */
public static final int KEYCODE_L              = 40;
/** Key code constant: 'M' key. */
public static final int KEYCODE_M              = 41;
/** Key code constant: 'N' key. */
public static final int KEYCODE_N              = 42;
/** Key code constant: 'O' key. */
public static final int KEYCODE_O              = 43;
/** Key code constant: 'P' key. */
public static final int KEYCODE_P              = 44;
/** Key code constant: 'Q' key. */
public static final int KEYCODE_Q              = 45;
/** Key code constant: 'R' key. */
public static final int KEYCODE_R              = 46;
/** Key code constant: 'S' key. */
public static final int KEYCODE_S              = 47;
/** Key code constant: 'T' key. */
public static final int KEYCODE_T              = 48;
/** Key code constant: 'U' key. */
public static final int KEYCODE_U              = 49;
/** Key code constant: 'V' key. */
public static final int KEYCODE_V              = 50;
/** Key code constant: 'W' key. */
public static final int KEYCODE_W              = 51;
/** Key code constant: 'X' key. */
public static final int KEYCODE_X              = 52;
/** Key code constant: 'Y' key. */
public static final int KEYCODE_Y              = 53;
/** Key code constant: 'Z' key. */
public static final int KEYCODE_Z              = 54;

其实,在源文件KeyEvent.java中总共定义了将近260个键值,这里只给出了27个(Back、Home、数字、大写字母等)。

  2、而要在程序代码中模拟按键的作用,最好是结合线程一起使用,否则有些按键在模拟过程中会出现程序异常终止的情况。

  如返回键Back,键值为4,若是直接模拟,就会运行即终止。代码很简单,只需要两句:

Instrumentation inst = new Instrumentation();

inst.sendCharacterSync(KeyEvent.KEYCODE_BACK);

  Instrumentation和Activity有点类似,只不过Activity是需要一个界面的,而Instrumentation并不是这样的。

  我们可以将它理解为一种没有图形界面的,具有启动能力的,用于监控其他类(用Target Package声明)的工具类。

  3、接下来,老老实实利用线程(Thread)来实现按键的模拟效果,当然还用到了消息机制(Handler、Message):

  a、首先在onCreate()方法之前定义Handler对象handler,

Handler handler;

  b、之后在onCreate方法中定义线程并启动,

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1f820ca6c0c8f5aec21cde55489a0964.html