当我在根路径上使用file.listFiles()时,它总是返回null

时间:2018-10-05 07:07:08

标签: android

(原谅我的英语不好) 我想在Android上制作文件浏览器应用程序,但无法在根路径上获取文件列表。 我使用Android Studio 3.1.2开发,并且创建了一个非常基本的应用程序进行测试。  我已经在清单和代码中都获得了“读/写”存储权限:

AndroidManifest

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

MainActivity

ActivityCompat.requestPermissions(MainActivity.this,
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE},
            readWritePermmisionRequestCode);

然后我写了一个简单的方法将文件从我的应用程序目录记录到根路径:

private void searchAllSubFiles() {
    if (targetFilePath.isEmpty()) targetFilePath = getApplicationContext().getFilesDir().getAbsolutePath();
    try{
        File file = new File(targetFilePath);

        String msg = "Path:" + targetFilePath;
        msg += ", file name:" + file.getName();
        msg += ", file readable:" + file.canRead();
        msg += ", file writable:" + file.canWrite();
        msg += ", file is directory:" + file.isDirectory();
        msg += ", file can execute:" + file.canExecute();
        msg += ", sub files:" + file.listFiles();
        Log.d(TAG, msg);

        if (targetFilePath.equals("/"))return;

        targetFilePath = file.getParent();
        searchAllSubFiles();
    } catch(Exception e) {
        Log.e(TAG, "Can not read sub files.");
        e.printStackTrace();
    }
}

这是日志:

Path:/data/user/0/com.test.xux.testviewer/files, file name:files, file readable:true, file writable:true, file is directory:true, file can execute:true, sub files:[Ljava.io.File;@70ac326
Path:/data/user/0/com.test.xux.testviewer, file name:com.test.xux.testviewer, file readable:true, file writable:true, file is directory:true, file can execute:true, sub files:[Ljava.io.File;@c6edb67
Path:/data/user/0, file name:0, file readable:false, file writable:false, file is directory:true, file can execute:true, sub files:null
Path:/data/user, file name:user, file readable:false, file writable:false, file is directory:true, file can execute:true, sub files:null
Path:/data, file name:data, file readable:false, file writable:false, file is directory:true, file can execute:true, sub files:null
Path:/, file name:, file readable:false, file writable:false, file is directory:true, file can execute:true, sub files:null

实际上,它在我的应用程序目录中运行良好。但是在/ data / user / 0路径中,文件变得不可读和不可写。我希望我的应用程序能够像另一个应用程序PerfectViewer一样读取手机中的所有文件。我该怎么办?

1 个答案:

答案 0 :(得分:0)

您正在尝试读取Android OS级别的目录,该目录对于无根电话的最终用户不可读。

从错误日志中清除它。

这是您应用的目录,因此file readable:true, file writable:true

  

路径:/data/user/0/com.test.xux.testviewer,文件   名称:com.test.xux.testviewer,文件可读:true,文件可写:true,   文件是目录:true,文件可以执行:true,子目录   文件:[Ljava.io.File; @ c6edb67

现在,您正在尝试在不可读的根目录上读取文件。

因此在日志中明确显示

 file readable:false, file writable:false
  

路径:/ data / user / 0,文件名:0,可读文件:false,文件   可写:false,文件位于目录:true,文件可以执行:true,子目录   文件:空

这就是为什么它返回null的原因。