升级Harman AIR50后Android端无法保存文件问题求助
问题分析与解决方案
核心问题
- 路径硬编码错误:你用
File.documentsDirectory又拼接/mnt/sdcard/...是完全错误的写法——documentsDirectory本身已经指向对应平台的标准文档目录,硬编码绝对路径会在Android 10+的Scoped Storage机制下触发访问失败,且不同设备的外部存储路径并不统一(比如部分设备是/storage/emulated/0而非/mnt/sdcard)。 - 权限适配问题:Harman AIR50适配了Android 10+的存储政策,
WRITE_EXTERNAL_STORAGE在Android 10及以上版本已被限制;MANAGE_EXTERNAL_STORAGE属于高风险权限,需要用户手动在系统设置中开启,且Google Play对该权限的审核极为严格,非文件管理类应用不建议使用。
修复步骤
1. 修正文件路径
放弃硬编码绝对路径,改用AIR提供的标准目录API:
- 如果要存到应用私有外部存储(无需额外权限,卸载应用时自动删除):
// 对应Android路径:/Android/data/[你的应用包名]/files/ var myFile:File = File.applicationStorageDirectory.resolvePath("Tfzf Helfer/activation.tfzfhelfer");
- 如果要存到公共外部存储的文档目录(需适配Scoped Storage):
// 对应Android路径:/storage/emulated/0/Documents/ var myFile:File = File.documentsDirectory.resolvePath("Tfzf Helfer/activation.tfzfhelfer");
2. 调整权限配置
移除冗余权限,修改AndroidManifest.xml中的权限声明:
<!-- 仅为Android 9及以下版本保留WRITE权限,Android 10+无需 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <!-- 除非你的应用是文件管理器类应用,否则删除以下权限 --> <!-- <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/> -->
3. 运行时权限处理(访问公共目录时需做)
若必须访问公共外部存储,需在运行时主动请求权限:
import flash.system.Capabilities; import flash.system.Security; // 检查Android版本并请求对应权限 if (Capabilities.androidVersion >= "10.0") { if (!Security.hasPermission("android.permission.MANAGE_EXTERNAL_STORAGE")) { Security.requestPermission("android.permission.MANAGE_EXTERNAL_STORAGE", onPermissionResult); } else { saveFile(); } } else { if (!Security.hasPermission("android.permission.WRITE_EXTERNAL_STORAGE")) { Security.requestPermission("android.permission.WRITE_EXTERNAL_STORAGE", onPermissionResult); } else { saveFile(); } } // 权限回调处理 function onPermissionResult(granted:Boolean, permission:String):void { if (granted) { saveFile(); } else { trace("权限被拒绝,无法保存文件"); } } // 统一文件写入逻辑 function saveFile():void { var myFile:File = File.documentsDirectory.resolvePath("Tfzf Helfer/activation.tfzfhelfer"); // 确保父目录存在,避免写入失败 if (!myFile.parent.exists) { myFile.parent.createDirectory(); } var fs:FileStream = new FileStream(); fs.open(myFile, FileMode.WRITE); fs.writeUTFBytes(dateiname); fs.close(); }
关键提示
- 优先使用应用私有存储,无需权限且符合Android存储规范,不会受Scoped Storage限制。
- 非必要不要使用
MANAGE_EXTERNAL_STORAGE,Google Play会拒绝非文件管理类应用的该权限申请。 - 写入文件前务必检查父目录是否存在,调用
createDirectory()避免因目录缺失导致写入失败。
内容的提问来源于stack exchange,提问作者Dunraven
相关产品推荐
相关产品推荐

