如何在自己的App中调用Android系统自带的安装/卸载程序

AppUtils里面写了如何安装和卸载apk(这段代码出自这里:点击打开链接~),这里的安装和卸载调用的是Android本身的一个安装卸载,所以可能页面不会太优雅,并不符合商业App的期望,如果要做到更优雅的实现,就要用到静默安装/卸载,这个可以参照网上教程,我这里有一篇转载还是很不错的,大家可以参照一下:Android中实现静态的默认安装和卸载应用~

public class AppUtils {

    /* 安装apk */
    public void installApk(Context context, String fileName) {
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_VIEW);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setDataAndType(Uri.parse("file://" + fileName), "application/vnd.android.package-archive");
        context.startActivity(intent);
    }

    /* 卸载apk */
    public void uninstallApk(Context context, String packageName) {
//        Uri uri = Uri.parse("package:" + packageName);
        Uri uri = Uri.fromParts("package", packageName, null);
        Intent intent = new Intent(Intent.ACTION_DELETE, uri);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);//一开始这句话是没有的,运行的时候就报了这个错误“ android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? ”,百度之后,得知,从一个Activity中要通过intent调出另一个Activity的话需要加上这个flag,所以各位切记,这句话不能漏
        context.startActivity(intent);
    }
}

在MainActivity中是这样使用的,在这里,我以安装企鹅为例,先把企鹅的apk放到了我自定义好的一个文件夹中:

public class MainActivity extends Activity {
    AppUtils appUtils = new AppUtils();
    String fileName = "";
    String packageName = "";
 
    Button btnCopyTp;
    @BindView(R.id.btn_xz)
    Button btnXz;
    @BindView(R.id.btn_az)
    Button btnAz;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);

    }

    @OnClick({R.id.btn_xz, R.id.btn_az)
    public void onClick(View view) {
        switch (view.getId()) {  
            case R.id.btn_xz://卸载程序

                String archiveFilePath = Environment.getExternalStorageDirectory() + "/MyFiles/Download/QQ_482.apk";//安装包路径
                PackageManager pm = getPackageManager();
                PackageInfo info = pm.getPackageArchiveInfo(archiveFilePath, PackageManager.GET_ACTIVITIES);
                if (info != null) {
                    ApplicationInfo appInfo = info.applicationInfo;
                    packageName = appInfo.packageName;  //得到安装包名称 
                    xz(context, packageName);
                }
                break;
            case R.id.btn_az://安装程序
                fileName = Environment.getExternalStorageDirectory() + "/MyFiles/Download/QQ_482.apk"; 
                File file = new File(fileName);
                if (file.exists()) {
                    az(context, fileName); 
                }

                break;
        }
    }

    public void az(Context context, String fileName) {
        appUtils.installApk(context, fileName);
    }

    public void xz(Context context, String packageName) {
        appUtils.uninstallApk(context, packageName);
    } 
}

布局文件:

 


 

    

 

 

 

你可能感兴趣的:([,Android与Java,])