将位图从片段保存到内部/外部存储[关闭]

Posted

技术标签:

【中文标题】将位图从片段保存到内部/外部存储[关闭]【英文标题】:Saving bitmap from fragment to internal/external storage [closed] 【发布时间】:2015-01-26 17:00:34 【问题描述】:

在将位图从片段保存到内部/外部存储时遇到以下异常

11-28 12:09:18.667: W/System.err(2620): java.io.FileNotFoundException: /storage/sdcard0/req_images/Image-296.jpg: open failed: ENOENT (No such file or directory)
    11-28 12:09:18.717: W/System.err(2620):     at libcore.io.IoBridge.open(IoBridge.java:427)
    11-28 12:09:18.717: W/System.err(2620):     at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
    11-28 12:09:18.717: W/System.err(2620):     at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
    11-28 12:09:18.717: W/System.err(2620):     at com.example.multipletab5.AnswerFragment.saveimage(AnswerFragment.java:133)
    11-28 12:09:18.717: W/System.err(2620):     at com.example.multipletab5.AnswerFragment.access$0(AnswerFragment.java:112)
    11-28 12:09:18.717: W/System.err(2620):     at com.example.multipletab5.AnswerFragment$2.onClick(AnswerFragment.java:81)
    11-28 12:09:18.717: W/System.err(2620):     at android.view.View.performClick(View.java:4147)
    11-28 12:09:18.717: W/System.err(2620):     at android.view.View$PerformClick.run(View.java:17161)
    11-28 12:09:18.717: W/System.err(2620):     at android.os.Handler.handleCallback(Handler.java:615)
    11-28 12:09:18.717: W/System.err(2620):     at android.os.Handler.dispatchMessage(Handler.java:92)
    11-28 12:09:18.717: W/System.err(2620):     at android.os.Looper.loop(Looper.java:213)
    11-28 12:09:18.717: W/System.err(2620):     at android.app.ActivityThread.main(ActivityThread.java:4787)
    11-28 12:09:18.717: W/System.err(2620):     at java.lang.reflect.Method.invokeNative(Native Method)
    11-28 12:09:18.717: W/System.err(2620):     at java.lang.reflect.Method.invoke(Method.java:511)
    11-28 12:09:18.717: W/System.err(2620):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
    11-28 12:09:18.717: W/System.err(2620):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
    11-28 12:09:18.717: W/System.err(2620):     at dalvik.system.NativeStart.main(Native Method)
    11-28 12:09:18.727: W/System.err(2620): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
    11-28 12:09:18.727: W/System.err(2620):     at libcore.io.Posix.open(Native Method)
    11-28 12:09:18.727: W/System.err(2620):     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
    11-28 12:09:18.727: W/System.err(2620):     at libcore.io.IoBridge.open(IoBridge.java:411)
    11-28 12:09:18.727: W/System.err(2620):     ... 16 more

我的目标是将我的片段中的绘图保存到我的 android 设备。我一直在尝试在 Activity 类中使​​用相同的方法并且它有效。但是,当我尝试在 fragment 类 中使用它时,它不起作用。

应用程序没有崩溃,它只是显示此错误日志。

代码如下:

View content = v;
content.setDrawingCacheEnabled(true);
bitmap = content.getDrawingCache();
File file;

String root = Environment.getExternalStorageDirectory().toString();
File myDir = new File(root + "/req_images");
myDir.mkdirs();

Random generator = new Random();
int n = 10000;
n = generator.nextInt(n);
String fname = "Image-" + n + ".jpg";
file = new File(myDir, fname);
//Log.i(TAG, "" + file);

if (file.exists())
    file.delete();

try 
    FileOutputStream out = new FileOutputStream(file);
    bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
    out.flush();
    out.close();
 catch (Exception e) 
    e.printStackTrace();

【问题讨论】:

可能是您缺少读取外部存储权限或 /storage/sdcard0/req_images/Image-296.jpg 文件丢失 看看这篇文章:***.com/questions/11620641/… 【参考方案1】:

我认为您在创建文件后已经删除了该文件,然后您尝试将不存在的文件转换为无效的位图。这就是为什么你得到一个错误没有找到这样的文件或目录。

只需从您的代码中删除行 file.delete(); 并尝试一下。

【讨论】:

非常感谢您的回答...我终于没有收到任何错误..但是我在图库和文件管理器中都找不到图片.. @Azharan 您已经从您的位图对象再次创建新文件并将其保存到 sdcard 中,然后只有您能够获取它。 @Azharan 如果对您有帮助,请将答案标记为正确。 :) 确保您已在清单文件中授予写入外部存储权限。 非常感谢您提供帮助。实际上问题出在外部存储权限上。我一开始没有启用它。但是,我仍然需要 file.delete(); 因为如果没有,只会创建文件夹,但其中没有图像。再次非常感谢@GrlsHu【参考方案2】:

代替

   myDir.mkdirs();

使用

file.mkdirs();

mkdirs 只创建父目录,所以在文件而不是目录上使用它。

编辑:然后也可以添加这个

file.createNewFile();

【讨论】:

我试过了.. 但它似乎出现了同样的问题。谢谢 还是解决不了问题

以上是关于将位图从片段保存到内部/外部存储[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Android 将位图保存到 SD 卡

如何将位图添加到电话库?

将框架布局转换为图像并保存[关闭]

将文件从内部存储复制到Android中的外部存储

如何将位图保存在从 Internet 下载的内部存储中

从 JSON url 下载图像不起作用。 [关闭]