我在我的应用中使用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
意图撰写。
答案 0 :(得分:1)
可悲的是,当您向外部应用启动意图时,您将失去所有控制权,并且无法改变其行为。
当用户按下该意图的后退按钮时,它将返回到您的应用,但您将获得Activity.RESULT_CANCELED
而没有其他已经检查过的信息。
您唯一的选择是创建自己的相机活动,而不是使用MediaStore.ACTION_IMAGE_CAPTURE
一个