【问题标题】:java.io.ioexception: open failed: einval (Invalid argument) when saving a image to external storagejava.io.ioexception:打开失败:将图像保存到外部存储时的 einval(无效参数)
【发布时间】:2012-07-08 19:49:09
【问题描述】:

这是我的代码:

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 只是从 url 中删除 http://... 并留下 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

【问题讨论】:

  • 能否请您添加引发异常的 logcat 输出?
  • 是的,这不是清单问题。

标签: android file-io ioexception


【解决方案1】:

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

【讨论】:

  • 这很奇怪-我使用相同的缓存策略并查看魔术行为-在 Nexus 7 平板电脑上仅替换斜线就足够了,但在 No-name-china-tablet 我有与主题启动器相同的例外。替换“?”和“:”成功了。无论如何-感谢您的回答。
  • 我在 android 中遇到了这个错误。这个错误信息真的不清楚。并且无法向程序员定义真正的问题
【解决方案2】:

真正棘手的错误,因为 Android 28 在尝试使用 ? 写入文件名时工作得很好或 : 在名称中,但例如 Android 22 会爆炸。 只需在文件名中运行几个替换,例如:

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

然后你就可以运行了

file.createNewFile()

【讨论】:

  • 正确! +1。 (在 Android 28 中你仍然需要避免文件分隔符 /)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
相关资源
最近更新 更多