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

Java 内部存储:为什么GetFileDir()给了我错误的文件夹?,java,android,firebase-storage,Java,Android,Firebase Storage,我正在开发一个android应用程序。我想将文件从Firebase存储下载到内部存储,然后能够播放它们(音频文件)。我使用getFilesDir()来实现这一点 在模拟器上一切正常。我的音频目录位于 /data/user/0/com.package.name/files/audio/ 该问题出现在一些使用Android API 28的华为设备(手机和平板电脑)上。 我得到一个错误,在上面提到的位置找不到我的音频文件夹,通过设备文件浏览器,我可以清楚地看到没有data/user/文件夹,但系统仍然

我正在开发一个android应用程序。我想将文件从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”;
字符串rootPath=getFilesDir().getAbsolutePath();
文件根=新文件(根路径);
//不起作用
如果(!root.exists()){
rootPath=“/data/data/”+getPackageName()+File.separator+“files”
+File.separator+“voice”+File.separator;
}
//
字符串folderPath=rootPath+File.separator+“voice”+File.separator;
文件子文件夹=新文件(folderPath);
如果(!子文件夹.exists()){
子文件夹.mkdir();
}
最终文件localFile=新文件(子文件夹,文件名);
final StorageReference voiceRef=上传sref.child(“语音”).child(文件名);
voiceRef.getFile(localFile);
getFilesDir()
可以并且确实返回不同的绝对路径,这取决于您正在运行的设备,甚至是运行您的应用程序的用户(支持多个用户的设备)(即您看到的
用户/0


只要您在
getFilesDir()
返回的目录或它的子目录(例如
新文件(getFilesDir(),“voice”)
目录)上操作,每台设备上都能正常工作。

我不明白为什么
getFilesDir()
会在正确的目录中创建文件,但在需要删除时却找不到它们,
getFilesDir().getPath()
对我有效。

该方法返回一个抽象文件路径,该路径将根据存储系统的不同而变化

您可以使用获取/data/data/com.package.name/files路径。在科特林,它看起来像这样:

val filePath = context.filesDir.canonicalFile

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

之所以存在
getFilesDir()
,是因为绝对路径在设备之间可以而且确实不同,这是意料之中的。您是说
getFilesDir().exists()
在这些设备上返回false?getFilesDir().getAbsolutePath()返回错误的路径,它返回/data/user/0/但设备没有这样的目录。它使用数据/数据/代替。我在root.exists()上面的代码中的方式返回true。我希望GetFileDir为我提供特定于设备的路径,但由于该路径不起作用,我试图通过硬编码这些较旧的dir系统的路径来解决这个问题(因为exists返回true,所以没有帮助)。绝对路径在不同的设备上应该是不同的。为什么要查看绝对路径?您的音频目录不总是位于
新文件(getFilesDir(),“audio”)
(如果您的文件夹名为audio,那么您的代码也会使用
语音
)?这就是每个设备的一致性
/data/data/
是一个符号链接,指向遇到getFilesDir()奇怪问题的
/data/user/0
的实际位置。在根目录手机上,如果我删除目录,在下一次运行应用程序时调用getFilesDir()。mkdir/mkdirs返回false!知道为什么吗?此外,我认为该目录会在应用程序安装时自动创建,或者可能是第一次启动?@MuhammadBabar-如果您查看,您会注意到,如果文件夹不存在,它会尝试自动创建该文件夹,但该文件夹的所有权比您想象的要复杂(系统拥有更高级别的目录,你的应用程序无法写入这些目录,这就是你无法自己创建这些目录的原因)。是的,谢谢你指出。所以你说系统拥有这些目录(GetFileDir)但是文档中说,
调用应用程序不需要额外的权限来读取或写入返回路径下的文件
。所以我的理解是,getFilesDir返回的路径只能由系统写入,但系统允许在该路径内访问相应的应用程序,以便在根电话上执行写入操作在下一次运行时执行
getFilesDir
,为什么系统无法再次创建目录?