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
android.permission.INJECT_EVENTS
(注:上面2中方法都需要添加相应的权限,然后自己写个Android.mk 放到Android源码中进行编译)
3、Android 4.4 模拟back键第3种方法,机器需要root权限
==================================================================================================================
在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值,换成其它键值也是可以的,但是换成返回键不行,音量键倒是可以,具体原因不详,有知道原因的朋友还望告诉我。
相关文章推荐
- Android自定义SwitchButton左右滑动开关按钮控件
- 设计模式之Singleton(单态/单态)
- Android中Thread的使用之Handler机制
- 创建或打开android模拟器时遇到的问题,以及打开后遇到的Failed to install FragmentTest.apk on device 'emulator-5554': timeout
- 菜单 和ActionBar
- android 弧形自定义view
- Android Please ensure that adb is correctly located at问题解决
- android 获取数据-需要注意的地方(系统优化)
- Service的生命周期(一)
- 关于android系统的分辨率:使用其他设备模拟该分辨率
- Android应用发布的准备——生成渠道包
- Android优化之ViewStub
- Android性能优化——内存优化
- Android开发遇到的Exception
- Android入门(6)——浅谈Android开发五大布局
- Android手势识别的发展
- 为什么ios系统比android系统更为流畅
- Android 知识点收藏
- Android ListView 数据混乱
- Android 学习笔记——利用JNI技术在Android中调用、调试C++代码