Android 11 应用读取私有存储下example.json文件失败如何解决?
问题产生原因
- 路径不匹配:你手动传输文件的包名路径和当前运行测试应用的实际包名不匹配。测试构建版本通常会自动添加
.debug之类的包名后缀,如果你传输的路径是nl.xyz.myapp对应的目录,而实际运行的应用包名是nl.xyz.myapp.debug,那么getFilesDir()返回的就是后缀版本的目录,自然找不到你传输的文件。你看到的.Fabric文件是Fabric/Crashlytics 崩溃统计 SDK 自动生成的缓存文件,属于当前运行应用目录下的自动生成文件,也能证明你当前代码访问的目录和你传文件的目录不是同一个。 - Android版本权限限制:Android 11及以上版本禁止通过MTP(手机连电脑的文件传输模式)直接访问
/Android/data下的应用私有目录,你在电脑端看到的目录可能是缓存的虚拟路径,实际文件并没有成功写入到应用真实私有目录中。 - 读取代码逻辑问题:如果没有提前判断文件是否存在、是否是有效文件就直接读取,也会出现返回空字符串的情况。
适配调整方案
- 确认当前应用的真实私有目录路径
运行如下代码打印实际路径,和你传输文件的路径做对比:
Log.d("App私有目录", getFilesDir().getAbsolutePath());
如果路径不匹配,后续直接将文件放到打印出的对应路径下即可。
- 使用adb命令传输文件
不要用MTP传输私有目录文件,改用adb push命令,不受Android版本权限限制,示例命令如下:
adb push 本地/example.json /sdcard/Android/data/[你的应用实际包名]/files/example.json
- 完善文件读取逻辑
读取前增加合法性判断,避免空读:
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
相关产品推荐
相关产品推荐

