【问题标题】:How to properly handle camera intent in android if the user chooses some random camera app?如果用户选择一些随机的相机应用程序,如何正确处理 android 中的相机意图?
【发布时间】:2021-04-01 12:10:46
【问题描述】:

我正在开展一个项目,我正在使用相机意图为用户拍照。代码是典型的,我创建了一个意图并给它输出文件的 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 或类似的东西?

【问题讨论】:

  • the picsArt app is not saving the image in the uri. 但它是否将其保存在文件中的某个位置?请调查。
  • 还调查接收到的意图中的整套捆绑包。看看它提供了哪些信息。如果幸运的话 data.getData() 是 uri。
  • 是的,如果我打开手机的默认图库,它会显示照片。照片保存在 picsArt 的内部存储中。感谢您的建议,我会检查data.getData()

标签: java android kotlin camera android-camera-intent


【解决方案1】:

如果我们使用手机的默认相机应用,这会很好地工作

它可能适用于您在数以万计的现有设备模型中测试过的少数设备。预装的相机应用程序与第三方应用程序一样可能存在错误,多年来,plenty of pre-installed camera apps have had bugs,包括您为 PicsArt 引用的那些。

如果用户选择不同的相机应用程序(在这种情况下,用户选择 PicsArt 应用程序),这将不起作用。即,picsArt 应用程序没有将图像保存在 uri 中

使用 PicsArt 提交错误。但是,同样,不要假设“默认相机应用”意味着“总是有效”,也不要假设“不同的相机应用”意味着“永远无法工作”。

那么解决这个问题的正确方法是什么?

这很可能是你的经理的问题。基本上,您有两个主要选择:

  1. 告诉用户“抱歉,您使用的相机应用无法与其他应用很好地配合使用 - 请考虑尝试 X”,其中 X 是您已测试并认为可能可靠的某个相机应用的名称.例如,我倾向于使用 Open Camera 作为我的参考应用。

  2. 不要依赖ACTION_IMAGE_CAPTURE,而是直接从您的应用中拍照,例如使用您提到的 CameraX。从好的方面来说,您可以完全控制。不利的一面是,这需要更多的工作,而且相机硬件兼容性也带来了一系列令人头疼的问题。

就个人而言,我对两者的建议归结为您的应用能够拍照的重要性。如果没有这些照片,应用程序毫无用处,请直接从您的应用程序中获取照片,并为初始开发和持续维护预算工程和 QA 时间。如果该应用可以在没有照片的情况下使用,我会继续使用ACTION_IMAGE_CAPTURE,如果用户选择的相机应用不能正常工作,我会“优雅地降级”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多