内部存储:为什么getFilesDir()给了我错误的文件夹?



我正在开发一个安卓应用程序。我想将文件从 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

这将为您提供特定于设备的路径名。

最新更新