8

我正在创建一个 Android 应用程序,我想列出一个目录中的文件。我通过调用来做到这一点

File[] files = path.listFiles(new CustomFileFilter());

path是一个File对象,它是通过调用创建的

File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);

然后当我尝试files通过调用来获取数组的长度时

int length = files.length;

这条线给了我一个NullPointerException,因为files是空的。

我已经path通过调用检查了我尝试列出的文件是否存在

System.out.println("Path exists: " + path.exists());

当我运行应用程序时,它会打印

Path exists: true

在 Android Studio 控制台中,因此该目录存在。

我还打印了路径名,即

/storage/emulated/0/Download

所以这path是一个目录,而不是一个文件。

我不知道为什么我得到一个NullPointerException,因为它path是一个目录。

编辑CustomFileFilter类看起来像这样:

public class CustomFileFilter implements FileFilter {

    // Determine if the file should be accepted
    @Override
    public boolean accept(File file) {
        // If the file isn't a directory
        if(file.isDirectory()) {
            // Accept it
            return true;
        } else if(file.getName().endsWith("txt")) {
            // Accept it
            return true;
        }
        // Don't accept it
        return false;
    }
}
4

3 回答 3

9

Add this to AndroidManifest.xml:

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

This permission allow you to read files; if you don't use this permission then listFiles() and list() will both throw NullPointerException.

And here is an example of showing all files in /storage/emulated/0/Download:

   String dir = "/storage/emulated/0/Download/";
        File f = new File(dir);
        String[] files = f.list();
        for(int i=0; i<files.length; i++){
            Log.d("tag", files[i]);
        }
于 2015-01-10T09:57:40.770 回答
4

确保您遵循了Saeed Masoumi的回答,如果您仍然有问题,那是因为您设置了 Target API 29 或更高版本。

将此属性添加到清单文件的应用程序标记中,它将起作用。

android:requestLegacyExternalStorage="true"

根据google对数据存储的App兼容性功能

在您的应用与范围存储完全兼容之前,您可以使用以下方法之一暂时退出:

  • 面向 Android 9(API 级别 28)或更低版本。
  • 如果您面向 Android 10(API 级别 29)或更高版本,请在应用的清单文件中将 requestLegacyExternalStorage 的值设置为 true:

    <manifest ... >
      <!-- This attribute is "false" by default on apps targeting
           Android 10 or higher. -->
        <application android:requestLegacyExternalStorage="true" ... >
          ...
        </application>
    </manifest>

要测试针对 Android 9 或更低版本的应用在使用范围存储时的行为方式,您可以通过将 requestLegacyExternalStorage 的值设置为 false 来选择该行为。

于 2020-05-28T10:51:44.027 回答
3

对于那些使用 android SDK>23 的人,您需要通过代码授予权限:使用类似:

 boolean grantedAll = ContextCompat.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
if (!grantedAll)
   {
     ActivityCompat.requestPermissions(thisActivity,
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            REQUEST_PERMISSIONS);
   }
于 2017-02-09T12:12:30.860 回答