Android 跨進(jìn)程模擬按鍵(KeyEvent )實(shí)例詳解
Android 解決不同進(jìn)程發(fā)送KeyEvent 的問(wèn)題
最近在做有關(guān)于Remote Controller 的功能,該功能把手機(jī)做成TV的遙控器來(lái)處理。在手機(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)程上是沒有問(wèn)題的,可以實(shí)現(xiàn)的基本的需求。但當(dāng)我還是把服務(wù)開啟著,按HOME將服務(wù)或者界面退出到后臺(tái)時(shí),再通過(guò)客戶端向服務(wù)端服務(wù)發(fā)送消息使其模擬按鍵時(shí),不幸的事情發(fā)送了:
Injecting to another application requires INJECT_EVENTS permission
提示沒有 INJECT_EVENTS這個(gè)權(quán)限。沒則加之,在AndroidManifest.xml文件里面添加該權(quán)限,再運(yùn)行,問(wèn)題還是沒有解決,原因是上面代碼最終還是調(diào)用的WindowsManagerService 里面的injectKeyEvent方法,該方法會(huì)去驗(yàn)證你當(dāng)前的程序的pid和uid,如果兩者在分發(fā)key 鍵時(shí)返回-1則會(huì)提示上面的error.
好了,廢話一大堆,下面到了真正解決這一問(wèn)題的方法了。
網(wǎng)上各種google 各種百度,找不到自己需要的答案。
想過(guò)一個(gè)方法是(尚未驗(yàn)證):
通過(guò)jni的方法將kernel 的發(fā)送keyevent的方法用NDK封裝成方法,做成庫(kù)給java調(diào)用,從而繞過(guò)Android WindowsManagerService 的驗(yàn)證,這是我初期想到的解決思路,但尚未驗(yàn)證。
另外一個(gè)通過(guò)驗(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通過(guò)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開發(fā)之底圖局部加載移動(dòng)的方法示例
這篇文章主要介紹了Android開發(fā)之底圖局部加載移動(dòng)的方法,涉及Android針對(duì)圖片與屏幕屬性的讀取、計(jì)算、設(shè)置等相關(guān)操作技巧,需要的朋友可以參考下2017-08-08
詳解Android WebView監(jiān)聽console錯(cuò)誤信息
這篇文章主要介紹了Android WebView監(jiān)聽console錯(cuò)誤信息,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
Android StrictMode運(yùn)行流程(推薦)
strictmode是android在 API9后引入的檢測(cè)影響app運(yùn)行流暢性的一種機(jī)制。這篇文章給大家介紹了android strictmode運(yùn)行流程,需要的朋友參考下吧2018-01-01
Android TextView中文本點(diǎn)擊文字跳轉(zhuǎn) (代碼簡(jiǎn)單)
用過(guò)微博Android手機(jī)端的朋友的都知道微博正文有時(shí)有一些高亮顯示的文本,如話題、提到的人等等,當(dāng)點(diǎn)擊這些文本時(shí)會(huì)跳到另外一個(gè)頁(yè)面(即另一個(gè)activity),下面就要來(lái)模仿微博的這個(gè)功能2016-01-01
Android使用SlidingPaneLayout 實(shí)現(xiàn)仿微信的滑動(dòng)返回
這篇文章主要介紹了Android使用SlidingPaneLayout 實(shí)現(xiàn)仿微信的滑動(dòng)返回,需要的朋友可以參考下2018-04-04
Android編程實(shí)現(xiàn)ListView滾動(dòng)提示等待框功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)ListView滾動(dòng)提示等待框功能,結(jié)合實(shí)例形式分析了Android ListView滾動(dòng)事件相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-02-02
手勢(shì)滑動(dòng)結(jié)束Activity基本功能的實(shí)現(xiàn)(一)
這篇文章主要為大家詳細(xì)介紹了手勢(shì)滑動(dòng)結(jié)束Activity基本功能的實(shí)現(xiàn)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
Android實(shí)現(xiàn)自動(dòng)填充短信驗(yàn)證碼功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)自動(dòng)填充短信驗(yàn)證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12

