API 21 级以下有没有办法使用 PackageInstaller?

Is there any way to use PackageInstaller below API level 21?

我的应用程序 minSdkVersion 是 19,应用程序使用以下代码安装第 3 方应用程序,

Intent intent = Intent(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(android.net.Uri.fromFile(new java.io.File(APK_PATH)),
                        "application/vnd.android.package-archive");
intent.setFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK);

我在清单文件中添加了权限,

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

以上代码在 android 版本 9 之前运行良好,但在 Android 版本 9 中无法运行,也没有找到日志。我已经阅读了一些文档,ACTION_VIEW 或 ACTION_INSTALL_PACKAGE 在 Android 10 上已弃用。PackageInstaller 是用于安装 3rd 的新 API派对应用程序,但 PackageInstaller 添加到 API 级别 21。

API 21 级以下有没有办法使用 PackageInstaller?如何在 Android 10 中安装第 3 方应用程序??

为了集成两个 API,您可以使用简单的 if 语句来决定您应该使用哪个 API。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.L) {
    // use PackageInstaller. No errors, no exceptions 
} else {
    Intent intent = Intent(android.content.Intent.ACTION_VIEW);
    intent.setDataAndType(android.net.Uri.fromFile(new java.io.File(APK_PATH)),
                        "application/vnd.android.package-archive");
    intent.setFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK);
}

Build.VERSION.SDK_INT是您的应用在运行.

设备上使用的SDK号

Build.VERSION_CODES.L为常数值:

/**
 * Temporary until we completely switch to {@link #LOLLIPOP}.
 * @hide
 */
public static final int L = 21;

这是官方处理SDK差异的方式。 Here is an example 来自 Android 文档。在该页面上搜索 >= Build.VERSION_CODES