FileNotFoundException: /storage/emulated/0/JsonParseTutorialCache: open failed: ENOENT (No such file or directory)
Solution 1
The code in FileCache.java is
public File getFile(String url) {
String filename = String.valueOf(url.hashCode());
// String filename = URLEncoder.encode(url);
File f = new File(cacheDir, filename);
return f;
}
A new file object has been created, but the file may not exist. So, replace the above code with
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;
}
Hope, it helps.
Edit : As you're running your code on >= Android 6.0, you gotta request for permission to access External Storage at runtime. Adding those in AndroidManifest.xml isn't enough. You can use this link on how to do it.
Solution 2
In my case, it was:
If targeting Android 10 (API level 29) or higher, set the value of requestLegacyExternalStorage
to true
in your app's AndroidManifest
file.
<manifest ... >
<application android:requestLegacyExternalStorage="true" ... >
Solution 3
You can use Picasso library for showing images in grid view. it is provide one line code for load image. Use Library function for load images--
Picasso.with(context).load("YOURIMAGE").into(imageView);
You can also resize images according to your requirement. and it is also manage internally cache mechanism
Refer Link for more info - http://square.github.io/picasso/
Solution 4
You can also save yourself the f.createNewFile
and use File.createTempFile(imageFileName, ".jpg", storageDir)
So your method now becomes
public File getFile(String url) {
String filename = String.valueOf(url.hashCode());
// String filename = URLEncoder.encode(url);
return File.createTempFile(filename, ".jpg", cacheDir);
}
luongkhanh
Updated on April 17, 2021Comments
-
luongkhanh about 3 years
I'm using GridView to load json data holding images. When I built project it happened some exceptions
AndroidManifest.xml:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
FileCache class:
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
I want to download, read and display images on GridView, How to fix those exceptions?