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



 

 

  

 

 


 

 

 

 

posted @ 2015-07-04 21:26  小驰行动派  阅读(147)  评论(0编辑  收藏  举报  来源