返回

在 Android 7+ 上使用 Unity 调用 APK 安装的全面指南

前端

简介

在 Unity 游戏项目中,自动下载和安装 APK 是进行重大版本更新的常见做法。然而,在 Android 7+ 设备上,这一过程可能会遇到障碍,导致 APK 无法安装。本文将深入探讨这种限制的原因,并提供分步指南,帮助您克服这些障碍,确保 APK 安装的顺利进行。

文件 URI 限制

在 Android 7+ 中,引入了存储访问框架 (SAF),它限制了应用程序访问外部存储的权限。SAF 旨在提高用户隐私和安全,它禁止应用程序直接访问文件 URI。因此,在 Android 7+ 上,您不能再使用传统的 File.Open() 方法来打开 APK 文件。

权限要求

要成功安装 APK,您的 Unity 项目需要以下权限:

  • WRITE_EXTERNAL_STORAGE:允许应用程序写入外部存储。
  • INSTALL_PACKAGES:允许应用程序安装 APK 包。

解决方法:使用 FileProvider

为了克服这些限制,Unity 提供了一个名为 FileProvider 的解决方案。FileProvider 是一个内容提供程序,它允许应用程序与其他应用程序安全地共享文件。使用 FileProvider,您可以将 APK 文件的 URI 转换为可用于安装的受保护 URI。

步骤指南

1. 在 Unity 中设置 FileProvider

  • 在 Unity 项目的 Assets/Plugins/Android 文件夹中创建 AndroidManifest.xml 文件。
  • AndroidManifest.xml 文件中,添加以下代码:
<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="${applicationId}.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/filepaths"/>
</provider>
  • 替换 ${applicationId} 为您的应用程序的包名称。

2. 创建文件路径资源

  • Assets/Plugins/Android 文件夹中创建 filepaths.xml 文件。
  • filepaths.xml 文件中,添加以下代码:
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external" path="."/>
</paths>

3. 请求权限

  • 在 Unity 代码中,请求 WRITE_EXTERNAL_STORAGEINSTALL_PACKAGES 权限:
Permission.RequestUserPermission(Permission.ExternalStorageWrite);
Permission.RequestUserPermission(Permission.InstallPackages);

4. 获取受保护的 URI

  • 一旦您有了权限,您可以使用 FileProvider 获取 APK 文件的受保护 URI:
AndroidJavaObject fileProvider = new AndroidJavaObject("android.support.v4.content.FileProvider");
string authority = fileProvider.CallStatic<string>("getAuthority", context.packageName);
Uri apkUri = FileProvider.GetUriForFile(context, authority, apkFile);

5. 安装 APK

  • 现在您可以使用 PackageManager 安装 APK:
Intent installIntent = new Intent(Intent.ActionInstallPackage);
installIntent.SetData(apkUri);
startActivity(installIntent);

注意事项

  • 确保您已正确配置 FileProvider 和文件路径资源。
  • 您的 APK 文件必须位于外部存储中。
  • 用户必须授予 WRITE_EXTERNAL_STORAGEINSTALL_PACKAGES 权限,才能成功安装 APK。

结论

遵循本文中的步骤,您可以克服 Android 7+ 设备上的文件 URI 限制,并在 Unity 游戏中成功调用 APK 安装。通过了解安全性考虑因素和使用 FileProvider,您可以确保您的用户能够顺利升级您的应用程序,同时保持其设备的安全。