install / uninstall APKs programmatically (PackageManager vs Intents)

后端 未结 10 2114
时光取名叫无心
时光取名叫无心 2020-11-22 13:53

My application installs other applications, and it needs to keep track of what applications it has installed. Of course, this could be achieved by simply keeping a list of i

10条回答
  •  日久生厌
    2020-11-22 14:35

    If you have Device Owner (or profile owner, I haven't tried) permission you can silently install/uninstall packages using device owner API.

    for uninstalling:

    public boolean uninstallPackage(Context context, String packageName) {
        ComponentName name = new ComponentName(MyAppName, MyDeviceAdminReceiver.class.getCanonicalName());
        PackageManager packageManger = context.getPackageManager();
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            PackageInstaller packageInstaller = packageManger.getPackageInstaller();
            PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
                    PackageInstaller.SessionParams.MODE_FULL_INSTALL);
            params.setAppPackageName(packageName);
            int sessionId = 0;
            try {
                sessionId = packageInstaller.createSession(params);
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
            packageInstaller.uninstall(packageName, PendingIntent.getBroadcast(context, sessionId,
                    new Intent("android.intent.action.MAIN"), 0).getIntentSender());
            return true;
        }
        System.err.println("old sdk");
        return false;
    }
    

    and to install package:

    public boolean installPackage(Context context,
                                         String packageName, String packagePath) {
        ComponentName name = new ComponentName(MyAppName, MyDeviceAdminReceiver.class.getCanonicalName());
        PackageManager packageManger = context.getPackageManager();
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            PackageInstaller packageInstaller = packageManger.getPackageInstaller();
            PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
                    PackageInstaller.SessionParams.MODE_FULL_INSTALL);
            params.setAppPackageName(packageName);
            try {
                int sessionId = packageInstaller.createSession(params);
                PackageInstaller.Session session = packageInstaller.openSession(sessionId);
                OutputStream out = session.openWrite(packageName + ".apk", 0, -1);
                readTo(packagePath, out); //read the apk content and write it to out
                session.fsync(out);
                out.close();
                System.out.println("installing...");
                session.commit(PendingIntent.getBroadcast(context, sessionId,
                        new Intent("android.intent.action.MAIN"), 0).getIntentSender());
                System.out.println("install request sent");
                return true;
            } catch (IOException e) {
                e.printStackTrace();
                return false;
            }
        }
        System.err.println("old sdk");
        return false;
    }
    

提交回复
热议问题