Java.io.ioexception: open failed: einval (Invalid argument) when saving image to external storage

This is my code:

private boolean writeToSD(Bitmap bm, String url) { if (canIWriteOnSD()) { File sd = Environment.getExternalStorageDirectory(); File dest = new File(sd, "MoveInBlue/"); try { url = urlCleaner(url); if (!dest.exists()) { dest.mkdir(); } File file = new File(dest, url + ".png"); if (!file.exists()) { file.createNewFile(); } FileOutputStream out = new FileOutputStream(file); bm.compress(Bitmap.CompressFormat.PNG, 90, out); out.flush(); out.close(); return true; } catch (Exception e) { e.printStackTrace(); // Do nothing } } return false; } 

SOLUTION:

urlCleaner now returns url.substring (url.lastIndexOf ('?') + 1), and everything works as intended.

The exception is actually file.createNewFile(); in file.createNewFile(); and I really don't know why.

Thank you very much.

(urlCleaner just removes http: // ... from the url and leaves the php tags)

Here's the logcat:

 07-09 13:57:13.479: W/System.err(5715): java.io.IOException: open failed: EINVAL (Invalid argument) 07-09 13:57:13.479: W/System.err(5715): at java.io.File.createNewFile(File.java:940) 07-09 13:57:13.479: W/System.err(5715): at com.moveinblue.planner.asynctask.ImageDownloader.writeToSD(ImageDownloader.java:459) 07-09 13:57:13.479: W/System.err(5715): at com.moveinblue.planner.asynctask.ImageDownloader.access$2(ImageDownloader.java:448) 07-09 13:57:13.479: W/System.err(5715): at com.moveinblue.planner.asynctask.ImageDownloader$BitmapDownloaderTask.onPostExecute(ImageDownloader.java:270) 07-09 13:57:13.479: W/System.err(5715): at com.moveinblue.planner.asynctask.ImageDownloader$BitmapDownloaderTask.onPostExecute(ImageDownloader.java:1) 07-09 13:57:13.479: W/System.err(5715): at android.os.AsyncTask.finish(AsyncTask.java:602) 07-09 13:57:13.479: W/System.err(5715): at android.os.AsyncTask.access$600(AsyncTask.java:156) 07-09 13:57:13.479: W/System.err(5715): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 07-09 13:57:13.479: W/System.err(5715): at android.os.Handler.dispatchMessage(Handler.java:99) 07-09 13:57:13.479: W/System.err(5715): at android.os.Looper.loop(Looper.java:137) 07-09 13:57:13.479: W/System.err(5715): at android.app.ActivityThread.main(ActivityThread.java:4575) 07-09 13:57:13.489: W/System.err(5715): at java.lang.reflect.Method.invokeNative(Native Method) 07-09 13:57:13.489: W/System.err(5715): at java.lang.reflect.Method.invoke(Method.java:511) 07-09 13:57:13.489: W/System.err(5715): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 07-09 13:57:13.489: W/System.err(5715): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 07-09 13:57:13.489: W/System.err(5715): at dalvik.system.NativeStart.main(Native Method) 07-09 13:57:13.489: W/System.err(5715): Caused by: libcore.io.ErrnoException: open failed: EINVAL (Invalid argument) 07-09 13:57:13.489: W/System.err(5715): at libcore.io.Posix.open(Native Method) 07-09 13:57:13.489: W/System.err(5715): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110) 07-09 13:57:13.489: W/System.err(5715): at java.io.File.createNewFile(File.java:933) 07-09 13:57:13.489: W/System.err(5715): ... 15 more 
+16
android file-io ioexception
Jul 09 2018-12-12T00:
source share
2 answers

The url string contains invalid characters for the file name. You will need to clear the file name by deleting invalid characters.

+36
Jul 09 2018-12-12T00:
source share

Really a tricky mistake, since Android 28 works just fine when trying to write a file name with? or: in the name, but Android 22, for example, will explode. Just run a couple of replacements in the file name:

 File(filename.replace(":", "").replace("?", "") [...]) 

and then you run well

 file.createNewFile() 
0
Feb 04 '19 at 16:05
source share



All Articles