web-dev-qa-db-ja.com

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は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
_
19
Charlie-Blake

文字列urlには、ファイル名に無効な文字が含まれています。不正な文字を削除してファイル名をクリーンアップする必要があります。

39
David Wasser

名前に?または:を使用してファイル名を書き込もうとすると、Android 28は問題なく機能しますが、たとえばAndroid 22は爆発するため、非常にトリッキーなエラーです。次のようなファイル名でいくつかの置換を実行するだけです。

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

そして、あなたは走ってもいいです

file.createNewFile()
2
Alejandra