Unreal Engine 5在SDK 33下存储权限异常致存档失效求助
解决Unreal Engine 5在Android 12(API33)下存档失效及权限请求未触发的设置调整
针对Android 12(API33)的存储权限机制变更,结合UE5的适配逻辑,你需要从以下几个维度调整设置:
1. 修正AndroidManifest权限声明
API33开始废弃了原有的READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE权限,拆分出针对媒体文件的细分权限。你需要在项目的AndroidManifest模板中添加适配代码:
<!-- Android 12+ 媒体权限(根据你存档涉及的文件类型选择添加) --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <!-- 兼容Android 11及以下版本的存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
如果你的项目仍需兼容旧版本Android,可以在<application>标签中保留android:requestLegacyExternalStorage="true",但该属性在API33及以上会被系统忽略。
2. 配置UE5项目的Android权限与SDK版本
- 打开项目设置 > Platforms > Android > Advanced APK Packaging,在Additional Permissions列表中:
- 勾选对应媒体权限(
READ_MEDIA_IMAGES等,根据存档内容选择) - 勾选
READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE,并分别设置Max SDK Version为32
- 勾选对应媒体权限(
- 进入项目设置 > Platforms > Android > Application Settings,确认:
Target SDK Version设置为33Compile SDK Version匹配API33Minimum SDK Version根据你的用户群体调整,建议不低于24
3. 适配存档路径至Android 12存储规则
Android12+严格限制了公共外部存储的直接读写,优先改用UE5提供的应用私有存储路径,这类路径无需申请权限,且稳定性更高:
- 使用
FPaths::ProjectSavedDir():对应应用内部的存档目录 - 使用
FPaths::GetPersistentDownloadDir():对应应用私有持久化目录
如果必须使用公共存储,需改用Android的MediaStoreAPI进行文件操作,但UE5原生存档功能不支持该API,需自行扩展实现。
4. 主动触发权限请求逻辑
UE5默认不会自动请求API33新增的媒体权限,需在存档功能触发前主动检查并申请:
- 用
UGameplayStatics::HasPermission()检查权限状态 - 无权限时调用
UGameplayStatics::RequestPermissions()发起请求,示例代码:
#include "Kismet/GameplayStatics.h" void USaveGameHandler::CheckAndRequestPermission() { const FString TargetPermission = "android.permission.READ_MEDIA_IMAGES"; // 按需替换为对应权限 if (!UGameplayStatics::HasPermission(GetWorld(), TargetPermission)) { UGameplayStatics::RequestPermissions( GetWorld(), {TargetPermission}, FOnPermissionsGrantedDelegate::CreateUObject(this, &USaveGameHandler::OnPermissionResult) ); } else { ExecuteSaveLogic(); } } void USaveGameHandler::OnPermissionResult(const TArray<FString>& Permissions, const TArray<bool>& Granted) { for (int32 i = 0; i < Permissions.Num(); ++i) { if (Permissions[i] == "android.permission.READ_MEDIA_IMAGES" && Granted[i]) { ExecuteSaveLogic(); return; } } // 权限被拒绝,提示用户开启权限 ShowPermissionDeniedPrompt(); }
5. 升级UE5引擎版本
确保使用UE5.1及以上的稳定版本,早期UE5版本对API33的适配存在缺陷,升级引擎可修复底层权限处理、路径适配等问题。
内容的提问来源于stack exchange,提问作者Arnab Maiti
相关产品推荐
相关产品推荐

