gpt4 book ai didi

android - 将位图写入外部存储(sdcard)

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:03:45 28 4
gpt4 key购买 nike

我正在尝试将我在某些 Activity 中拥有的位图保存到我为此目的创建的目录中的外部存储。将图像保存到 sdcard(外部存储器,而不是外部 sd)的方法在不同的类(和不同的包)中,所以我假设我需要上下文,但我找不到任何地方来提供上下文(试过 openFileOutput 但它得到 String fileName 不能包含路径分隔符)。当我运行我的代码时,我在日志 cat 中收到此错误:

04-11 22:13:14.899: E/error(13833): /mnt/sdcard/myTomatoes/covers/378194.PNG: open                  failed: ENOENT (No such file or directory)
04-11 22:13:14.899: W/System.err(13833): java.io.FileNotFoundException: /mnt/sdcard/myTomatoes/covers/378194.PNG: open failed: ENOENT (No such file or directory)
04-11 22:13:14.899: W/System.err(13833): at libcore.io.IoBridge.open(IoBridge.java:416)
04-11 22:13:14.899: W/System.err(13833): at java.io.FileOutputStream.<init>(FileOutputStream.java:88)
04-11 22:13:14.899: W/System.err(13833): at java.io.FileOutputStream.<init>(FileOutputStream.java:73)
04-11 22:13:14.899: W/System.err(13833): at BL.ImageMethods.SaveImageToMemory(ImageMethods.java:60)
04-11 22:13:14.899: W/System.err(13833): at com.example.mytomatoes.MovieDetailsActivity$4.onClick(MovieDetailsActivity.java:337)
04-11 22:13:14.899: W/System.err(13833): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
04-11 22:13:14.899: W/System.err(13833): at android.os.Handler.dispatchMessage(Handler.java:99)
04-11 22:13:14.899: W/System.err(13833): at android.os.Looper.loop(Looper.java:137)
04-11 22:13:14.899: W/System.err(13833): at android.app.ActivityThread.main(ActivityThread.java:5039)
04-11 22:13:14.899: W/System.err(13833): at java.lang.reflect.Method.invokeNative(Native Method)
04-11 22:13:14.899: W/System.err(13833): at java.lang.reflect.Method.invoke(Method.java:511)
04-11 22:13:14.899: W/System.err(13833): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-11 22:13:14.899: W/System.err(13833): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-11 22:13:14.899: W/System.err(13833): at dalvik.system.NativeStart.main(Native Method)
04-11 22:13:14.899: W/System.err(13833): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
04-11 22:13:14.899: W/System.err(13833): at libcore.io.Posix.open(Native Method)
04-11 22:13:14.899: W/System.err(13833): at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
04-11 22:13:14.899: W/System.err(13833): at libcore.io.IoBridge.open(IoBridge.java:400)

这些是我的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

这是我保存文件的方法:

public static void SaveImageToMemory(Context context, Bitmap img, int rottenId) {
Log.i("SAVE IMAGE", "start save");
File sd = Environment.getExternalStorageDirectory();
File location = new File(sd.getAbsolutePath()+ "/myTomatoes/covers");
location.mkdir();
File dest = new File(location, rottenId + ".PNG");

try {
Log.i("SAVE IMAGE", "trying to save: " + dest.getPath());
FileOutputStream fos = new FileOutputStream(dest);

img.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
} catch (IOException e) {
Log.e("error", e.getMessage());
e.printStackTrace();
}
}

所有用于创建 File 对象的困惑行都是我尝试的结果......原始代码是:

    File location = new File(Environment.getExternalStorageDirectory() + "/myTomatoes/covers");
File dest = new File(location, rottenId + ".PNG");

我还尝试先创建 ByteArrayOutputStream 并将位图压缩到它,然后执行 fos.write(mByteArrayOpStream.toByteArray()) 但它没有用。

顺便说一下,我使用的是模拟器,但我也在几个“Galaxy S”上检查过,同样的错误发生了……(当我尝试在手机或 DDMS 中浏览文件时,我可以看到它甚至不创建文件夹...

最佳答案

从您的问题描述来看,您似乎甚至无法创建文件夹。所以请确保以下几点

  • SD 卡状态(已安装且可写入)适合创建文件夹。用这个link
  • 目录已创建

    如果 (!file.isExist())boolean created=file.mkdir();

稍后您可以通过测试 bool 值来检查您的文件夹是否已创建。如果您的文件夹未创建,则没有理由进一步使用您的代码。

  • 存在父文件夹。

或者,您可以使用 mkdirs(),它将创建所有必要的父目录。

关于android - 将位图写入外部存储(sdcard),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15960173/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com