返回

如何在 Android 12 中以编程方式安装 APK?

java

Android 12 中以编程方式安装 APK

前言

在 Android 12 及更高版本中,安装 APK 变得更加困难,因为系统引入了新的限制以提高安全性。对于希望以编程方式在 Android 设备上安装 APK 的开发人员来说,这可能会带来一些挑战。

问题

当尝试在 Android 12 中使用 Java 代码安装 APK 时,开发人员可能会遇到以下错误:

"Permission to access file: /storage/emulated/0/xxxx.apk is denied"

解决方法

要解决此问题,请按照以下步骤操作:

  • 1. 声明必要的权限

确保在 AndroidManifest.xml 文件中声明以下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
  • 2. 设置文件提供程序

创建文件提供程序以授予应用程序访问外部存储中文件的权限。在 AndroidManifest.xml 文件中添加以下代码:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.provider"
    android:exported="false"
    android:permission="android.permission.MANAGE_DOCUMENTS"
android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/provider_paths"/>
</provider>
  • 3. 请求未知应用程序安装权限

在 Android 12 中,应用程序需要请求安装未知应用程序的权限。在 MainActivity 中添加以下代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    if (!getPackageManager().canRequestPackageInstalls()) {
        startActivityForResult(new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES)
                .setData(Uri.parse(String.format("package:%s", getPackageName()))), 1);
    }
}
  • 4. 检查文件路径

确保提供的 APK 文件路径正确。它应该是设备上的绝对路径。

  • 5. 使用文件提供程序安装 APK

使用 FileProvider 安装 APK,而不是直接使用文件的 URI。在 MainActivity 中添加以下代码:

Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", file);
} else {
    uri = Uri.fromFile(file);
}
Intent intent = new Intent(Intent.ACTION_INSTALL_PACKAGE, uri);
intent.setDataAndType(uri, "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(intent);

结论

通过遵循这些步骤,你应该能够在 Android 12 中以编程方式安装 APK。请记住,Android 12 对应用程序安装施加了新的限制,因此在实现此功能时至关重要的是遵循最佳实践。

常见问题解答

  • 我仍然无法安装 APK,怎么办?

检查文件路径是否正确,并确保已授予应用程序所有必需的权限。

  • 我尝试安装 APK 时收到 "INSTALL_FAILED_INVALID_URI" 错误,这是什么意思?

这通常表示提供的 APK 文件路径不正确或损坏。

  • 我收到 "INSTALL_FAILED_NO_MATCHING_ABIS" 错误,该怎么办?

这表示 APK 文件与设备的 CPU 架构不兼容。确保 APK 文件针对设备的 CPU 架构编译。

  • 我可以在 Android 12 中以编程方式卸载 APK 吗?

是的,你可以使用 PackageManager.uninstallPackage() 方法以编程方式卸载 APK。

  • 我可以在 Android 12 中以编程方式更新 APK 吗?

是的,你可以使用 PackageManager.installPackage() 方法以编程方式更新 APK。但是,你需要使用 REPLACE_EXISTING 标志来覆盖现有安装。