按下系统后退按钮时,是否可以保存使用 ACTION_IMAGE_CAPTURE 意图拍摄的图像?

Can an image taken with ACTION_IMAGE_CAPTURE intent be saved when system back button is pressed?

我在我的应用程序中使用 MediaStore.ACTION_IMAGE_CAPTURE 意图来启动相机并保存捕获的图像。

我的问题是:是否有可能以某种方式存储在该相机意图中捕获的图像数据,即使用户在拍照后按下系统后退按钮?

我的应用属于休闲类型,所以用户通常会启动相机来拍摄美丽的风景、自拍等。 我现在收到了很多用户的投诉,称他们丢失了自认为拍摄的照片,因为他们对系统后退按钮在相机应用程序中的工作方式抱有期望。

例如,在我的 Nexus 6P 上,如果我启动相机应用程序,它看起来像这样:

每次我按下快门按钮时,照片都会保存到图库中。我按下系统键,相机应用程序退出。

当我从我的应用启动 MediaStore.ACTION_IMAGE_CAPTURE 意图时,它看起来像这样:

几乎与相机应用程序相同。但是当我按下快门按钮时,照片没有保存:相反,我看到了这个插页式广告:

如果我按下勾号,很好,我的图像已保存,但如果我是熟悉相机应用程序的用户,我的直觉是在拍完照片后按回系统退出相机,以为已经保存了

当我启动意图时,我在缓存目录中传递一个临时文件 URI 作为 EXTRA_OUTPUT 参数:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, this.temporaryFileURI);

目前,当我处理结果时,如果结果正常,我将文件从临时位置复制到图库位置,如果结果被取消(即用户按下系统后退按钮),我会显示一个toast 指示相机操作已取消。

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (resultCode == Activity.RESULT_OK) {
        copyImageFile(this.temporaryFileURI, galleryUri);
    }else if(resultCode == Activity.RESULT_CANCELED){
        this.fail("Camera cancelled.");
    }else {
        this.fail("A problem occurred while taking the photo.");
    }
}

我想做的是更改此设置,以便无论是否按下后退按钮都会复制临时文件:

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (resultCode == Activity.RESULT_OK || resultCode == Activity.RESULT_CANCELED) {
        copyImageFile(this.temporaryFileURI, galleryUri);
    }else {
        this.fail("A problem occurred while taking the photo.");
    }
}

但是,当按下快门按钮拍照后按下后退按钮时 (resultCode == Activity.RESULT_CANCELED),这会导致 copyImageFile() 中出现 FileNotFound 异常,原因是暂时的ACTION_IMAGE_CAPTURE 意图未写入文件。

遗憾的是,当您向外部应用程序启动意图时,您将失去所有控制权,并且无​​法更改其行为。 当用户从该意图按下后退按钮时,它将 return 到您的应用程序,但您将获得 Activity.RESULT_CANCELED 而没有您已经检查过的其他信息。

您唯一的选择是创建自己的相机 activity 而不是使用 MediaStore.ACTION_IMAGE_CAPTURE 一个