您的位置:首页 > 移动开发 > Android开发

Android 4.4 模拟 home键、back键等keyEvent

2015-07-04 21:26 513 查看
2015-7-04 by Zhou

==================================================================================================================

在Android开发中,有时候我们会遇到需求,就是在页面实现浮动窗口,点击浮动窗口后腾出选项,选项中可以进行一些快速的操作,比如模拟home 键、back 键等其他按键功能,亦或者是点击快速打开某个重要的应用。本文所讲内容基于Android4.4 ,亲测没问题,有些方法参考了网上其它大神的写法。

-------------------

下面附录几个常用的keyEvent 值,通过adb 命令,进入adb shell 后,直接输入 input keyevent + 相应的keyevent值就可以实现相应的操作,比如我需要回到home键,那么进入 adb shell后,输入 input keyevent 3 就可以返回到主页面。

KEYCODE_HOME=3;

KEYCODE_BACK=4;

KEYCODE_VOLUME_UP=24;

KEYCODE_VOLUME_DOWN=25;

KEYCODE_POWER=26;

------------

下面来看下在代码中是如何实现模拟home键、back键等其它按键的。有几种方法,下面一一列上:

1、Android 4.4 模拟back键第1种方法,需要在AndroidManifest中添加权限(重要)

android.permission.INJECT_EVENTS

Runtime runtime = Runtime.getRuntime();
try {
runtime.exec("input keyevent " + KeyEvent.KEYCODE_BACK);
} catch (IOException e) { // TODO Auto-generated catch block
e.printStackTrace();
}
2、Android 4.4 模拟back键第2种方法,需要在AndroidManifest中添加权限(重要)

android.permission.INJECT_EVENTS

simulateKeystroke(KeyEvent.KEYCODE_BACK);


/*
* 模拟 虚拟按键
*
* @param keyCode
*/
public static void simulateKeystroke(final int KeyCode) {
Log.e(TAG, "***simulateKeystroke()!!! ");
new Thread(new Runnable() {

public void run() {
// TODO Auto-generated method stub
try {

Instrumentation inst = new Instrumentation();
inst.sendKeyDownUpSync(KeyCode);
} catch (Exception e) {
// TODO: handle exception
}
}
}).start();
}


(注:上面2中方法都需要添加相应的权限,然后自己写个Android.mk 放到Android源码中进行编译)

3、Android 4.4 模拟back键第3种方法,机器需要root权限

RootShellCmd backCmd = new RootShellCmd();
backCmd.simulateKey(KeyEvent.KEYCODE_BACK);


/*
*执行Shell指令
*/
public class RootShellCmd {
private OutputStream os;
public final void exec(String cmd) {
try {
if (os == null) {
os = Runtime.getRuntime().exec("su").getOutputStream();
}
os.write(cmd.getBytes());
os.flush();
} catch (Exception e) {
e.printStackTrace();
}
}

/** * 模拟全局按键
*@param keyCode keyEvent键值
*/
public final void simulateKey(int keyCode) {
exec("input keyevent " + keyCode + "\n");
}
}
4、Android 4.4 模拟home键第1种方法

Intent i = new Intent(Intent.ACTION_MAIN);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addCategory(Intent.CATEGORY_HOME);
getContext().startActivity(i);
5、Android 4.4 模拟home键第2种方法,需要相应平台framework Jar包的支持

sendEvent(KeyEvent.ACTION_DOWN, KeyEvent.FLAG_FROM_SYSTEM);
sendEvent(KeyEvent.ACTION_UP, KeyEvent.FLAG_FROM_SYSTEM);
private void sendEvent(int action, int flags, long when) {
final int mCode = KeyEvent.KEYCODE_HOME;

final int repeatCount = (flags & KeyEvent.FLAG_LONG_PRESS) != 0 ? 1 : 0;

final KeyEvent ev = new KeyEvent(mDownTime, when, action, mCode,
repeatCount, 0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0, flags
| KeyEvent.FLAG_FROM_SYSTEM
| KeyEvent.FLAG_VIRTUAL_HARD_KEY,
InputDevice.SOURCE_KEYBOARD);

InputManager.getInstance().injectInputEvent(ev,
InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
}
6、第5种方法中按道理修改mCode值,换成其它键值也是可以的,但是换成返回键不行,音量键倒是可以,具体原因不详,有知道原因的朋友还望告诉我。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: