有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在开发一款安卓应用程序。我想将文件从Firebase存储下载到内部存储,然后可以播放它们(音频文件)。我使用getFilesDir()来实现这一点

在模拟器上一切正常。我的音频目录位于

/data/user/0/com.package.name/files/audio/

这个问题出现在一些使用安卓API 28的华为设备(手机和平板电脑)上

我得到一个错误,在上面提到的位置找不到我的音频文件夹,通过设备文件浏览器,我可以清楚地看到没有data/user/文件夹,但系统仍然使用旧的/data/data/com。包裹名称/目录

所以我的问题是:

有人知道为什么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);

共 (3) 个答案

  1. # 1 楼答案

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

    您可以获取/data/data/com。包裹使用getCanonicalFile()命名/文件路径。在科特林,它看起来像这样:

    val filePath = context.filesDir.canonicalFile
    

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

  2. # 2 楼答案

    getFilesDir()可以并且确实会根据您正在运行的设备,甚至是哪个用户(对于支持多个用户的设备)正在运行您的应用程序(即您看到的user/0),返回不同的绝对路径

    只要您在getFilesDir()返回的目录或它的子目录(例如new File(getFilesDir(), "voice")目录)上操作,每台设备上的一切都将正常工作

  3. # 3 楼答案

    我很困惑为什么getFilesDir()在正确的目录中创建文件,但在需要删除时却找不到它们,getFilesDir().getPath()对我有用