API 16上的FileNotFoundExeption

时间:2015-08-01 07:26:52

标签: java android

我尝试将文件保存到外部存储器,它可以工作(在API 19-22上测试)但在API 16上它崩溃了。

这是代码:

 //save image to SD
private void saveToExternal(Bitmap bitmap,String fileName){
    File myDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File checkFile = new File(myDir,fileName+".png");
    if(checkFile.exists()){
        checkFile = new File(myDir,fileName+"(1).png");
    }
    if (myDir!=null && myDir.isDirectory() && myDir.exists()) {
        try {
            FileOutputStream out = new FileOutputStream(checkFile);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);

            Log.d("myTag","write file to external");
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

例外:

 08-01 07:38:24.708    2159-2159/? W/System.err﹕ java.io.FileNotFoundException:     /mnt/sdcard/Android/data/com.dandewine.user.tocleveroad/files/Pictures/milk | The Balanced Blonde.png: open failed: EINVAL (Invalid argument)
 08-01 07:38:24.708    2159-2159/? W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:416)
 08-01 07:38:24.708    2159-2159/? W/System.err﹕ at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
 08-01 07:38:24.708    2159-2159/? W/System.err﹕ at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
 08-01 07:38:24.708    2159-2159/? W/System.err﹕ at com.dandewine.user.tocleveroad.adapters.ResultsImageAdapter.saveToExternal(ResultsImageAdapter.java:174)
08-01 07:38:24.708    2159-2159/? W/System.err﹕ at com.dandewine.user.tocleveroad.adapters.ResultsImageAdapter.access$500(ResultsImageAdapter.java:45)
08-01 07:38:24.708    2159-2159/? W/System.err﹕ at com.dandewine.user.tocleveroad.adapters.ResultsImageAdapter$3.onLoadingComplete(ResultsImageAdapter.java:127)
08-01 07:38:24.708    2159-2159/? W/System.err﹕ at com.nostra13.universalimageloader.core.DisplayBitmapTask.run(DisplayBitmapTask.java:72)
08-01 07:38:24.708    2159-2159/? W/System.err﹕ at android.os.Handler.handleCallback(Handler.java:615)
08-01 07:38:24.708    2159-2159/? W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:92)
08-01 07:38:24.708    2159-2159/? W/System.err﹕ at android.os.Looper.loop(Looper.java:137)
08-01 07:38:24.708    2159-2159/? W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:4745)
08-01 07:38:24.708    2159-2159/? W/System.err﹕ at java.lang.reflect.Method.invokeNative(Native Method)
08-01 07:38:24.708    2159-2159/? W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:511)
08-01 07:38:24.708    2159-2159/? W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-01 07:38:24.708    2159-2159/? W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-01 07:38:24.708    2159-2159/? W/System.err﹕ at dalvik.system.NativeStart.main(Native Method)
08-01 07:38:24.708    2159-2159/? W/System.err﹕ Caused by: libcore.io.ErrnoException: open failed: EINVAL (Invalid argument)
08-01 07:38:24.708    2159-2159/? W/System.err﹕ at libcore.io.Posix.open(Native Method)
08-01 07:38:24.708    2159-2159/? W/System.err﹕ at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
08-01 07:38:24.708    2159-2159/? W/System.err﹕ at libcore.io.IoBridge.open(IoBridge.java:400)
08-01 07:38:24.708    2159-2159/? W/System.err﹕ ... 15 more

此行FileOutputStream out = new FileOutputStream(checkFile);上触发了异常 如何正确保存文件到SD?

2 个答案:

答案 0 :(得分:2)

检查文件路径!你的角色无效。

/mnt/sdcard/Android/data/com.dandewine.user.tocleveroad/files/Pictures/milk | The Balanced Blonde.png

|(竖线字符)无效!

答案 1 :(得分:1)

milk | The Balanced Blonde.png

不是一个很好的文件名。它包含|,其中包含其他职责(pipe)。可能是较新版本的Android正确处理了这一点,但最好不要在文件名中使用它。