Android 跨進(jìn)程模擬按鍵(KeyEvent )實(shí)例詳解
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ì)本站的支持!
- Android應(yīng)用程序四大組件之使用AIDL如何實(shí)現(xiàn)跨進(jìn)程調(diào)用Service
- Android通過RemoteViews實(shí)現(xiàn)跨進(jìn)程更新UI示例
- Android AIDL實(shí)現(xiàn)兩個(gè)APP間的跨進(jìn)程通信實(shí)例
- Android編程實(shí)現(xiàn)AIDL(跨進(jìn)程通信)的方法詳解
- Android IPC機(jī)制利用Messenger實(shí)現(xiàn)跨進(jìn)程通信
- 詳解Android跨進(jìn)程IPC通信AIDL機(jī)制原理
- Android 跨進(jìn)程SharedPreferences異常詳解
- Android跨進(jìn)程拋異常的原理的實(shí)現(xiàn)
- Android 跨進(jìn)程通Messenger(簡(jiǎn)單易懂)
- Android實(shí)現(xiàn)跨進(jìn)程接口回掉的方法
相關(guān)文章
Android ScrollView的頂部下拉和底部上拉回彈效果
本篇文章主要介紹了Android ScrollView的頂部下拉和底部上拉回彈效果,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05淺談Android開發(fā)Webview的Loading使用效果
這篇文章主要為大家介紹了淺談Android開發(fā)Webview的Loading使用效果詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02MVVMLight項(xiàng)目之雙向數(shù)據(jù)綁定
這篇文章主要介紹了MVVMLight項(xiàng)目中雙向數(shù)據(jù)綁定的示例源碼及實(shí)現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步除夕快樂,新年快樂2022-01-01Android開發(fā)之計(jì)算器GridLayout布局實(shí)現(xiàn)方法示例
這篇文章主要介紹了Android開發(fā)之計(jì)算器GridLayout布局實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了Android計(jì)算器界面布局及表達(dá)式計(jì)算相關(guān)操作技巧,需要的朋友可以參考下2019-03-03Flutter給控件實(shí)現(xiàn)鉆石般的微光特效
這篇文章主要給大家介紹了關(guān)于Flutter給控件實(shí)現(xiàn)鉆石般的微光特效的相關(guān)資料,實(shí)現(xiàn)的效果非常不錯(cuò),非常適合大家做開發(fā)的時(shí)候參考,需要的朋友可以參考下2021-08-08Android中使用ShareSDK集成分享功能的實(shí)例代碼
下面小編就為大家分享一篇Android中使用ShareSDK集成分享功能的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01Android編程之絕對(duì)布局AbsoluteLayout和相對(duì)布局RelativeLayout實(shí)例詳解
這篇文章主要介紹了Android編程之絕對(duì)布局AbsoluteLayout和相對(duì)布局RelativeLayout實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Android絕對(duì)布局AbsoluteLayout和相對(duì)布局RelativeLayout的原理與使用技巧,需要的朋友可以參考下2015-12-12android RecyclerView的一些優(yōu)化點(diǎn)介紹
大家好,本篇文章主要講的是android RecyclerView的一些優(yōu)化點(diǎn)介紹,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12android網(wǎng)絡(luò)圖片查看器簡(jiǎn)單實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了android網(wǎng)絡(luò)圖片查看器的簡(jiǎn)單實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03