• android 实现静默安装、卸载


    方法1:【使用调用接口方法,由于安装卸载应用程序的部分API是隐藏的,所以必须下载Android系统源码,在源码下开发并编译之后使用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);          
            }   
        }
     
    }
     
    安装、卸载相关权限<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权限或者和rom拥有一样的签名,即让该apk以System的身份在系统中运行】
     
     private void test() {
       execCommand("system/bin/pm install -r " + "sdcard/xxx.apk"); // xxx.apk放置在内置储存的根目录下(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包等方式

  • 相关阅读:
    bzoj1093【ZJOI2007】最大半联通子图
    bzoj3609【HEOI2014】人人尽说江南好
    Codeforces Round #381 Div.2
    bzoj3405:[Usaco2009 Open]Grazing2 移动牛棚
    bzoj3389:[Usaco2004 Dec]Cleaning Shifts安排值班
    bzoj3315:[Usaco2013 Nov]Pogo-Cow
    bzoj1018:[SHOI2008]堵塞的交通traffic
    bzoj4637:期望
    二次剩余
    Very Long Suffix Array
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/4150121.html
Copyright © 2020-2023  润新知