Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 文件存在并且是目录,但listFiles()返回null_Java_Android_File_Io_File Permissions - Fatal编程技术网

Java 文件存在并且是目录,但listFiles()返回null

Java 文件存在并且是目录,但listFiles()返回null,java,android,file,io,file-permissions,Java,Android,File,Io,File Permissions,建议仅在调用它的文件不是目录的情况下才返回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,即使文件被识别为有效

建议仅在调用它的文件不是目录的情况下才返回
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
,即使
文件
被识别为有效目录。我不太熟悉Android文件层次结构行为,所以我猜问题就在那里


作为参考,我正在我的Moto X上调试,无论手机是否插入我的计算机,结果都是一样的——因此我认为这与插入时的装载无关。

来自文件“listFiles”方法文档:如果此抽象路径名不表示目录,或者如果发生I/O错误,则返回null

因此,可能发生了I/O错误。检查该目录的权限,运行java程序的用户是否具有读取该目录的权限?如果不是,那就是你的答案。如果是这样,那么目录可能是空的


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

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

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

问题解决:D


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

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


由于我只需要做一个快速测试,我删除了sharedUserId属性,测试并添加了它。

只需在清单中添加权限
使用权限android:name=“android.permission.READ_EXTERNAL_STORAGE”
,您的问题就会得到解决。

在清单文件的
部分,添加此行
android:name=“android.permission.READ\u EXTERNAL\u STORAGE”
。我认为这可能会解决您的问题。

对于有此问题的用户,您可以向AndroidManifest.xml添加以下内容:

android:name="android.permission.READ_EXTERNAL_STORAGE" 
您还应该授予


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

对于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));

}

我在java中也遇到了同样的问题,但在android中却没有,在android中,我正在读取带有引号的路径的配置文件。我通过删除引号解决了我的问题

因此,您可以通过字符串替换函数或不带引号的函数来实现

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

除了其他答案和注释外,我建议您检查是否需要

总之,这本书很短,但很有见地。 您可以“ls-ld”设备上的目录(通过“adb shell”或其他shell)。 如果您对目录具有“r”权限,则可以调用listFiles()。否则,它将返回null。请注意,如果您知道文件名并且对目录具有“x”权限,则可以访问不可读目录下的文件。
你可以通过“whoami”和“groups”命令知道你是谁。

@tamo的回答解决了我的问题,我在ANQ上编译了exoplayer,并设置:

build.gradle:

android {
compileSdkVersion 29
buildToolsVersion '29.0.0'

defaultConfig {
    minSdkVersion 16
    targetSdkVersion 29
}
manifest.xml:

  <application
  android:name="com.google.android.exoplayer.demo.ExoPlayerDemoApplication"
  android:label="@string/application_name"
  android:icon="@drawable/ic_launcher"
  android:largeHeap="true"
  android:allowBackup="false"
  android:requestLegacyExternalStorage="true">


如果您的目标是API 29或更高版本,只需遵循google的设置。

首先确保您正在请求读取外部存储的权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
那么listFiles()函数将不会返回空数组

  • 列表项
  • 将此添加到AndroidManifest.xml中
    它对我很有效。

    这不是权限问题吗?普通用户是否有权访问该目录?您是否尝试将文件放入该目录中?在我看来,文档实际建议的是,如果不是目录,它将为null,但如果目录中没有实际文件,它也将返回nullthere@DigCamara嗯,在Java中,文件在包括目录-文件夹中有目录。@Peterdk我切换到/sdcard,它指向相同的东西,并且我认为对用户开放..?,得到了相同的结果。这告诉了你什么?(如果这是错误的,我非常确定,当你试图读目录的内容时,你会得到
    null
    )+5这个答案!我想知道为什么在logcat中说我没有这个权限没有错误?在Marshmallow+上,您还需要调用以下命令:ActivityCompat.requestPermissions(activity,新字符串[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},requestCode);IHeartAndroid:我试图复制并粘贴此代码,但直到我意识到您正在请求写入外部存储而不是读取外部存储时,它才起作用。这不只是现有答案的重复吗?对我来说,这是正确的解决方案。它不需要更改代码,适用于所有应用程序它对棒棒糖有效,但不适应棉花糖的新概念。内部存储呢?我的内部存储有这个问题。这个解决方案是唯一对我有效的解决方案。在Nougat 7.0中测试,Android 10requestLegacyExternalStorage是过渡的,在Android 11中不受支持针对SDK 30的ou构建:
    android:requestLegacyExternalStorage="true"