我在尝试从Android外部SD卡读取zip文件时遇到了一些问题。
下面是我的代码:
File[] fileArr = mVersionUpgradeViewModel.getZipFileFromSDCard();
for(int i = 0; i < fileArr.length; i++){
System.out.println(fileArr[i]);
}
public File[] getZipFileFromSDCard() {
File[] matchingFiles = new File[0];
File f = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
if(f.exists()) {
matchingFiles = f.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith("zip");
}
});
}
return matchingFiles;
}
和我的模拟器文件夹结构:
zip文件夹在那里。但是使用上面的代码,我得到的错误消息如下:
Caused by: java.lang.NullPointerException: Attempt to get length of null array
at com.mainapp.asynctask.VersionUpgradeTask.doInBackground(VersionUpgradeTask.java:86)
at com.mainapp.asynctask.VersionUpgradeTask.doInBackground(VersionUpgradeTask.java:15)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
错误指向第一个for循环。上一次它是有效的。但是在我尝试了新版本的安装代码后,上面的方法就失效了。有什么想法吗?
谢谢!
发布于 2018-06-11 15:33:23
您确定您有读外部存储的权限吗
List<File> fileArr = getZipFileFromSDCard();
for (int i = 0; i < fileArr.size(); i++) {
System.out.println(fileArr.get(i));
}
public List<File> getZipFileFromSDCard() {
List<File> matchingFiles = new ArrayList<>();
File wallpaperDirectory = new File(Environment.getExternalStorageDirectory().toString());
File[] files = wallpaperDirectory.listFiles();
for (File file : files) {
if (file.getName().endsWith("pdf")) {
matchingFiles.add(file);
}
}
return matchingFiles;
}
发布于 2018-06-11 15:48:36
您使用一个包含0个元素的数组初始化matchingFiles
:
File[] matchingFiles = new File[0];
然后检查Environment.DIRECTORY_DOWNLOADS
是否存在,如果存在,则将matchingFiles
重新创建为其中以zip结尾的文件数组。
堆栈跟踪清楚地表明错误不是从该方法抛出的,但可以安全地假设该方法的结果有问题。
现在,matchingFiles
后来是一个null
数组,所以Environment.DIRECTORY_DOWNLOADS确实存在,所以您不具有该文件夹的读取权限,或者Environment.DIRECTORY_DOWNLOADS
没有被设置为所示结构中的下载文件夹,或者您正在检查的压缩文件被限制为运行应用程序的用户。
您可能希望检查matchingFiles
是否为null
,如果是,请在方法的末尾将其设置为new File[0]
以改进您的代码,但解决方案显然是检查您对文件夹和文件的权限。
https://stackoverflow.com/questions/50792390
复制相似问题