android静默安装、静默卸载apk方法

来源:互联网 发布:mysql instr 函数 编辑:程序博客网 时间:2024/06/10 16:54

1,实现一下这两个类的回掉

class MyPackageInstallObserver extends IPackageInstallObserver.Stub {@Overridepublic void packageInstalled(String packageName, int returnCode)throws RemoteException {// TODO Auto-generated method stubLog.i(TAG, "install return code = " + returnCode);if (returnCode == 1) {// installedPackagename = packageName;Message msg = mhander.obtainMessage();msg.what = Operation.INSTALL_COMPLETEED;mhander.sendMessage(msg);installedPKG_Name = packageName;} else {Message msg = mhander.obtainMessage();msg.what = Operation.INSTALL_APK_FAIL;mhander.sendMessage(msg);}}}class MyPackageDeleteObserver extends IPackageDeleteObserver.Stub {@Overridepublic void packageDeleted(String PkgName, int returnCode)throws RemoteException {// TODO Auto-generated method stub// Message msg = handler.obtainMessage(UNINSTALL_COMPLETE);/*----------------------------------------------------------*//* i am suspicion this send or not ?----???? *//*----------------------------------------------------------*/Log.i(TAG, "uninstall return code = " + returnCode);if (returnCode == 1) {Message msg = mhander.obtainMessage();msg.what = Operation.UNINSTALL_COMPLETEED;mhander.sendMessage(msg);}}}

2,在适当的时候调用它们:

MyPackageInstallObserver observer = new MyPackageInstallObserver();pm.installPackage(uri, observer, installFlags,installerPackageName);

MyPackageDeleteObserver observer = new MyPackageDeleteObserver();pManager.deletePackage(pkgName, observer, 0);

3,附上全部代码

public class AddOrDeletePkg {private String TAG = "Install";private Context context = null;private PopupWindow popupWindow = null;private static final int HAVE_INSTALLED = 0x1;TextView noticeTextView = null;ProgressBar progressBar = null;Button installButton = null;Button cancelButton = null;Button openButton = null;Button uninstallButton = null;boolean isinstall_non_market = false; // 非android市场的应用----未测试非android市场的应用;boolean isinstalled = false;String installedPKG_Name = "";LinearLayout layout = null;private String absoluteApkPath = null;private void installApk() {Message msg = mhander.obtainMessage();msg.what = Operation.INSTALL_APK;mhander.sendMessage(msg);new Thread(apkInstallRunnable).start();}//因为我写的是安装u盘的应用,所以absoluteApkPath为应用的绝对路径public AddOrDeletePkg(Context context, String absoluteApkPath) {this.context = context;this.absoluteApkPath = absoluteApkPath;View mview = View.inflate(context, R.layout.apk_handle, null);popupWindow = new PopupWindow(mview, LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);// 这里应该检查文件吧---------------------thinking???popupWindow.setOutsideTouchable(true);popupWindow.setFocusable(true);findViews();init();View parent = View.inflate(context, R.layout.main, null);popupWindow.showAtLocation(parent, Gravity.CENTER, 0, 0);}// return true is allow nonMarket app to installprivate boolean checkNonMarketAllowed() {return android.provider.Settings.Global.getInt(context.getContentResolver(),android.provider.Settings.Global.INSTALL_NON_MARKET_APPS, 0) > 0;}private void findViews() {View view = popupWindow.getContentView();noticeTextView = (TextView) view.findViewById(R.id.notice_textview);progressBar = (ProgressBar) view.findViewById(R.id.installing_progressBar);installButton = (Button) view.findViewById(R.id.install_button);cancelButton = (Button) view.findViewById(R.id.cancel_button);openButton = (Button) view.findViewById(R.id.open_button);uninstallButton = (Button) view.findViewById(R.id.uninstall_button);layout = (LinearLayout) view.findViewById(R.id.button_linearlayout);}protected void init() {isinstall_non_market = checkNonMarketAllowed();installedPKG_Name = getInstalledPkgName(absoluteApkPath);if (installedPKG_Name == null || installedPKG_Name.isEmpty()|| installedPKG_Name.length() == 0) {isinstalled = false;} else {isinstalled = true;}if (isinstall_non_market) {if (isinstalled) {Message msg = Message.obtain();msg.what = Operation.INSTALL_ALREADLY;mhander.sendMessage(msg);}} else {noticeTextView.setText("禁止安装不是应用市场的应用 !");cancelButton.requestFocus();}setClickListener();}private void setClickListener() {installButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif (isinstall_non_market) {installApk();} else {// 这里设置系统的允许安装非android市场的程序;Intent intent = new Intent("android.settings.APPLICATION_SETTINGS");context.startActivity(intent);}}});cancelButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubpopupWindow.dismiss();}});openButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif (isinstalled) {openapk(installedPKG_Name);}}});uninstallButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub// 这里应该做一些操作来转换pkgName// there need do some thing-------------?if (isinstalled) {uninstallApk(installedPKG_Name);}}});}Runnable apkInstallRunnable = new Runnable() {public void run() {String installerPackageName = null;int connt = 1;while (true) {// String[] command = { "chmod", "777", apk.getPath() + "/"// + fileName };String[] command = { "chmod", "-R", "777", absoluteApkPath };ProcessBuilder builder = new ProcessBuilder(command);try {builder.start();Log.i("Download", "process builder start success");break;} catch (IOException e) {connt = connt + 1;if (connt >= 10) {break;} else {Log.e("Download", "process builder start exception");Log.e(TAG, e.toString());}}}Uri uri = Uri.fromFile(new File(absoluteApkPath));// Log.i(TAG, "jscese 1..."+item.getPath());int installFlags = 0;PackageManager pm = context.getPackageManager();PackageInfo info = pm.getPackageArchiveInfo(absoluteApkPath,PackageManager.GET_ACTIVITIES);if (info != null) {installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;installerPackageName = info.packageName;MyPackageInstallObserver observer = new MyPackageInstallObserver();pm.installPackage(uri, observer, installFlags,installerPackageName);System.out.println("uri == " + uri);/* test install location flags */} else {Log.d(TAG, "info is null");Message msg = mhander.obtainMessage();msg.what = Operation.INSTALL_APK_FAIL;mhander.sendMessage(msg);}}};private Handler mhander = new Handler() {// 这里应该操作整个安装过程的UI显示变化----------------public void handleMessage(Message msg) {if (msg.what == Operation.INSTALL_APK) {layout.setVisibility(View.GONE);progressBar.setVisibility(View.VISIBLE);noticeTextView.setText("正在安装...");} else if (msg.what == Operation.INSTALL_ALREADLY) {layout.setVisibility(View.VISIBLE);progressBar.setVisibility(View.GONE);installButton.setText("重装");noticeTextView.setText("已安装!");openButton.requestFocus();} else if (msg.what == Operation.INSTALL_APK_FAIL) {progressBar.setVisibility(View.GONE);layout.setVisibility(View.VISIBLE);noticeTextView.setText("安装失败!");cancelButton.requestFocus();} else if (msg.what == Operation.INSTALL_COMPLETEED) {isinstalled = true;progressBar.setVisibility(View.GONE);layout.setVisibility(View.VISIBLE);// setAllButtonClickable(true);noticeTextView.setText("安装成功!");openButton.requestFocus();} else if (msg.what == Operation.UNINSTALL_APK) {layout.setVisibility(View.GONE);progressBar.setVisibility(View.VISIBLE);noticeTextView.setText("正在卸载...");} else if (msg.what == Operation.UNINSTALL_APK_FAIL) {layout.setVisibility(View.VISIBLE);progressBar.setVisibility(View.GONE);noticeTextView.setText("卸载失败!");} else if (msg.what == Operation.UNINSTALL_COMPLETEED) {layout.setVisibility(View.VISIBLE);progressBar.setVisibility(View.GONE);noticeTextView.setText("卸载成功!");}};};private void setAllButtonClickable(boolean isClickabla) {installButton.setClickable(isClickabla);cancelButton.setClickable(isClickabla);openButton.setClickable(isClickabla);uninstallButton.setClickable(isClickabla);}private void openapk(String pkgName) {Intent mintent = context.getPackageManager().getLaunchIntentForPackage(pkgName);context.startActivity(mintent);}private void uninstallApk(String pkgName) {ApplicationInfo applicationInfo = null;PackageManager pManager = null;boolean isFail = false;Message msg = mhander.obtainMessage();msg.what = Operation.UNINSTALL_APK;mhander.sendMessage(msg);pManager = context.getPackageManager();try {applicationInfo = context.getPackageManager().getApplicationInfo(pkgName, HAVE_INSTALLED);if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0) {isFail = true;}} catch (NameNotFoundException e) {// TODO Auto-generated catch block// e.printStackTrace();isFail = true;}if (isFail) {Message msg1 = mhander.obtainMessage();msg1.what = Operation.UNINSTALL_APK_FAIL;mhander.sendMessage(msg1);} else {try {MyPackageDeleteObserver observer = new MyPackageDeleteObserver();pManager.deletePackage(pkgName, observer, 0);} catch (Exception e) {// TODO: handle exception}}}// 这里需要修改接口-------------------??private String getInstalledPkgName(String absoluteApkPath) {String installedPackagename = "";// if (item.getType() == Constants.FileType.FILE_TYPE_APK) {PackageManager pm = context.getPackageManager();PackageInfo info = pm.getPackageArchiveInfo(absoluteApkPath,PackageManager.GET_ACTIVITIES);String ipackgname = info.packageName;List<PackageInfo> appPackage = pm.getInstalledPackages(0);/** * get package information of all applications for system installation */for (int i = 0; i < appPackage.size(); i++) {PackageInfo temp = appPackage.get(i);if (ipackgname.equals(temp.packageName)) {installedPackagename = ipackgname;}}// }return installedPackagename;}class MyPackageInstallObserver extends IPackageInstallObserver.Stub {@Overridepublic void packageInstalled(String packageName, int returnCode)throws RemoteException {// TODO Auto-generated method stubLog.i(TAG, "install return code = " + returnCode);if (returnCode == 1) {// installedPackagename = packageName;Message msg = mhander.obtainMessage();msg.what = Operation.INSTALL_COMPLETEED;mhander.sendMessage(msg);installedPKG_Name = packageName;} else {Message msg = mhander.obtainMessage();msg.what = Operation.INSTALL_APK_FAIL;mhander.sendMessage(msg);}}}class MyPackageDeleteObserver extends IPackageDeleteObserver.Stub {@Overridepublic void packageDeleted(String PkgName, int returnCode)throws RemoteException {// TODO Auto-generated method stub// Message msg = handler.obtainMessage(UNINSTALL_COMPLETE);/*----------------------------------------------------------*//* i am suspicion this send or not ?----???? *//*----------------------------------------------------------*/Log.i(TAG, "uninstall return code = " + returnCode);if (returnCode == 1) {Message msg = mhander.obtainMessage();msg.what = Operation.UNINSTALL_COMPLETEED;mhander.sendMessage(msg);}}}static final class Operation {public static final int INSTALL_APK = 0x3;public static final int INSTALL_APK_FAIL = 0x04;public static final int INSTALL_ALREADLY = 0x05;public static final int INSTALL_COMPLETEED = 0x06;public static final int UNINSTALL_COMPLETEED = 0x07;public static final int UNINSTALL_APK_FAIL = 0x08;public static final int UNINSTALL_APK = 0x09;};}

4,忘了说一点,这个需要系统权限,android:sharedUserId="android.uid.system"需要jar签名或则源码mmm编译;

还要添加应用权限install_package或delete_package




0 0
原创粉丝点击