android實現(xiàn)靜默安裝與卸載的方法
本文實例講述了android實現(xiàn)靜默安裝與卸載的方法。分享給大家供大家參考。具體如下:
方法1:【使用調(diào)用接口方法,由于安裝卸載應用程序的部分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)中運行】
private void test() { execCommand("system/bin/pm install -r " + "sdcard/xxx.apk"); // xxx.apk放置在內(nèi)置儲存的根目錄下(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; }
其他方法:一些第三方jar包等方式。
希望本文所述對大家的Android程序設(shè)計有所幫助。
相關(guān)文章
Android使用criteria選擇合適的地理位置服務實現(xiàn)方法
這篇文章主要介紹了Android使用criteria選擇合適的地理位置服務實現(xiàn)方法,實例分析了Criteria的具體使用技巧,需要的朋友可以參考下2016-01-01Android Socket 線程連接openwrt與arduino單片機串口雙向通信的實例解析
這篇文章主要介紹了Android Socket 線程連接openwrt與arduino單片機串口雙向通信的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-11-11Android互聯(lián)網(wǎng)訪問圖片并在客戶端顯示的方法
這篇文章主要介紹了Android互聯(lián)網(wǎng)訪問圖片并在客戶端顯示的方法,結(jié)合實例分析了Android處理圖片的技巧,并附帶了Android的URL封裝類,網(wǎng)絡連接封裝類與輸出流封裝類,需要的朋友可以參考下2015-12-12SimpleCommand框架ImageLoader API詳解(三)
這篇文章主要為大家詳細介紹了SimpleCommand框架ImageLoader API,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10Android開發(fā)中編寫藍牙相關(guān)功能的核心代碼講解
這篇文章主要介紹了Android開發(fā)中編寫藍牙功能的核心部分講解,包括掃描和配對以及修改藍牙設(shè)備可見性等操作,需要的朋友可以參考下2016-02-02Android開發(fā)Popwindow仿微信右上角下拉菜單實例代碼
這篇文章主要介紹了Popwindow仿微信右上角下拉菜單實例代碼的相關(guān)資料,非常不錯具有參考借鑒價值,感興趣的朋友一起看看吧2016-10-10Android開發(fā)中ViewPager實現(xiàn)多頁面切換效果
ViewPager用于實現(xiàn)多頁面的切換效果,該類存在于Google的兼容包里面,所以在引用時記得在BuilldPath中加入“Android-support-v4.jar”。具體詳情大家可以參考下本文2016-11-11