How to install/update/remove APK using “PackageInstaller” class in Android L?

前端 未结 7 2242
长发绾君心
长发绾君心 2020-11-30 23:22

Plz check below classe & give me the suggestion for how to use them https://developer.android.com/reference/android/content/pm/PackageInstaller.html https://developer.an

7条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-30 23:37

    It is possible without System permissions from Android M onwards.

    if ((mPm.checkUidPermission(android.Manifest.permission.INSTALL_PACKAGES, installerUid)
            == PackageManager.PERMISSION_GRANTED)
            || (installerUid == Process.ROOT_UID)
            || mIsInstallerDeviceOwner) {
        mPermissionsAccepted = true;
    } else {
        mPermissionsAccepted = false;
    }
    

    Silent install and uninstall of apps by Device Owner:

    A Device Owner can now silently install and uninstall applications using the PackageInstaller APIs, independent of Google Play for Work.

    More in this link.


    This is possible from Android 6.0 and up.

    • Make your app the Device owner.

    Once your app gets the Device owner permission, we can install, uninstall and update silently without any user intervention.

    public static boolean installPackage(Context context, InputStream in, String packageName)
            throws IOException {
        PackageInstaller packageInstaller = context.getPackageManager().getPackageInstaller();
        PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(
                PackageInstaller.SessionParams.MODE_FULL_INSTALL);
        params.setAppPackageName(packageName);
        // set params
        int sessionId = packageInstaller.createSession(params);
        PackageInstaller.Session session = packageInstaller.openSession(sessionId);
        OutputStream out = session.openWrite("COSU", 0, -1);
        byte[] buffer = new byte[65536];
        int c;
        while ((c = in.read(buffer)) != -1) {
            out.write(buffer, 0, c);
        }
        session.fsync(out);
        in.close();
        out.close();
    
        session.commit(createIntentSender(context, sessionId));
        return true;
    }
    
    
    
    private static IntentSender createIntentSender(Context context, int sessionId) {
            PendingIntent pendingIntent = PendingIntent.getBroadcast(
                    context,
                    sessionId,
                    new Intent(ACTION_INSTALL_COMPLETE),
                    0);
            return pendingIntent.getIntentSender();
        }
    

    Uninstall:

    String appPackage = "com.your.app.package";
    Intent intent = new Intent(getActivity(), getActivity().getClass());
    PendingIntent sender = PendingIntent.getActivity(getActivity(), 0, intent, 0);
    PackageInstaller mPackageInstaller = getActivity().getPackageManager().getPackageInstaller();
    mPackageInstaller.uninstall(appPackage, sender.getIntentSender());
    

    Git repo here.

提交回复
热议问题