按下系统后退按钮时,是否可以保存使用 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
一个
我在我的应用程序中使用 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
一个