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

Android 11 应用读取私有存储下example.json文件失败如何解决?

问题产生原因

  • 路径不匹配:你手动传输文件的包名路径和当前运行测试应用的实际包名不匹配。测试构建版本通常会自动添加.debug之类的包名后缀,如果你传输的路径是nl.xyz.myapp对应的目录,而实际运行的应用包名是nl.xyz.myapp.debug,那么getFilesDir()返回的就是后缀版本的目录,自然找不到你传输的文件。你看到的.Fabric文件是Fabric/Crashlytics 崩溃统计 SDK 自动生成的缓存文件,属于当前运行应用目录下的自动生成文件,也能证明你当前代码访问的目录和你传文件的目录不是同一个。
  • Android版本权限限制:Android 11及以上版本禁止通过MTP(手机连电脑的文件传输模式)直接访问/Android/data下的应用私有目录,你在电脑端看到的目录可能是缓存的虚拟路径,实际文件并没有成功写入到应用真实私有目录中。
  • 读取代码逻辑问题:如果没有提前判断文件是否存在、是否是有效文件就直接读取,也会出现返回空字符串的情况。

适配调整方案

  1. 确认当前应用的真实私有目录路径
    运行如下代码打印实际路径,和你传输文件的路径做对比:
Log.d("App私有目录", getFilesDir().getAbsolutePath());

如果路径不匹配,后续直接将文件放到打印出的对应路径下即可。

  1. 使用adb命令传输文件
    不要用MTP传输私有目录文件,改用adb push命令,不受Android版本权限限制,示例命令如下:
adb push 本地/example.json /sdcard/Android/data/[你的应用实际包名]/files/example.json
  1. 完善文件读取逻辑
    读取前增加合法性判断,避免空读:
File file = new File(getFilesDir(), "example.json");
if (file.exists() && file.length() > 0) {
    FileInputStream fis = new FileInputStream(file);
    byte[] buffer = new byte[fis.available()];
    fis.read(buffer);
    fis.close();
    String content = new String(buffer, StandardCharsets.UTF_8);
    // 处理读取到的content内容
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:27:03