如何在Codename One中访问其他应用目录下的外部文件
Codename One跨应用访问存储资源问题解答
Codename One 支持访问其他应用存储在设备公共区域的图片、音频等各类文件资源,你当前仅能访问.cn1格式文件,是因为默认调用了应用私有沙盒目录的访问逻辑,并非框架本身存在能力限制。
具体实现方式
- 先配置对应平台的访问权限:Android端根据目标系统版本申请对应权限,Android 12及以下申请
READ_EXTERNAL_STORAGE权限,Android 13及以上申请READ_MEDIA_AUDIO、READ_MEDIA_IMAGES权限;iOS端需要在构建配置中填写媒体库、相册访问的用途描述,否则系统会直接拦截文件访问请求。 - 不要直接使用应用私有目录路径,调用
FileSystemStorage.getInstance().getRoots()枚举设备所有可用存储根路径,公共存储根路径的标识通常包含public、shared字段,对应设备的公共存储区域,WhatsApp的音频文件默认存放在公共存储下的WhatsApp/Media/WhatsApp Audio/路径下,拿到公共根路径后拼接目标文件路径即可访问。 - 拿到音频文件的合法路径后,直接调用
MediaManager的音频加载接口即可播放,框架会自动调用系统原生媒体解码器,支持市面上绝大多数常见音频格式,不需要做额外的格式转换。
高版本系统兼容性注意事项
Android 11及以上版本启用了分区存储机制,如果应用的targetSdkVersion设置为30及以上,直接遍历公共目录的访问方式会被系统拦截。这种场景下推荐使用
FileChooser组件调用系统原生文件选择器,引导用户手动选中WhatsApp目录下的目标音频文件,拿到系统授权后的文件URI即可正常读取播放,这种方案不需要申请全量存储权限,系统兼容性更好,也更符合各平台的隐私规范。
内容的提问来源于stack exchange,提问作者Alejandro Fernandez
相关产品推荐
相关产品推荐

