我正在开发一个安卓应用程序。我想将文件从 Firebase 存储下载到内部存储,然后能够播放它们(音频文件)。我使用 getFilesDir() 来实现这一点。
模拟器上一切正常。我的音频目录位于
/data/user/0/com.package.name/files/audio/
此问题发生在某些具有Android API 28的华为设备(手机和平板电脑)上。
我收到错误,在上述位置找不到我的音频文件夹,并且使用设备文件资源管理器,我可以清楚地看到没有数据/用户/文件夹,但系统仍然使用旧的/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()
可以根据你运行的设备,甚至哪个用户(对于支持多个用户的设备)运行你的应用(这是你看到的user/0
)返回不同的绝对路径。
只要您在getFilesDir()
返回的目录或其子目录(例如您的new File(getFilesDir(), "voice")
目录)上进行操作,一切都可以在每台设备上运行。
我很困惑为什么getFilesDir()
在正确的目录中创建文件,但在需要删除时找不到它们,getFilesDir().getPath()
对我有用。
getFilesDir() 方法返回一个抽象文件路径,该路径将根据存储系统而变化。
您可以使用 getCanonicalFile() 获取/data/data/com.package.name/files 路径。在 Kotlin 中,它看起来像这样:
val filePath = context.filesDir.canonicalFile
这将为您提供特定于设备的路径名。