当前位置: 首页 > 编程笔记 >

Android 跨进程模拟按键(KeyEvent )实例详解

万俟光临
2023-03-14
本文向大家介绍Android 跨进程模拟按键(KeyEvent )实例详解,包括了Android 跨进程模拟按键(KeyEvent )实例详解的使用技巧和注意事项,需要的朋友参考一下

  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 中隐藏虚拟按键的方法实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言