You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android NDK中std::ifstream读取.obj格式文件失败问题求助

问题根因

你遇到的是Android高版本公共存储权限限制问题:当targetSdkVersion >= 30时,requestLegacyExternalStorage配置已经失效,READ_EXTERNAL_STORAGE权限仅允许读取公共目录下的媒体类文件(图片、音频、视频),.png属于图片类白名单格式所以可以正常读取,而.obj、.txt属于非媒体类文件,自然无法通过该权限读取,这就是同目录下不同后缀读取结果不一致的核心原因。

可行解决方案

  • 方案1:申请所有文件访问权限(适合需要读取用户任意目录文件的工具类应用)
    1. 在AndroidManifest.xml中新增权限声明
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
    
    1. 运行时主动跳转系统权限设置页,引导用户开启「允许访问所有文件」权限,授权后即可正常读取任意后缀的公共目录文件。
  • 方案2:将模型文件放到应用专属目录(推荐,无需额外权限)
    公共目录读取限制仅针对共享存储,应用专属目录不受影响:通过Java层调用context.getExternalFilesDir(null)拿到专属目录路径,传递到NDK层拼接文件路径,将你的.obj文件放到对应目录下即可直接读取,无需申请任何存储权限。
  • 方案3:将固定模型打包到assets目录(适合不需要用户手动导入的内置资源)
    把.obj文件放到工程的src/main/assets目录下,NDK层通过AAssetManager接口直接读取assets内的二进制资源,全程不需要申请存储权限。

补充排查建议

如果你的targetSdkVersion <=29依然出现该问题,可以调用系统媒体扫描器扫描你存放文件的目录,让系统将非媒体文件录入媒体库后即可正常读取,Java层触发扫描代码如下:

sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(new File("/storage/emulated/0/VulkanResource/texture/"))));

另外你可以在打开文件失败时打印strerror(errno)查看具体错误码,区分是权限拒绝还是文件路径错误,能更快定位问题。


内容的提问来源于stack exchange,提问作者dreakzts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 00:54:03