Cha*_*ake 19 file-io android ioexception
这是我的代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
问题解决了:
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
Run Code Online (Sandbox Code Playgroud)
Dav*_*ser 39
该字符串url包含文件名的非法字符.您需要通过删除非法字符来清理文件名.
确实很棘手的错误,因为 Android 28 在尝试使用 ? 写入文件名时工作得很好。或 : 的名称,但 Android 22 会崩溃。只需在文件名中运行几个替换,例如:
File(filename.replace(":", "").replace("?", "") [...])
Run Code Online (Sandbox Code Playgroud)
然后你就可以跑步了
file.createNewFile()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20004 次 |
| 最近记录: |