Android 静默安装和静默卸载(系统层)

来源:互联网 发布:王侯将相宁有种乎出自 编辑:程序博客网 时间:2024/06/10 23:29

在Android系统开发过程中,有第三方App开发需要静默安装和卸载。纯App必须需要root权限,还要通过反射(相关接口被隐藏了)去调用,有些麻烦。自己就写了个App(SilentInstaller),实现静默安装和卸载,调用代码简洁,无需任何权限。

下面贴下静默安装和卸载代码:

    private void silentInstall(String path) {        File apkFile = new File(path);        if (!apkFile.exists()) {            mH.sendMessage(mH.obtainMessage(HANDLER_SHOW_MESSAGE,                    String.format(getString(R.string.apk_file_not_exist), path)));            Log.e(TAG, "silentInstall " + path + " is not exists!");            return;        }        Uri uri = Uri.fromFile(new File(path));        String packageName;        int installFlags = 0;        PackageManager pm = getPackageManager();        PackageInfo info = pm.getPackageArchiveInfo(path,                PackageManager.GET_ACTIVITIES);        if (info != null) {            packageName = info.applicationInfo.packageName;            try {                PackageInfo packageInfo = pm.getPackageInfo(packageName,                        PackageManager.GET_UNINSTALLED_PACKAGES);                if (packageInfo != null) {                    installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;                }            } catch (NameNotFoundException e) {                Log.e(TAG,                        "silentInstall NameNotFoundException = "                                + e.getMessage());            }            mAutoStartPackageName = packageName;            pm.installPackage(uri, new PackageInstallObserver(), installFlags,                    packageName);        }        if (!mAppAutoStart) {            mH.sendEmptyMessageDelayed(HANDLER_KILL_SELF, 3000);        }    }

    private void silentDelete(String packageName) {        PackageManager pm = getPackageManager();        try {            PackageInfo packageInfo = pm.getPackageInfo(packageName,                    PackageManager.GET_UNINSTALLED_PACKAGES);            if (packageInfo == null) {                return;            }            String appName = packageInfo.applicationInfo.loadLabel(pm)                    .toString();            pm.deletePackage(packageName, new PackageDeleteObserver(appName), 0);        } catch (NameNotFoundException e) {            String text = String.format(getString(R.string.package_not_exist),                    packageName);            sendMessage(text);            Log.e(TAG, "silentRemove NameNotFoundException = " + e.getMessage());        }        mH.sendEmptyMessageDelayed(HANDLER_KILL_SELF, 3000);    }
就是调用PackageManager的installPackage和deletePackage


第三方Apk调用

安装:

        Intent intent = new Intent("android.intent.action.SILENT_PACKAGE_INSTALL");        intent.putExtra("silent_install_file", "/sdcard/Helloworld.apk");        intent.putExtra("silent_install_auto_start", true);//是否安装并启动        intent.putExtra("silent_install_start_clazz", "com.example.helloworld.MainActivity");//如果安装并启动,则需指定activityName        sendBroadcast(intent);
卸载:

        Intent intent = new Intent("android.intent.action.SILENT_PACKAGE_DELETE");        intent.putExtra("silent_delete_package", "com.example.helloworld");//指定需要卸载apk的包名        sendBroadcast(intent);

是不是很方便?但系统需要内置SilentInstaller。


SilentInstaller点击下载


原创粉丝点击