Java Can';无法获取外部存储目录的文件

Java Can';无法获取外部存储目录的文件,java,android,io,Java,Android,Io,因此,我试图获取某个目录中的所有文件,但在尝试使用file.listFiles()时,我总是会得到NullPointerException 我拥有清单文件中包含的正确权限(在应用程序标记之前): 我也无法访问和读取appTests目录中的文件,在这种情况下会引发EACCESS异常(权限被拒绝) 路径正确,目录也位于/scard/\u appTests 我必须使用超级用户权限才能访问此目录吗 App minSdkVersion是22(Android 5.1),我正在手机上运行Android 6.

因此,我试图获取某个目录中的所有文件,但在尝试使用file.listFiles()时,我总是会得到NullPointerException

我拥有清单文件中包含的正确权限(在应用程序标记之前):

我也无法访问和读取appTests目录中的文件,在这种情况下会引发EACCESS异常(权限被拒绝)

路径正确,目录也位于/scard/\u appTests

我必须使用超级用户权限才能访问此目录吗


App minSdkVersion是22(Android 5.1),我正在手机上运行Android 6.0,但我没有使用运行时权限请求,我将它们包含在我的清单文件中。

尝试将以下内容添加到清单中:

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


由于您尝试访问该文件,因此它可以解决该问题

您还需要添加读取文件的权限,即:

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

如果您的目标是sdk 23,那么清单中的权限将不起作用。
您需要在运行时获得您的权限才能使其工作。

尝试在“设置”中手动授予存储权限

当有人将设备升级到android 6.0(我们的应用程序已经编译了SDK 21)时,我们遇到了同样的问题。

Map externalLocations=ExternalStorage.getAllStorageLocations();
文件sdCard=externalLocations.get(ExternalStorage.SD_-CARD);
文件externalSdCard=externalLocations.get(ExternalStorage.EXTERNAL\u SD\u卡);

@Amesys:仍然不起作用,Android文档中说:但是,如果你的应用程序使用了WRITE\u EXTERNAL\u存储权限,那么它也隐含着读取外部存储的权限。@nauti对于sdk 6.0版,你需要提供运行时权限。你需要帮助吗?不,谢谢。请看埃利米尔的回答。它解决了我的问题。如果您在清单文件中提供了使用权限,则即使在Android 6.0上安装时,应用程序也会请求所有必需的权限。@nauti ok Great:)非常感谢,这真的解决了问题,我希望Google会更新权限系统,这样,如果您在清单文件中声明,就会自动授予此权限。@nauti:这是自动授予的如果你的应用程序
targetSdkVersion
的值为22或更低,则可以。您的应用程序可能已将
targetSdkVersion
设置为23或更高。在这种情况下,您明确地告诉Android您打算使用运行时权限。哦,谢谢@commonware,现在我明白了。我一直认为您要么将它们放入清单中,要么请求运行时权限。谢谢“我在手机上运行Android 6.0,但我不使用运行时权限请求,我将它们包含在清单文件中”——您总是将权限请求放在清单中。如果您的
targetSdkVersion
为23或更高,您还需要在运行时请求它们。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />  
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Map<String, File> externalLocations = ExternalStorage.getAllStorageLocations();
File sdCard = externalLocations.get(ExternalStorage.SD_CARD);
File externalSdCard = externalLocations.get(ExternalStorage.EXTERNAL_SD_CARD);