Android 4.4 模拟 home键、back键等keyEvent
在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值,换成其它键值也是可以的,但是换成返回键不行,音量键倒是可以,具体原因不详,有知道原因的朋友还望告诉我。