編輯:關於Android編程
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已經幫封裝好了一個倒計時類CountDownTimer,其實是將後台線程的創建和Handler隊列封
在Android開發中;Activity之間傳遞參數是常見的事;如果我們要在Activity之間傳遞圖片;1。MainActivity中包括一個ImageView;當我們
1、概述 眾所周知,Activity在不明確指定屏幕方向和configChanges時,當用戶旋轉屏幕會重新啟動。當然了,應對這種情況,Android給
窗口管理系統是Android中的主要子系統之一,它涉及到App中組件的管理,系統和應用窗口的管理和繪制等工作。由於其涉及模塊眾多,且與用戶體驗密切相關,所以它也是Andr