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編譯。

到了這里,你就可以跨進程模擬按鍵了。

Best Regards .

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM