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

