IT-Swarm.Net

文件存在和 IS 目录,但listFiles()返回null

File.listFiles() 的文档建议只有在调用它的文件不是目录的情况下才会返回null。.

我有以下内容:

String dir = "/storage/emulated/0";
File f = new File(dir);
Log.v("Files",f.exists()+"");
Log.v("Files",f.isDirectory()+"");
Log.v("Files",f.listFiles()+"");

日志显示:

true
true
null

出于某种原因,listFiles()返回null,即使File被识别为有效目录。我对Android文件层次结构行为并不是很熟悉,所以我猜测问题就在那里。.

作为参考,我正在我的Moto X上进行调试,无论手机是否插入我的电脑,结果都是一样的 - 所以我认为这不会与插入时的安装有关。.

55
Wilson

对于有此问题的人,请将其添加到AndroidManifest.xml:

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

问题解决了:D

编辑:如果这不起作用只是确保路径是否正确

80
BamsBamx

快速,可靠且价格合理的云托管

注册并在30天内获得$50奖金!

对于Android 版本23或更高版本 ,您需要在onresume方法中提供 运行时权限 以编程方式,如下所示,

public final String[] EXTERNAL_PERMS = {Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE
};

public final int EXTERNAL_REQUEST = 138;

requestForPermission();

public boolean requestForPermission() {

    boolean isPermissionOn = true;
    final int version = Build.VERSION.SDK_INT;
    if (version >= 23) {
        if (!canAccessExternalSd()) {
            isPermissionOn = false;
            requestPermissions(EXTERNAL_PERMS, EXTERNAL_REQUEST);
        }
    }

    return isPermissionOn;
}

public boolean canAccessExternalSd() {
    return (hasPermission(Android.Manifest.permission.WRITE_EXTERNAL_STORAGE));
}

private boolean hasPermission(String perm) {
    return (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(this, perm));

}
15
varotariya vajsi

对于有此问题的用户,您可以将其添加到AndroidManifest.xml:

Android:name="Android.permission.READ_EXTERNAL_STORAGE" 

你也应该给予许可

设置>应用> “您的应用名称” >权限>存储

10
Ravi Joshi

从File'listFiles'方法文档:如果此抽象路径名不表示目录,或者发生I/O错误,则返回null。.

所以可能发生了I/O错误。检查该目录的权限,运行Java程序的用户是否有权读取该目录?如果没有,那就有你的答案。如果他们这样做,那么该目录可能是空的。.

顺便说一句,你不应该使用+“”将某些东西转换为字符串,这是一种不好的做法,因为它比String.valueOf慢。我会使用Apache的StringUtils将该数组连接成一个字符串,但这需要将该jar添加到类路径中。.

7
msknapp

只需在清单uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE"中添加权限,您的问题就会得到解决。.

2
kamal

我的问题是由于某种原因Android:sharedUserId =“Android.uid.system”属性不允许应用程序在特定设备上读取/ sdcard /。.

由于我只需要进行快速测试,我删除了sharedUserId属性,进行了测试并将其添加回来。.

1
thiagolr

<uses-permission .... >部分的清单文件中,添加此行Android:name="Android.permission.READ_EXTERNAL_STORAGE"。我认为这可以解决你的问题。.

0
Rajan Menon

我在Java中遇到了同样的问题,但在Android中我没有使用引号中的路径读取配置文件。我只是删除引号解决了我的问题

所以你可以通过String替换函数来实现它,或者不带引号给它

String someString =“C:\ path”; someString = someString.replace( “\””, “”);

0
Sam