尝试从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循环。它上次工作了。但在我尝试了较新的版本安装代码后,上面的方法就会中断。有什么想法吗?
谢谢!
答案 0 :(得分:0)
您确定已获得读取外部存储空间的许可
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;
}
答案 1 :(得分:0)
使用0个元素的数组初始化matchingFiles
:
File[] matchingFiles = new File[0];
然后检查Environment.DIRECTORY_DOWNLOADS
是否存在,如果存在,则重新创建matchingFiles
,使其成为以zip结尾的文件数组。
堆栈跟踪清楚地表明该方法没有抛出错误,但可以安全地假设该方法的结果存在问题。
现在,matchingFiles
稍后是null
数组,因此确实存在Environment.DIRECTORY_DOWNLOADS,因此您要么没有该文件夹的读取权限,要么Environment.DIRECTORY_DOWNLOADS
未设置为显示的结构中的“下载”文件夹,或者您正在检查的zip文件仅限于运行该应用程序的用户。
您可能想要检查matchingFiles
是否为null
,如果是,请在方法结束时将其设置为new File[0]
以改进您的代码,但解决方案显然是检查您对文件夹和文件的权限。