標籤:按鍵類比 系統簽名 back menu
1.使一個程式成為系統程式
我們必須在manifest 中配置android:sharedUserId="android.uid.system"
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.flyaudio.floatwindows" android:versionCode="1" android:sharedUserId="android.uid.system" android:versionName="1.0" >
加上許可權:<uses-permission android:name="android.permission.INJECT_EVENTS" />
這個許可權就是為了允許一個程式截獲使用者事件如按鍵、觸摸、軌跡球等等到一個時間流。
2.類比home、back、menu
private void homePress(){Intent mHomeIntent = new Intent(Intent.ACTION_MAIN); mHomeIntent.addCategory(Intent.CATEGORY_HOME); mHomeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); getContext().startActivity(mHomeIntent);}private void backPress(){ Runtime runtime = Runtime.getRuntime(); try {runtime.exec("input keyevent " + KeyEvent.KEYCODE_BACK);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}private void menuPress(){ Runtime runtime = Runtime.getRuntime(); try {runtime.exec("input keyevent " + KeyEvent.KEYCODE_MENU);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
其實還有一種方法就是:
new Thread(){ public void run() { try{ Instrumentation inst = new Instrumentation(); inst.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK); } catch (Exception e) { Log.e("Exception when onBack", e.toString()); } } }.start();
inst.sendKeyDownUpSync(KeyEvent.KEYCODE_BACK);
這裡可以傳入任何鍵值。
3.添加系統簽名
完成上面2個步驟之後,安裝程式發現會出現Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]錯誤。因為使用eclipse編譯後的程式不帶有platform簽名,所以作為系統程式安裝不了。
所以需要對apk進行簽名
將簽名工具(signapk.jar)、簽署憑證(platform.pk8和platform.x509.pem)及編譯出來的apk檔案都放到同一目錄
終端進入該目錄執行java -jar signapk.jar -w platform.x509.pem platform.pk8 XXX.apk out/XXX.apk
拿出out目錄下被簽名後的apk進行安裝
4.附上籤名工具
裡面有2種簽名shared和platform
下載簽名工具
將程式變成system app 實現home、back、menu等按鍵類比