在相机意图中显示叠加层

Posted

技术标签:

【中文标题】在相机意图中显示叠加层【英文标题】:Displaying overlay in camera intent 【发布时间】:2021-08-24 12:16:35 【问题描述】:

用户可以使用 ACTION_IMAGE_CAPTURE 意图通过单击按钮来打开默认摄像头。

有没有办法在使用默认相机时显示叠加层? 例如一个带有文本的矩形框,在屏幕的右下角,这样用户就知道图片的哪个部分应该在这个位置。

这是我的相机意图:

fun cameraIntent(context: Context): Intent 
    val timeStamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(Date())
    val imageFileName = "IMG_" + timeStamp + "_"
    val storageDir = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)
    val filephoto = File.createTempFile(
        imageFileName, /* prefix */
        ".jpg", /* suffix */
        storageDir      /* directory */
    )
    imageURI = FileProvider.getUriForFile(context, "com.example.nlp_expense_tracker.fileprovider", filephoto)
    val pictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    pictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageURI)
    return pictureIntent
   

【问题讨论】:

【参考方案1】:

有没有办法在使用默认相机时显示叠加层?

不是真的。除了基本的技术挑战之外,用户可能最终会使用数百个相机应用程序。您无法知道您的叠加层是否与相机应用程序的设置方式冲突(例如,您的框会阻止用户拍照)。

例如一个带有文本的矩形框,位于屏幕的右下角,因此用户知道图片的哪个部分应该在这个位置。

也许您应该使用 CameraX 或 another camera library 并直接在您的应用中拍照。然后,您可以更好地控制用户界面,包括显示您建议的消息。

【讨论】:

是的,我担心这将是答案,因为如果我还想使用 ML-Kit 文本识别,使用 camerax 似乎更复杂,但我想这就是我必须要做的做,谢谢! @dkiwikid:“如果我还想使用 ML-Kit 文本识别,使用 camerax 似乎更复杂”——如果有的话,我希望从长远来看它会更容易。请理解,这数百个相机应用程序非常有问题。因此,例如,您可能无法将照片保存在您在EXTRA_OUTPUT 中请求的位置。 由于我已经构建了应用程序并且它可以工作,我总是害怕改变东西,因为我对编程也很陌生,但我想我必须用相机 x 来做。但是我是否正确理解你使用camerax获得的视图总是在你调用camerax API的活动或片段上?因此,我必须创建一个新片段(或者对于相机而言,Acitivity 是否更好?),当我单击“拍照”按钮时会打开? @dkiwikid:“所以我必须创建一个新片段...当我单击“拍照”按钮时会打开?” -- 是的,很有可能。【参考方案2】:

这是可能的。我大约一年前做过这个。我使用这个存储库作为我的指南。

https://github.com/googlesamples/mlkit/tree/master/android/vision-quickstart/app/src/main/java/com/google/mlkit/vision/demo

如果你查看这个 repo 中的类,你就会明白。我还找不到自己的代码。但这并不容易。我认为使用 CameraX 可能是更简单的解决方案。

【讨论】:

以上是关于在相机意图中显示叠加层的主要内容,如果未能解决你的问题,请参考以下文章

带有 flex 移动设备的相机叠加层

Android 中的电容器相机预览上方未显示叠加层(Vue js + Ionic)

在相机视图中保存带有叠加层的图像

使用动画 UIImageView 作为 iPhone 相机覆盖

在 applozic 中自定义相机叠加层

Flutter 相机叠加层