我尝试将文件保存到外部存储器,它可以工作(在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?
答案 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正确处理了这一点,但最好不要在文件名中使用它。