如何在Android应用程序文件夹中保存位图

4

我有一个位图,我想将它保存到应用程序文件夹。我尝试使用以下代码:

 ContextWrapper contextWrapper = new ContextWrapper(context.getApplicationContext());
 File directory = contextWrapper.getDir("tabs", Context.MODE_PRIVATE);
 if (!directory.exists())
     directory.mkdir();
     String fname = "Image.jpg";
     File file = new File(directory, fname);
     FileOutputStream fos = null;
     try {
         fos = new FileOutputStream(file);
         bitmap.compress(Bitmap.CompressFormat.JPEG, 50, fos);
         fos.close();
     } catch (Exception e) {
            Log.e("SAVE_IMAGE", e.getMessage(), e);
     }

现在,我有两个问题。

  1. 为什么会出现这个警告并如何修复它?

'File.mkdir()'的结果被忽略了

  1. 文件夹“app_tabs”已创建在应用程序文件夹中,但未保存位图,并且文件夹中没有照片。如何保存此位图?

屏幕截图


为什么会显示这个警告?是哪一个警告? - blackapps
你如何检查文件是否存在? - blackapps
被忽略了?为什么呢?被忽略意味着代码写得很糟糕。 - blackapps
@MuhamedEl-Banna 在清单文件中,我添加了_READ-EXTERNAL-STORAGE_和_WRITE-EXTERNAL-STORAGE_权限。 - Marlen Schreiner
我会发布如何创建目录的答案.. 试一下吧。 - Muhamed El-Banna
显示剩余4条评论
4个回答

5
你可以这样做:
try {
     FileOutputStream fileOutputStream = context.openFileOutput("Your File Name", Context.MODE_PRIVATE);
     bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
     fileOutputStream.close();
 } catch (Exception e) {
     e.printStackTrace();
 }

它将您的位图保存在应用文件夹中的“files”目录中。


谢谢!它起作用了并保存了我的图像。但是,如何将其保存到另一个文件夹中? - Marlen Schreiner
1
我检查了你的代码,我认为是正确的。正如fujian26所说,你需要点击“同步”菜单。 - Sajjad javadi
保存的 Bitmap 的路径是什么?如何获取它? - Nadim Ansari

1
 String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString() + "/tabs";
        File dir = new File(path);
        if (!dir.exists())
            dir.mkdirs();

        File futureStudioIconFile = new File(path, "Image.jpg);
        if (futureStudioIconFile.exists())
            futureStudioIconFile.delete();
        futureStudioIconFile.createNewFile();

try this ,, i wish it helps


谢谢您的时间,但我想将我的位图保存在应用程序文件夹目录中,而不是下载文件夹中。我的问题不是创建目录,我已经能够创建目录。我无法将位图保存在根文件(应用程序文件夹)中创建的文件夹中。 - Marlen Schreiner
你非常受欢迎。我仍在努力寻找答案......你正在使用 context 来获取 getApplicationContext..为什么?我认为你需要删除 context 并再次尝试。 - Muhamed El-Banna
contextWrapper.getDir()方法会在文件夹不存在时创建一个新文件夹,因此调用mkdir()方法是多余的。这就是为什么会出现"File.mkdir()的结果被忽略"的情况。 - Muhamed El-Banna

1

从技术上讲,您的代码是正确的,我也在自己的设备上尝试过,一切都正确。

所以我怀疑您找到了另一条路径,或者您需要点击“同步”菜单(如果您使用Android Studio来检查文件)。

顺便说一下,您可以只使用context或context.getApplicationContext()来调用getDir(),不需要新建一个ContextWrapper。就像这样:

File directory = context.getDir("tabs", Context.MODE_PRIVATE);

0

这是我的答案

  1. File.mkdir()的结果被忽略:因为mkdir()返回一个布尔值,如果文件夹创建成功则返回true,否则返回false

  2. 这是我保存位图的方法

        File storageDir = getFilesDir();

        File filePath = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );


        try (FileOutputStream out = new FileOutputStream(filePath)) {
            capturedImg.compress(Bitmap.CompressFormat.JPEG, quality, out);
        } catch (IOException e) {
            e.printStackTrace();
        }

或者,如果您只想以原始分辨率保存位图

    public static void copy(Uri uri, File dst, Context context) {
        try (InputStream in = context.getContentResolver().openInputStream(uri);
             OutputStream out = new FileOutputStream(dst)) {
            // Transfer bytes from in to out
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

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