android - 如何在 Android L 中使用 "PackageInstaller"类安装/更新/删除 APK?

标签 android installation android-5.0-lollipop android-install-apk installation-path

请检查下面的类并给我有关如何使用它们的建议 https://developer.android.com/reference/android/content/pm/PackageInstaller.html https://developer.android.com/reference/android/content/pm/PackageInstaller.Session.html

所以请给我一个安装/更新/删除应用程序的示例。 新应用程序是否有可能安装在设备配置文件所有者中?

最佳答案

没有来自 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;
}

设备所有者静默安装和卸载应用程序:

设备所有者现在可以使用 PackageInstaller API 静默安装和卸载应用程序,独立于 Google Play for Work。

More in this link.


这可以从 Android 6.0 及更高版本开始。

  • 让您的应用成为设备所有者。

一旦您的应用获得设备所有者权限,我们就可以静默安装、卸载和更新,无需任何用户干预。

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();
    }

卸载:

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 .

关于android - 如何在 Android L 中使用 "PackageInstaller"类安装/更新/删除 APK?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26884956/

相关文章:

eclipse - 安装适用于Eclipse的Apache Maven插件

android - Lollipop 上完全透明的状态栏和导航栏

android - 无法从 Android 5.0.2 中的 ACTION_OPEN_DOCUMENT Intent 获取音频文件扩展名

android - 我需要最低 sdk 21 的 AppCompatActivity 和 v7 支持库吗?

java - ColorBlobDetector 无法乘以轮廓

installation - WIX 使用 x86 安装程序安装 x64 组件?

python - 如何删除 Python 工具的 Visual Studio(2016 年 6 月)更新通知?已经安装好了

android - Firebase - 缺少 Api key

android - Proguard with orrmlite - 参数化集合

android - 如何在布局中制作半圆(弧) View