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编译。

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

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

(0)

相关推荐

  • Android 物理按键整理及实例代码

    先给大家看一段代码,然后说明. import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInst

  • 安卓(Android) 监听按键长按事件

    1,key -- 实体按键 现在手机物理按键越来越少 常见的有 KEYCODE_VOLUME_DOWN/UP KEYCODE_POWER KEYCODE_BACK KEYCODE_HOME KEYCODE_MENU 在一个activity 重载父类 的下面这三个方法来处理按键事件 public boolean onKeyDown(int keyCode, KeyEvent event): public boolean onKeyUp(int keyCode, KeyEvent event): p

  • Android如何为按键添加声音

    为程序的按钮添加按键声音能更好的亲和用户,产生更好的使用体验,下面就是为按键添加声音的方法: public class MainActivity extends Activity { private Button mButton01; private SoundPool sp;//声明一个SoundPool private int music;//定义一个整型用load():来设置suondID @Override public void onCreate(Bundle savedInstanc

  • Android App实现监听软键盘按键的三种方式

    前言: 我们在Android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的"Go"按键加载url页面:在点击搜索框的时候,点击右下角的search符号键可以进行搜索:或者在全部数据输入完毕后,点击右下角的"done"就马上进行下一步操作. 效果图: function 1: 重写Activity的dispatchKeyEvent(KeyEvent event)方法,在其中监听KeyEventKey.KEYCODE

  • Android 中隐藏虚拟按键的方法实例代码

    下面通过一段代码给大家讲解android 隐藏虚拟按键的方法,废话不多说了,大家多多看看代码和注释吧,具体代码如下所示: /** * 隐藏虚拟按键,并且全屏 */ protected void hideBottomUIMenu() { //隐藏虚拟按键,并且全屏 if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api View v = this.getWindow().getDec

  • android编程之menu按键功能实现方法

    本文实例讲述了android编程之menu按键功能实现方法.分享给大家供大家参考.具体分析如下: android应用程序可以通过menu按键弹出菜单,现在通过menu按键弹出一个拥有两个选项的菜单.点击第一个按键,文本框会显示"第1个按键",点击第二个按键,文本框会显示"第2个按键" package com.test_menu; import android.app.Activity; import android.os.Bundle; import android

  • Android给自定义按键添加广播和通过广播给当前焦点输入框赋值

    一.给自定义按键添加广播 修改PhoneWindowManager.java中的interceptKeyBeforeDispatching方法 /frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @Override public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int poli

  • Android中捕捉menu按键点击事件的方法

    本文实例讲述了Android中捕捉menu按键点击事件的方法.分享给大家供大家参考.具体如下: @Override public boolean onCreateOptionsMenu(Menu menu) { /* * add()方法的四个参数,依次是: 1.组别,如果不分组的话就写Menu.NONE, * 2.Id,这个很重要,Android根据这个Id来确定不同的菜单 3.顺序,那个菜单现在在前面由这个参数的大小决定 * 4.文本,菜单的显示文本 */ menu.add(Menu.NONE

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

      Android 解决不同进程发送KeyEvent 的问题 最近在做有关于Remote Controller 的功能,该功能把手机做成TV的遥控器来处理.在手机的客户端发送消息到TV的android 服务端,服务端接收到客户端的请求消息,模拟KeyEvent命令,发送Key值. 最简单的发送命令为如下代码: public static void simulateKeystroke(final int KeyCode) { new Thread(new Runnable() { public v

  • Android 拦截返回键事件的实例详解

    Android 拦截返回键事件的实例详解 KeyEvent类 Android.View.KeyEvent类中定义了一系列的常量和方法,用来描述Android中的 按键事件和返回键有关的常量和方法有. KeyEvent.KEYCODE_BACK: 表示key类型为返回键 KeyEvent.ACTION_DOWN:表示事件为按下key,如果一直按住不放,则会不停产生此事件. KeyEvent.ACTION_UP:表示事件为为放开key,一次点击key过程只会调用一次. public final in

  • Android 通过网络图片路径查看图片实例详解

    Android 通过网络图片路径查看图片实例详解 1.在项目清单中添加网络访问权限 <!--访问网络的权限--> <uses-permission android:name="android.permission.INTERNET"/> 2.获取网络图片数据 /** * 获取网络图片的数据 * @param path 网络图片路径 * @return * @throws Exception */ public static byte[] getImage(Str

  • Android 自定义imageview实现图片缩放实例详解

    Android 自定义imageview实现图片缩放实例详解 觉得这个自定义的imageview很好用 性能不错  所以拿出来分享给大家  因为不会做gif图  所以项目效果 就不好贴出来了  把代码贴出来 1.项目结构图 2.Compat.class package com.suo.image; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; import android.view.View; pu

  • Android xmlns 的作用及其自定义实例详解

     Android xmlns 的作用及其自定义实例详解 xmlns:Android="http://schemas.android.com/apk/res/android的作用是: 这个是xml的命名空间,有了他,你就可以alt+/作为提示,提示你输入什么,不该输入什么,什么是对的,什么是错的,也可以理解为语法文件.或者语法判断器什么的 这个主要作用是在运行的时候那些控件的属性都是通过它来识别的,如果上面你写错了,不会有任何问题,但是在运行的时候就会有问题,提示你没有指定宽度等什么.这个是不用联

  • Android 开发中使用Linux Shell实例详解

    Android 开发中使用Linux Shell实例详解 引言 Android系统是基于Linux内核运行的,而做为一名Linux粉,不在Android上面运行一下Linux Shell怎么行呢? 最近发现了一个很好的Android Shell工具代码,在这里分享一下. Shell核心代码 import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.

  • Android String资源文件插入值实例详解

    Android String资源文件插入值实例详解 我们在用string字符串资源文件引用的时候,有时候会遇到一串字符串要在中间插入一个值的问题, 比如 登录名: XXX,这里XXX是变化的.这时候我们可能会想到拼接.其实也可以使用格式化方式处理.比如 <string name="alert">I am %1$d years old</string> 在代码中使用的话: nt nAge=23; String sAgeFormat = getResources()

  • Android屏幕及view的截图实例详解

    Android屏幕及view的截图实例详解 屏幕可见区域的截图 整个屏幕截图的话可以用View view = getWindow().getDecorView(); public static Bitmap getNormalViewScreenshot(View view) { view.setDrawingCacheEnabled(true); view.buildDrawingCache(); return view.getDrawingCache(); } scrollview的整体截屏

  • Android Activity启动模式之singleTop实例详解

    本文实例讲述了Android Activity启动模式之singleTop.分享给大家供大家参考,具体如下: 在前面文章<Android Activity启动模式之standard实例详解>中,我们介绍了活动的默认启动模式standard,本文继续介绍Activity的singleTop模式. singleTop模式:当Activity的活动模式设置为singleTop时,在启动活动时首先检查栈顶活动是否是该活动,如果是,在使用当前实例,否则继续创建新的实例. (1)修改AndroidMani

  • Android RecyclerView添加头部和底部实例详解

    Android RecyclerView添加头部和底部实例详解 如果只是想添加头部,可是使用GitHub里面这个项目,它可以为LinearLayoutManager,GridLayoutManager ,StaggeredGridLayoutManager布局的RecyclerView添加header.使用起来也十分简单: 只需将RecyclerViewHeader布局放在RecyclerView的上层. <FrameLayout android:layout_width="match_p

随机推荐