将位图写入外部存储(SD卡)

4

我正在尝试将某个活动中的位图保存到我创建的目录中,以便在外部存储设备上使用。将图像保存到SD卡(外部存储器,而不是外置SD卡)的方法在不同的类(和不同的包)中,所以我假设我需要上下文,但我找不到任何地方提供上下文(尝试了openFileOutput,但它只能接受不包含路径分隔符的字符串文件名)。当我运行代码时,在日志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,将Bitmap压缩到其中,然后执行fos.write(mByteArrayOpStream.toByteArray()),但并没有起作用。

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

4个回答

2
从你的问题描述中,似乎你甚至无法创建文件夹。所以请确保以下几点:
  • SD卡状态(可挂载且可写)良好,用这个链接来创建文件夹。
  • 如果 (!file.isExist()) boolean created=file.mkdir(); 则目录已经被创建。

接下来,你可以通过测试布尔值来检查是否已经创建了文件夹。如果你的文件夹尚未被创建,则没有理由继续进行代码编写。

  • 父文件夹存在。

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


谢谢,它帮了我很大的忙!我所需要做的就是调用 mkdirs() 而不是 mkdir(),然后就可以正常工作了!甚至不需要将 Bitmap 压缩到 ByteArrayOutputStream,再将其写入文件,我只是将其压缩到 fos 中即可... - Aviel Gross

1

try this code:

File newD = new File(Environment.getExternalStorageDirectory()
                            + File.separator +"myTomatoes"+ File.separator + "covers");
   if(!newD.exists()){
        newD.mkdirs();
    }

ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    _bitmapScaled.compress(Bitmap.CompressFormat.JPEG, 40, bytes);

    //you can create a new file name "test.jpg" in sdcard folder.
    File f = new File( newD + File.separator + "test.jpg")
    f.createNewFile();
    //write the bytes in file
    FileOutputStream fo = new FileOutputStream(f);
    fo.write(bytes.toByteArray());

    // remember close de FileOutput
    fo.close();

这是来自此代码的日志记录: 04-12 08:49:24.645:D / dalvikvm(29584):GC_CONCURRENT释放了5377K,26%空闲6915K / 9288K,暂停12ms + 1ms,总计16ms 04-12 08:49:24.654:W / System.err(29584):java.io.IOException:打开失败:ENOENT(没有这样的文件或目录) 04-12 08:49:24.654:W / System.err(29584):在java.io.File.createNewFile(File.java:948)中创建新文件 - Aviel Gross

0
希望这可以帮助您从Android应用程序中将图像存储在缓存目录中,并在另一个活动中显示该图像。

Oneactivity.java

将图像存储在缓存目录中

 File file = new File(getCacheDir(), "thursday.png");
                        try {
                            OutputStream output;
                            output = new FileOutputStream(file);
                            bm.compress(Bitmap.CompressFormat.PNG, 100, output);
                            output.flush();
                            output.close();
                        }
                        catch (Exception e) {
                            e.printStackTrace();
                        }

从缓存目录获取图像。

BitMap bmp5;

     try {

                            File myFile = new File(getCacheDir()+"/thursday.png");
                            bmp5 = BitmapFactory.decodeFile(myFile.toString());
                            System.out.println("am setting wallpaper");
                            myWallpaperManager.setBitmap(bmp5);

                        } catch (IOException e) {

                            e.printStackTrace();
                        }

0

看看这个:

if (android.os.Environment.getExternalStorageState().equals(
        android.os.Environment.MEDIA_MOUNTED))
{
    File sdCard = Environment.getExternalStorageDirectory();
    File dir = new File(sdCard.getAbsolutePath() + "/Pictures");
    dir.mkdirs();
    File file = new File(dir, filename);
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
    FileOutputStream f = null;
    f = new FileOutputStream(file);

    if (f != null) {
        f.write(baos.toByteArray());
        f.flush();
        f.close();
    }
}

}

或者点击此链接:http://android-er.blogspot.in/2010/07/save-file-to-sd-card.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接