Android 跨進程模擬按鍵(KeyEvent )實例詳解
Android 解決不同進程發(fā)送KeyEvent 的問題
最近在做有關(guān)于Remote Controller 的功能,該功能把手機做成TV的遙控器來處理。在手機的客戶端發(fā)送消息到TV的android 服務(wù)端,服務(wù)端接收到客戶端的請求消息,模擬KeyEvent命令,發(fā)送Key值。
最簡單的發(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();
}
這種方法在當前的界面和相同的進程上是沒有問題的,可以實現(xiàn)的基本的需求。但當我還是把服務(wù)開啟著,按HOME將服務(wù)或者界面退出到后臺時,再通過客戶端向服務(wù)端服務(wù)發(fā)送消息使其模擬按鍵時,不幸的事情發(fā)送了:
Injecting to another application requires INJECT_EVENTS permission
提示沒有 INJECT_EVENTS這個權(quán)限。沒則加之,在AndroidManifest.xml文件里面添加該權(quán)限,再運行,問題還是沒有解決,原因是上面代碼最終還是調(diào)用的WindowsManagerService 里面的injectKeyEvent方法,該方法會去驗證你當前的程序的pid和uid,如果兩者在分發(fā)key 鍵時返回-1則會提示上面的error.
好了,廢話一大堆,下面到了真正解決這一問題的方法了。
網(wǎng)上各種google 各種百度,找不到自己需要的答案。
想過一個方法是(尚未驗證):
通過jni的方法將kernel 的發(fā)送keyevent的方法用NDK封裝成方法,做成庫給java調(diào)用,從而繞過Android WindowsManagerService 的驗證,這是我初期想到的解決思路,但尚未驗證。
另外一個通過驗證的方法為:
將你的服務(wù)的userId改成系統(tǒng)級別的,在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應(yīng)用程序四大組件之使用AIDL如何實現(xiàn)跨進程調(diào)用Service
- Android通過RemoteViews實現(xiàn)跨進程更新UI示例
- Android AIDL實現(xiàn)兩個APP間的跨進程通信實例
- Android編程實現(xiàn)AIDL(跨進程通信)的方法詳解
- Android IPC機制利用Messenger實現(xiàn)跨進程通信
- 詳解Android跨進程IPC通信AIDL機制原理
- Android 跨進程SharedPreferences異常詳解
- Android跨進程拋異常的原理的實現(xiàn)
- Android 跨進程通Messenger(簡單易懂)
- Android實現(xiàn)跨進程接口回掉的方法
相關(guān)文章
詳解Android WebView監(jiān)聽console錯誤信息
這篇文章主要介紹了Android WebView監(jiān)聽console錯誤信息,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
Android TextView中文本點擊文字跳轉(zhuǎn) (代碼簡單)
用過微博Android手機端的朋友的都知道微博正文有時有一些高亮顯示的文本,如話題、提到的人等等,當點擊這些文本時會跳到另外一個頁面(即另一個activity),下面就要來模仿微博的這個功能2016-01-01
Android使用SlidingPaneLayout 實現(xiàn)仿微信的滑動返回
這篇文章主要介紹了Android使用SlidingPaneLayout 實現(xiàn)仿微信的滑動返回,需要的朋友可以參考下2018-04-04
Android編程實現(xiàn)ListView滾動提示等待框功能示例
這篇文章主要介紹了Android編程實現(xiàn)ListView滾動提示等待框功能,結(jié)合實例形式分析了Android ListView滾動事件相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2017-02-02
手勢滑動結(jié)束Activity基本功能的實現(xiàn)(一)
這篇文章主要為大家詳細介紹了手勢滑動結(jié)束Activity基本功能的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06

