Android 解决不同进程发送KeyEvent 的问题
最近在做有关于Remote Controller 的功能,该功能把手机做成TV的遥控器来处理。在手机的客户端发送消息到TV的android 服务端,服务端接收到客户端的请求消息,模拟KeyEvent命令,发送Key值。
最简单的发送命令为如下代码:
public static void simulateKeystroke(final int KeyCode) { 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(); }
这种方法在当前的界面和相同的进程上是没有问题的,可以实现的基本的需求。但当我还是把服务开启着,按HOME将服务或者界面退出到后台时,再通过客户端向服务端服务发送消息使其模拟按键时,不幸的事情发送了:
Injecting to another application requires INJECT_EVENTS permission
提示没有 INJECT_EVENTS这个权限。没则加之,在AndroidManifest.xml文件里面添加该权限,再运行,问题还是没有解决,原因是上面代码最终还是调用的WindowsManagerService 里面的injectKeyEvent方法,该方法会去验证你当前的程序的pid和uid,如果两者在分发key 键时返回-1则会提示上面的error.
好了,废话一大堆,下面到了真正解决这一问题的方法了。
网上各种google 各种百度,找不到自己需要的答案。
想过一个方法是(尚未验证):
通过jni的方法将kernel 的发送keyevent的方法用NDK封装成方法,做成库给java调用,从而绕过Android WindowsManagerService 的验证,这是我初期想到的解决思路,但尚未验证。
另外一个通过验证的方法为:
将你的服务的userId改成系统级别的,在manifest加如下代码:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xuzhitech.remote.server" android:versionCode="1" android:versionName="1.0" android:sharedUserId="android.uid.system" >
加上这一代码,需要在源码里面编译才能生效,添加Android.mk文件:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_PACKAGE_NAME := RemoteAndroidServer LOCAL_CERTIFICATE := platform #LOCAL_CERTIFICATE := share LOCAL_OVERRIDES_PACKAGES := Home include $(BUILD_PACKAGE)
这里的 LOCAL_CERTIFICATE 要使用platform编译,而不是share编译。
到了这里,你就可以跨进程模拟按键了。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
问题内容: 如何以编程方式模拟Droid上的按键?我想模仿一个手动按键(在机器人上显示有人正在按某个按键,但是这是通过编程方式完成的)。 有涉及的解决方案,但是在新的SDK中已经不再是选择。 问题答案: 您可以使用检测,即,从活动的onCreate调用的以下代码将导致菜单多次打开和关闭: …但是我不确定这是否是你所追求的
本文向大家介绍Android launcher中模拟按home键的实现,包括了Android launcher中模拟按home键的实现的使用技巧和注意事项,需要的朋友参考一下 Android launcher中模拟按home键的实现 Android中,如果想把stack中的某个Activity moveTaskToFront,可以定义一个BroadcastReceiver接收某种类型的B
本文向大家介绍Linux下模拟实现进度条实例详解,包括了Linux下模拟实现进度条实例详解的使用技巧和注意事项,需要的朋友参考一下 Linux下模拟实现进度条 在Linux系统下模拟进度条,首先需要了解一些简单基础知识: 1、在Linux系统下,\r是回车符,\n是换行符,回车是行不变光标回到该行的起始位置,换行是跳转到下一行,但是光标位置不变; 2、C\C++的输入输出都有缓冲
问题内容: 搜索了几个小时后,我想知道是否有可能模拟键盘上的按下按键。例如,我希望我的程序将按键保持5秒钟,因此当我在记事本中运行它时,它看起来像是这样的:。我在互联网上尝试了不同的代码段,到目前为止,我能找到的最好的东西是: Sendkey模块也不能解决我的问题,因为它只允许您发送一次按键,而不发送按住键按下事件。我知道过autoit,它在过去使用过,但是我只是真的想知道python是否可行以及
问题内容: 使用jQuery,如何在单击链接时模拟(触发?)KeyPress?例如,当用户单击以下链接时: 然后,通过单击链接,就好像他们按下了键盘上的“空格键”一样。 像这样,我假设: 关于如何实现这一目标的任何想法? 问题答案: jQuery的keypress事件旨在完成这种工作。您可以通过将字符串“keypress”传递给.trigger()来触发事件。但是,更具体地说,您实际上也可以传递j
本文向大家介绍Android 中隐藏虚拟按键的方法实例代码,包括了Android 中隐藏虚拟按键的方法实例代码的使用技巧和注意事项,需要的朋友参考一下 下面通过一段代码给大家讲解android 隐藏虚拟按键的方法,废话不多说了,大家多多看看代码和注释吧,具体代码如下所示: 例子 以上所述是小编给大家介绍的Android 中隐藏虚拟按键的方法实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言