为什么相机意图会自动保存图像到磁盘?

5

我正在使用Android基础教程中的相机意图,该教程提供了简单易懂的指导。在这个章节中,它讲到如何将图像文件保存到磁盘上。但是,在我还没有配置这些步骤之前,当我拍摄完图片并返回到我的活动界面时,它仍然自动将我的图像保存到磁盘上的/storage/emulated/0/DCIM/Camera目录下。这似乎并不是教程所暗示的行为——我甚至没有在清单文件中添加WRITE_EXTERNAL_STORAGE权限,因此我不知道为什么它被允许写入磁盘。我不希望图像自动保存到该目录,而是希望它保存到我选择的目录中。我知道如何将图像保存到自定义目录,但是我该如何防止默认行为将图像保存到以上目录呢?


遇到同样的问题。你找到解决方案了吗? - Ankur Raiyani
1
基本上没有“解决方案”,因为Android似乎早就想要这样的操作。当我们使用本教程中的代码时,实际上只是利用了设备上的原始相机应用程序。由于我们无法控制此应用程序,因此无法阻止其默认行为,即将照片保存到此目录中。你可以尝试像其他回答中所描述的那样同时保存到自定义目录,或者尝试实现自定义相机,这无疑是复杂的。 - ethan123
请查看我为同样的问题得到的回复: https://stackoverflow.com/a/57660942/9242141 - Ziad H.
4个回答

1
当你尝试拍照时,实际上是在启动设备中安装的Camera应用程序。你没有设置WRITE_EXTERNAL_STORAGE,但是Camera应用程序已经设置了。当你尝试拍照,并想将照片存储到你的文件中时,可以尝试这样做:
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT,
                Uri.fromFile(AVATAR_FILE_TMP));
intent.putExtra("outputFormat",
                Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
startActivityForResult(intent, TAKING_PICTURE_INDEX);

filePath 是使用 Camera 拍摄照片时的图像文件路径。拍照需要使用 Camera 应用程序。


如果我理解正确的话,对我来说发生的情况是新目录已经创建了,但是图像文件没有正确写入。Dinesh的提示对于将图像文件写入目录起作用,但无法防止文件也被写入原始目录。 - ethan123
很酷,谢谢,但仍然没有得到期望的效果。这其中哪一部分实际上阻止了相机应用程序写入其自己的文件夹?另外,“noFaceDetection”是什么意思?我的期望行为是只将文件写入我指定的位置,而不是默认的存储/模拟/0/DCIM/Camera文件夹。这可能吗? - ethan123
那么你就不需要设置outputFormatnoFaceDetection - SilentKnight

0
如果您使用以下代码,它将不会保存默认的相机胶卷。
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, receiptUri);
startActivityForResult(takePictureIntent, 1);

但是您需要在清单文件中具有写入权限。


3
嘿,Dinesh,用这段代码仍然会保存到默认的相机文件夹,但也会同时被写入我的自定义文件夹。有没有办法防止它写入默认文件夹,只写入我的自定义文件夹? - ethan123

0

如果有,请注释此行

MediaStore.Images.Media.insertImage(getContentResolver(),file.getAbsolutePath(),file.getName(),file.getName());

0
这里有一个方法,可以在您的SD卡上的“图片”文件夹中创建一个以您的应用程序名称命名的文件夹。您可以更改它以反映您的需求。
    // Create a File for saving an image or video
    private static File getOutputMediaFile(int type){
        // To be safe, you should check that the SDCard is mounted
        // using Environment.getExternalStorageState() before doing this.

        File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                  Environment.DIRECTORY_PICTURES), "MyAppDirectory");
        // This location works best if you want the created images to be shared
        // between applications and persist after your app has been uninstalled.

        // Create the storage directory if it does not exist
        if (! mediaStorageDir.exists()){
            if (! mediaStorageDir.mkdirs()){
                Log.d("MyAppDirectory", "failed to create directory");
                return null;
            }
        }
            // Create a media file name
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            File mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                "IMG_"+ timeStamp + ".jpg");

            return mediaFile;
}

当你需要时,可以调用此方法:

        File file = getOutputMediaFile(MEDIA_TYPE_IMAGE);

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