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

时间:2017-11-09 22:28:46

标签: android android-camera android-camera-intent mediastore

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

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

我的应用程序属于休闲类型,因此用户通常会启动相机拍摄漂亮的风景,自拍等。 我现在有很多用户投诉他们已经丢失了他们认为已经拍摄的照片,因为他们期望系统后退按钮在相机应用程序中如何工作。

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

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

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

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

如果我按下勾号,我的图像就会保存得很好,但如果我是熟悉相机应用程序的用户,我的本能就是在我拍完照片后再按系统退出相机,认为它已经被保存了。

当我启动intent时,我将缓存目录中的临时文件URI作为EXTRA_OUTPUT参数传递:

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

目前,当我处理结果时,如果结果是OK,我将文件从临时位置复制到图库位置,如果结果被取消(即用户按下系统后退按钮),我会显示一个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)时,由于临时文件没有,FileNotFound导致copyImageFile()例外由ACTION_IMAGE_CAPTURE意图撰写。

1 个答案:

答案 0 :(得分:1)

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

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