2012-07-09 29 views
11

一个图像时,这是我的代码:产生java.io.IOException:打开失败:EINVAL(无效参数)保存到外部存储

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; 
} 

问题就迎刃而解了:

urlCleaner现在返回url.substring( url.lastIndexOf('?')+ 1),并且一切按预期工作。

这个例外实际上是抛出在file.createNewFile();,我不知道为什么。

非常感谢。

(urlCleaner只是删除了HTTP:// ...从URL和离开PHP标签)

这里的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 
+0

你可以添加logcat输出与抛出的异常吗? – herom 2012-07-09 12:04:19

+0

是的,这不是一个明显的问题。 – razielsarafan 2012-07-09 12:09:20

回答

31

字符串url含有非法字符的文件名。您需要通过删除非法字符来清除文件名。

+4

这非常奇怪 - 我在缓存中使用相同的策略并查看魔术行为 - 在Nexus 7平板电脑上只能替换斜杠,但在No-name-china-tablet上,我有和主题启动器一样的异常。替换“?”和“:”做了伎俩。无论如何 - 谢谢你的回答。 – Viacheslav 2012-12-03 08:48:24

+1

Android就是这样工作的。 – razielsarafan 2013-01-02 13:49:27

相关问题