问题描述
我正在开展一个项目,我正在使用相机意图为用户拍照。该代码是典型的,我创建了一个意图并为其提供了输出文件的 URI,然后在 onActivityResult 中,我将图像保存在给定的 uri 中,因此简化的代码如下所示:
Uri outputFileURI; //<-- this is where the output picture should be
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,outputFileURI);
startActivityForResult(takePictureIntent,MY_CAMERA_REQUEST_CODE);
然后,
@Override
public void onActivityResult(int requestCode,int resultCode,Intent data) {
if (requestCode == MY_CAMERA_REQUEST_CODE && resultCode == RESULT_OK) {
outputFileURI; // <-- the image is saved in this uri by the camera
// do something with the uri
}
如果我们使用手机的默认相机应用,这会很好地工作。
问题
如果用户选择了不同的相机应用(在本例中,用户选择了 PicsArt 应用),这将不起作用。即,picsArt 应用程序未将图像保存在 uri 中。用户可以选择任意相机应用程序,那么解决此问题的正确方法是什么?是否可以限制用户仅使用默认的相机应用程序?或者我应该使用 CameraX 或类似的东西吗?
解决方法
如果我们使用手机的默认相机应用程序,这很有效
它可能适用于您在现有的数万种设备模型中测试过的少数设备。预装的相机应用与第三方应用一样有可能存在错误,而且多年来,plenty of pre-installed camera apps have had bugs,包括您为 PicsArt 引用的应用。
如果用户选择了不同的相机应用(在这种情况下,用户选择的是 PicsArt 应用),这将不起作用。即,picsArt 应用程序未将图像保存在 uri 中
向 PicsArt 提交错误。但是,同样,不要假设“默认相机应用程序”意味着“始终有效”,也不要假设“不同的相机应用程序”意味着“永远无法使用”。
那么解决这个问题的正确方法是什么?
这很可能是您的经理的问题。基本上,您有两个主要选择:
-
告诉用户“抱歉,您使用的相机应用与其他应用无法很好地配合使用 — 请考虑尝试 X”,其中 X 是您测试过的某个相机应用的名称,并认为它很可能要可靠。例如,我倾向于使用 Open Camera 作为我的参考应用。
-
不要依赖
ACTION_IMAGE_CAPTURE
,而是直接从您的应用中拍摄照片,例如您提到的使用 CameraX。从好的方面来说,您可以完全控制。不利的一面是,这需要做更多的工作,而且相机硬件兼容性也带来了一系列令人头疼的问题。
就我个人而言,我对两者之间的建议归结为您的应用能够拍照的重要性。如果应用程序没有这些照片就无法使用,请直接从您的应用程序中拍摄照片,并为初始开发和持续维护预算工程和 QA 时间。如果该应用可以在没有照片的情况下使用,我会继续使用 ACTION_IMAGE_CAPTURE
,如果用户选择的相机应用无法正常运行,我会“优雅地降级”。