android實(shí)現(xiàn)靜默安裝與卸載的方法
本文實(shí)例講述了android實(shí)現(xiàn)靜默安裝與卸載的方法。分享給大家供大家參考。具體如下:
方法1:【使用調(diào)用接口方法,由于安裝卸載應(yīng)用程序的部分API是隱藏的,所以必須下載Android系統(tǒng)源碼,在源碼下開發(fā)并編譯之后使用MM命令編譯生成APK文件】
import java.io.File; import android.app.Activity; import android.os.Bundle; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.IPackageInstallObserver; import android.content.pm.IPackageDeleteObserver; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Environment; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; public class InstallActivity extends Activity { /** Called when the activity is first created. */ private String APK_NAME = "QQHD-mini.apk"; private Button install = null; private Button uninstall = null; private final int INSTALL_COMPLETE = 1; private final int UNINSTALL_COMPLETE = 2; final static int SUCCEEDED = 1; final static int FAILED = 0; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.install_uninstall); install = (Button) findViewById(R.id.install); uninstall = (Button) findViewById(R.id.uninstall); uninstall.setOnClickListener(listener1); install.setOnClickListener(listener2); } private OnClickListener listener2=new OnClickListener(){ public void onClick(View v) { String fileName = Environment.getExternalStorageDirectory() + "/" + APK_NAME; Uri uri = Uri.fromFile(new File(fileName)); int installFlags = 0; PackageManager pm = getPackageManager(); try { PackageInfo pi = pm.getPackageInfo("com.tencent.minihd.qq", PackageManager.GET_UNINSTALLED_PACKAGES); if(pi != null) { installFlags |= PackageManager.INSTALL_REPLACE_EXISTING; } } catch (NameNotFoundException e) {} PackageInstallObserver observer = new PackageInstallObserver(); pm.installPackage(uri, observer, installFlags, "com.tencent.minihd.qq"); } }; class PackageInstallObserver extends IPackageInstallObserver.Stub { public void packageInstalled(String packageName, int returnCode) { Message msg = mHandler.obtainMessage(INSTALL_COMPLETE); msg.arg1 = returnCode; mHandler.sendMessage(msg); } }; private Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case INSTALL_COMPLETE: int centerTextLabel; Drawable centerTextDrawable = null; if(msg.arg1 == SUCCEEDED) { Toast.makeText(getApplicationContext(), "install apk SUCCEEDED", Toast.LENGTH_SHORT).show(); } else {} if (centerTextDrawable != null) {} break; case UNINSTALL_COMPLETE: int centerTextLabel2; Drawable centerTextDrawable2 = null; if(msg.arg1 == SUCCEEDED) { Toast.makeText(getApplicationContext(), "uninstall apk SUCCEEDED", Toast.LENGTH_SHORT).show(); } else {} if (centerTextDrawable2 != null) {} break; default: break; } } }; private OnClickListener listener1=new OnClickListener(){ public void onClick(View v) { PackageManager pm = getPackageManager(); PackageDeleteObserver observer = new PackageDeleteObserver(); pm.deletePackage("com.tencent.minihd.qq", observer, 0); } }; private class PackageDeleteObserver extends IPackageDeleteObserver.Stub { public void packageDeleted(String packageName, int returnCode) { Message msg = mHandler.obtainMessage(UNINSTALL_COMPLETE); msg.arg1 = returnCode; mHandler.sendMessage(msg); } } }
安裝、卸載相關(guān)權(quán)限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.INSTALL_PACKAGES" /> <uses-permission android:name="android.permission.DELETE_PACKAGES" /> <uses-permission android:name="android.permission.CLEAR_APP_CACHE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
方法2:【需要獲取root權(quán)限或者和rom擁有一樣的簽名,即讓該apk以System的身份在系統(tǒng)中運(yùn)行】
private void test() { execCommand("system/bin/pm install -r " + "sdcard/xxx.apk"); // xxx.apk放置在內(nèi)置儲(chǔ)存的根目錄下(mnt/sdcard/xxx.apk) // execCommand("system/bin/pm uninstall " + PACKAGE_NAME); //PACKAGE_NAME為xxx.apk包名 } public boolean execCommand(String cmd) { Process process = null; try { process = Runtime.getRuntime().exec(cmd); process.waitFor(); } catch (Exception e) { return false; } finally { try { process.destroy(); } catch (Exception e) { } } return true; }
其他方法:一些第三方j(luò)ar包等方式。
希望本文所述對(duì)大家的Android程序設(shè)計(jì)有所幫助。
相關(guān)文章
Android使用criteria選擇合適的地理位置服務(wù)實(shí)現(xiàn)方法
這篇文章主要介紹了Android使用criteria選擇合適的地理位置服務(wù)實(shí)現(xiàn)方法,實(shí)例分析了Criteria的具體使用技巧,需要的朋友可以參考下2016-01-01Android Socket 線程連接openwrt與arduino單片機(jī)串口雙向通信的實(shí)例解析
這篇文章主要介紹了Android Socket 線程連接openwrt與arduino單片機(jī)串口雙向通信的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11Android互聯(lián)網(wǎng)訪問(wèn)圖片并在客戶端顯示的方法
這篇文章主要介紹了Android互聯(lián)網(wǎng)訪問(wèn)圖片并在客戶端顯示的方法,結(jié)合實(shí)例分析了Android處理圖片的技巧,并附帶了Android的URL封裝類,網(wǎng)絡(luò)連接封裝類與輸出流封裝類,需要的朋友可以參考下2015-12-12SimpleCommand框架ImageLoader API詳解(三)
這篇文章主要為大家詳細(xì)介紹了SimpleCommand框架ImageLoader API,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Android仿微信發(fā)送語(yǔ)音消息的功能及示例代碼
這篇文章主要介紹了Android仿微信發(fā)送語(yǔ)音消息的功能及示例代碼,需要的朋友參考下吧2017-08-08Android開發(fā)中編寫藍(lán)牙相關(guān)功能的核心代碼講解
這篇文章主要介紹了Android開發(fā)中編寫藍(lán)牙功能的核心部分講解,包括掃描和配對(duì)以及修改藍(lán)牙設(shè)備可見性等操作,需要的朋友可以參考下2016-02-02Android開發(fā)Popwindow仿微信右上角下拉菜單實(shí)例代碼
這篇文章主要介紹了Popwindow仿微信右上角下拉菜單實(shí)例代碼的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-10-10基于Android實(shí)現(xiàn)ListView圓角效果
這篇文章主要為大家詳細(xì)介紹了基于Android實(shí)現(xiàn)ListView圓角效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06Android開發(fā)中ViewPager實(shí)現(xiàn)多頁(yè)面切換效果
ViewPager用于實(shí)現(xiàn)多頁(yè)面的切換效果,該類存在于Google的兼容包里面,所以在引用時(shí)記得在BuilldPath中加入“Android-support-v4.jar”。具體詳情大家可以參考下本文2016-11-11