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

时间:2019-06-14 22:51:04

标签: java android firebase-storage

我正在开发一个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);

3 个答案:

答案 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

这将为您提供设备专用的路径名。