【发布时间】:2019-10-29 13:11:11
【问题描述】:
我正在开发一个安卓应用程序。我想将文件从 Firebase 存储下载到内部存储,然后能够播放它们(音频文件)。我使用 getFilesDir() 来实现这一点。
在模拟器上一切正常。我的音频目录位于
/data/user/0/com.package.name/files/audio/
此问题出现在使用 Android API 28 的部分华为设备(手机和平板电脑)上。
我收到错误消息,在上述位置找不到我的音频文件夹,使用设备文件资源管理器我可以清楚地看到没有 data/user/ 文件夹,而是系统仍然使用旧的 /data/data/com.package.name/ 目录。
所以我的问题是:
有人知道为什么 getFilesDir() 没有给我正确的路径,以及如何在不硬编码路径的情况下解决这个问题。
这是一些代码,我也尝试在根文件夹上调用exists(),但没有成功。
String filename = document.getId() + ".m4a";
String rootPath = getFilesDir().getAbsolutePath();
File root = new File(rootPath);
//not working
if(!root.exists()){
rootPath = "/data/data/" + getPackageName() + File.separator + "files"
+ File.separator + "voice" + File.separator;
}
//
String folderPath = rootPath + File.separator + "voice" + File.separator;
File subFolder = new File(folderPath);
if(!subFolder.exists()){
subFolder.mkdir();
}
final File localFile = new File(subFolder, filename);
final StorageReference voiceRef = uploadsRef.child("voice").child(filename);
voiceRef.getFile(localFile);
【问题讨论】:
-
getFilesDir()存在的原因是因为设备之间的绝对路径可以而且确实不同,这是意料之中的。你是说getFilesDir().exists()在这些设备上返回 false 吗? -
getFilesDir().getAbsolutePath() 返回错误的路径,它返回 /data/user/0/ 但设备没有这样的目录。它使用 data/data/ 代替。我在 root.exists() 上面的代码中的方式返回 true。我希望 getFilesDir 给我设备特定的路径,但由于它不起作用,我试图通过硬编码那些旧目录系统的路径来解决问题(因为存在返回 true,所以没有帮助。
-
绝对路径在不同的设备上会有所不同。你为什么要看绝对路径?
-
你的音频目录不是一直在
new File(getFilesDir(), "audio")吗(如果你的文件夹叫音频,你的代码也用voice)?这将在每台设备上保持一致 -
/data/data/是指向/data/user/0实际位置的符号链接
标签: java android firebase-storage