亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android 跨進(jìn)程模擬按鍵(KeyEvent )實(shí)例詳解

 更新時(shí)間:2016年11月15日 11:39:07   作者:Terry_龍  
這篇文章主要介紹了Android 跨進(jìn)程模擬按鍵(KeyEvent )實(shí)例詳解的相關(guān)資料,類似手機(jī)遙控器的需求就可以這么做,需要的朋友可以參考下

  Android 解決不同進(jìn)程發(fā)送KeyEvent 的問題

最近在做有關(guān)于Remote Controller 的功能,該功能把手機(jī)做成TV的遙控器來處理。在手機(jī)的客戶端發(fā)送消息到TV的android 服務(wù)端,服務(wù)端接收到客戶端的請(qǐng)求消息,模擬KeyEvent命令,發(fā)送Key值。

 最簡(jiǎn)單的發(fā)送命令為如下代碼:

 
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();
  }

這種方法在當(dāng)前的界面和相同的進(jìn)程上是沒有問題的,可以實(shí)現(xiàn)的基本的需求。但當(dāng)我還是把服務(wù)開啟著,按HOME將服務(wù)或者界面退出到后臺(tái)時(shí),再通過客戶端向服務(wù)端服務(wù)發(fā)送消息使其模擬按鍵時(shí),不幸的事情發(fā)送了:

Injecting to another application requires INJECT_EVENTS permission

提示沒有 INJECT_EVENTS這個(gè)權(quán)限。沒則加之,在AndroidManifest.xml文件里面添加該權(quán)限,再運(yùn)行,問題還是沒有解決,原因是上面代碼最終還是調(diào)用的WindowsManagerService 里面的injectKeyEvent方法,該方法會(huì)去驗(yàn)證你當(dāng)前的程序的pid和uid,如果兩者在分發(fā)key 鍵時(shí)返回-1則會(huì)提示上面的error.

 好了,廢話一大堆,下面到了真正解決這一問題的方法了。

網(wǎng)上各種google 各種百度,找不到自己需要的答案。

 想過一個(gè)方法是(尚未驗(yàn)證):

通過jni的方法將kernel 的發(fā)送keyevent的方法用NDK封裝成方法,做成庫給java調(diào)用,從而繞過Android WindowsManagerService 的驗(yàn)證,這是我初期想到的解決思路,但尚未驗(yàn)證。

另外一個(gè)通過驗(yàn)證的方法為:

將你的服務(wù)的userId改成系統(tǒng)級(jí)別的,在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編譯。

到了這里,你就可以跨進(jìn)程模擬按鍵了。

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

最新評(píng)論