我正在开发一个android应用。我想将文件从Firebase存储下载到内部存储,然后再播放(音频文件)。我使用getFilesDir()来实现。
在模拟器上一切正常。我的音频目录位于
/data/user/0/com.package.name/files/audio /
问题发生在某些使用 Android API 28的华为设备(手机和平板电脑)上。
我得到一个错误,无法在上述位置找到我的音频文件夹,并且使用设备文件浏览器,我可以清楚地看到没有 data / user / 文件夹,而是系统仍然使用旧的 /data/data/com.package.name / 目录。
所以我的问题是:
有人知道为什么 getFilesDir()没有给我正确的路径,以及如何在不对路径进行硬编码的情况下解决此问题。
这是一些代码,我也曾尝试在根文件夹上调用exist(),但没有成功。
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);
答案 0 :(得分:2)
getFilesDir()
可以并且确实会基于您正在运行的设备或什至是哪个用户(对于支持多个用户的设备)正在运行您的应用程序(即user/0
)返回不同的绝对路径。重新看到)。
只要您在getFilesDir()
返回的目录或其子目录(例如new File(getFilesDir(), "voice")
目录)上操作,一切都将在每台设备上运行。
答案 1 :(得分:0)
我很困惑,为什么getFilesDir()
在正确的目录中创建文件却在需要删除时找不到它们,getFilesDir().getPath()
为我工作。
答案 2 :(得分:0)
getFilesDir()方法返回一个抽象文件路径,该路径将根据存储系统而变化。
您可以使用getCanonicalFile()获得/data/data/com.package.name/files路径。在Kotlin中,它看起来像这样:
val filePath = context.filesDir.canonicalFile
这将为您提供设备专用的路径名。