我正在使用GridView加载保存图像的json数据。当我构建项目时,它发生了一些例外
的AndroidManifest.xml:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
FileCache类:
public class FileCache {
private File cacheDir;
public FileCache(Context context) {
// Find the dir to save cached images
if (android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED))
cacheDir = new File(
android.os.Environment.getExternalStorageDirectory(),
"JsonParseTutorialCache");
else
cacheDir = context.getCacheDir();
if (!cacheDir.exists())
cacheDir.mkdirs();
}
public File getFile(String url) throws IOException {
String filename = String.valueOf(url.hashCode());
// String filename = URLEncoder.encode(url);
File f = new File(cacheDir, filename);
f.createNewFile();
return f;
}
public void clear() {
File[] files = cacheDir.listFiles();
if (files == null)
return;
for (File f : files)
f.delete();
}
}
logcat的:
W/System.err: java.io.IOException: open failed: ENOENT (No such file or directory)
W/System.err: at java.io.File.createNewFile(File.java:939)
W/System.err: at com.totoroads.android.app.FileCache.getFile(FileCache.java:33)
W/System.err: at com.totoroads.android.app.ImageLoader.getBitmap(ImageLoader.java:64)
W/System.err: at com.totoroads.android.app.ImageLoader.access$000(ImageLoader.java:29)
W/System.err: at com.totoroads.android.app.ImageLoader$PhotosLoader.run(ImageLoader.java:155)
W/System.err: at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
W/System.err: at java.lang.Thread.run(Thread.java:818)
W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
W/System.err: at libcore.io.Posix.open(Native Method)
W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
W/System.err: at java.io.File.createNewFile(File.java:932)
W/System.err: ... 9 more
我想在GridView上下载,阅读和显示图像,如何修复这些异常?
答案 0 :(得分:4)
就我而言,是:
如果定位到Android 10(API级别29)或更高版本,请在应用程序的requestLegacyExternalStorage
文件中将true
的值设置为AndroidManifest
。
<manifest ... >
<application android:requestLegacyExternalStorage="true" ... >
答案 1 :(得分:1)
您可以使用Picasso库在网格视图中显示图像。 它为加载图像提供一行代码。 使用库函数加载图像 -
Picasso.with(上下文).load( “<强> YOURIMAGE 强>”)代入(ImageView的);
您还可以根据需要调整图像大小。 它还管理内部缓存机制
参考链接了解更多信息 - http://square.github.io/picasso/
答案 2 :(得分:1)
FileCache.java中的代码是
public File getFile(String url) {
String filename = String.valueOf(url.hashCode());
// String filename = URLEncoder.encode(url);
File f = new File(cacheDir, filename);
return f;
}
已创建新文件对象,但该文件可能不存在。所以,用
替换上面的代码public File getFile(String url) {
String filename = String.valueOf(url.hashCode());
// String filename = URLEncoder.encode(url);
File f = new File(cacheDir, filename);
f.createNewFile();
return f;
}
希望,这有帮助。
编辑:当您在&gt; = Android 6.0上运行代码时,您必须在运行时请求访问外部存储的权限。在AndroidManifest.xml中添加它们是不够的。您可以使用this link了解如何操作。
答案 3 :(得分:0)
您也可以自己保存f.createNewFile
并使用File.createTempFile(imageFileName, ".jpg", storageDir)
所以你的方法现在变成了
public File getFile(String url) {
String filename = String.valueOf(url.hashCode());
// String filename = URLEncoder.encode(url);
return File.createTempFile(filename, ".jpg", cacheDir);
}