一,0權限重啟手機:
現在我們來定義一個實現該功能的類:
- /**
- * 單擊事件
- * @param view
- */
- public void reboot(View view) {
- Intent reboot = new Intent(Intent.ACTION_REBOOT);
- reboot.putExtra("nowait", 1);
- reboot.putExtra("interval", 1);
- reboot.putExtra("window", 0);
- sendBroadcast(reboot);
- }
程序異常終止了,logcat控制輸出,說沒有權限
我們需要了解一下重啟手機需要什麼樣的權限
其中Android:protectionLevel="signatureOrSystem"表明要只能是系統的程序或者簽名和系統簽名一樣的程序才能夠實現重啟手機的功能. 我們就在清單文件裡面,加上缺少的權限
<uses-permission android:name="android.permission.REBOOT"/>
但是程序還是出現同樣的錯誤.
然而我們可以在把我們的程序提高成系統的權限(我們程序的uid和系統的等級一樣)只需要這樣配置:
android:sharedUserId="android.uid.system"
運行後發現如下錯誤:
[2012-02-12 22:51:26 - android_safe_reboot] Installation error: INSTALL_FAILED_SHARED_USER_INCOMPATIBLE
[2012-02-12 22:51:26 - android_safe_reboot] Please check logcat output for more details.[2012-02-12 22:51:26 - android_safe_reboot] Launch canceled!
表示安裝失敗,因為我們雖然使用
android:sharedUserId="android.uid.system"但是我們程序的簽名不是系統的簽名,eclipse默認是debug簽名.
所以現在我們的程序必須系統的簽名,當然可以到網站去下載.(platform.pk8,platform.x509.pem)
現在我們要做的是程序使用系統的簽名,那該怎麼做呢?(需要簽名打包工具signapk.jar,)
第一步,出eclipse的我們寫的程序,在bin目錄下就可以找到.
第二步,打開該apk把,把裡面META-INF(包含的是一些默認簽名的信息)的三個文件刪除
第三步,使用signapk.jar命定進行簽名打包.
E:\2\douban4\SignApk (1)\SignApk>java -jar signapk.jarplatform.x509.pem platfor m.pk8android_safe_reboot.apk(原pak)reboot.apk(新apk)
然後我們通過cmd命令把打包後的apk安裝到模擬器上,出現如下錯誤:
因為模擬器上已經有了這樣一個程序但是,他的簽名是debug簽名,我們知道唯一標識一個應用程序是包名和簽名
只有兩個程序的簽名和包名一樣,那麼才表示這兩個應用程序是同一類別的程序.
如一個應用程序要更新,那麼就必須保持簽名和包名一直,否則更新則不成功.
以包名和簽名來標識一個程序,這樣有什麼好處?
如果僅以包名來標識,如果別人知道了你程序的包名,那麼別人就可以也寫一個另類的程序,但是和你的包名一樣,用戶一安裝就把你的覆蓋了.
綜上所述,我們需要把模擬器上的這個程序卸載(adb uninstall 包名),然後我們再安裝簽名打包後的apk,啟動程序,單擊按鈕,然後模擬器會出現如下情況因為是模擬器,它會一直停留在該界面,如果是真機就不會出現這樣的情況.
但是,這樣做比較麻煩.我們可以通過下面的方式來實現.
- public void reboot(View view){
- // 利用吐司來重啟手機
- // system_server
- while(true){
- Toast myToast = new Toast(this);
- myToast.setView(new View(this));
- myToast.show();
- }
-
- }
這段代碼應該寫到Service的子線程中,這樣就不會阻塞用戶的請求.