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

 更新时间:2016年11月15日 11:39:07   作者:Terry_龙  
这篇文章主要介绍了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编译。

到了这里,你就可以跨进程模拟按键了。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • Android开发之底图局部加载移动的方法示例

    Android开发之底图局部加载移动的方法示例

    这篇文章主要介绍了Android开发之底图局部加载移动的方法,涉及Android针对图片与屏幕属性的读取、计算、设置等相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • 详解Android WebView监听console错误信息

    详解Android WebView监听console错误信息

    这篇文章主要介绍了Android WebView监听console错误信息,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Android StrictMode运行流程(推荐)

    Android StrictMode运行流程(推荐)

    strictmode是android在 API9后引入的检测影响app运行流畅性的一种机制。这篇文章给大家介绍了android strictmode运行流程,需要的朋友参考下吧
    2018-01-01
  • Android TextView中文本点击文字跳转 (代码简单)

    Android TextView中文本点击文字跳转 (代码简单)

    用过微博Android手机端的朋友的都知道微博正文有时有一些高亮显示的文本,如话题、提到的人等等,当点击这些文本时会跳到另外一个页面(即另一个activity),下面就要来模仿微博的这个功能
    2016-01-01
  • Android控件系列之EditText使用方法

    Android控件系列之EditText使用方法

    EditText是接受用户输入信息的最重要控件。通过前面课程的学习,您可能会猜到可以利用EditText.getText()获取它的文本,但真正的项目中,可能没那么简单,需要更多的限制,如文本长度限制,是否数字限制等等
    2012-11-11
  • Android使用SlidingPaneLayout 实现仿微信的滑动返回

    Android使用SlidingPaneLayout 实现仿微信的滑动返回

    这篇文章主要介绍了Android使用SlidingPaneLayout 实现仿微信的滑动返回,需要的朋友可以参考下
    2018-04-04
  • Android编程实现ListView滚动提示等待框功能示例

    Android编程实现ListView滚动提示等待框功能示例

    这篇文章主要介绍了Android编程实现ListView滚动提示等待框功能,结合实例形式分析了Android ListView滚动事件相关实现技巧,需要的朋友可以参考下
    2017-02-02
  • 手势滑动结束Activity基本功能的实现(一)

    手势滑动结束Activity基本功能的实现(一)

    这篇文章主要为大家详细介绍了手势滑动结束Activity基本功能的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Android Toast的用法总结(五种用法)

    Android Toast的用法总结(五种用法)

    本篇文章主要介绍了Android Toast的用法总结(五种用法),android toast几种使用方法 toast经常会用到,今天做个总结,特别是自定义toast的布局,值得一看。
    2017-01-01
  • Android实现自动填充短信验证码功能

    Android实现自动填充短信验证码功能

    这篇文章主要为大家详细介绍了Android实现自动填充短信验证码功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12

最新评论