本文介绍: Snapchat 团队希望针对不断扩大的 Android 设备选择优化应用程序,因为他们知道许多 OEM 厂商通过各自的相机技术来区分其设备。由于 Snapchat 是一款主要与设备相机配合使用视觉应用程序,因此团队优化了该应用程序,以充分利用每个设备的独特硬件。“我们希望利用每个 OEM 的软件来增强 Android 上的 Snapchat 体验,”Snapchat软件工程师 Ye Tian 说道。“这将有助于该应用程序获得与设备本机相机提供的质量相当的更高质量快照

应用举例(可以不看这一part,直接跳过看具体怎么做):

Snapchat 通过 Camera2 Extensions API 将新相机功能集成速度提高了 50%**

在这里插入图片描述

Camera2 扩展 API 可以访问高级功能

Snapchat 团队希望针对不断扩大的 Android 设备选择优化应用程序,因为他们知道许多 OEM 厂商都通过各自的相机技术来区分其设备。由于 Snapchat 是一款主要与设备相机配合使用视觉应用程序,因此团队优化了该应用程序,以充分利用每个设备的独特硬件

我们希望利用每个 OEM 的软件来增强 Android 上的 Snapchat 体验,”Snapchat软件工程师 Ye Tian 说道。“这将有助于该应用程序获得与设备本机相机提供的质量相当的更高质量快照。”
在这里插入图片描述

最初的目标提高应用程序的弱光功能,但最终却带来了更多的结果。Snapchat 团队致力于寻找新的方法提高应用程序的相机功能,实现夜间模式、人像模式、脸部修饰点击对焦、变焦等功能。

“我们与 Google Pixel合作为与其他 OEM 厂商的合作铺平了道路,只需很少的代码更改即可在其设备中实现夜间模式和超级夜间模式,”Ye 说道。“Camera2 扩展 API 灵活且广泛。Snapchat 现在可以使用它按需构建成熟的应用程序,而不会对性能和稳定性产生负面影响。”

通过 Camera2 Extension API 的实现使 Snapchat 开发人员可以轻松地将更多相机功能添加到应用程序中。通过使用 Android 相机 API 提供的扩展Snapchat 集成新相机功能的速度比过去使用的典型行业标准方法快了 50%。

在这里插入图片描述

更多设备上的更多机会

Snapchat 团队很高兴使用 Camera2 Extensions API 为其用户提供更具凝聚力的体验。得益于 API 中提供的扩展开发人员可以轻松地在使用 Android 平台的一系列制造商设备上改进应用程序的相机,而且速度比以前快得多。

“我喜欢Android平台的多样性,并利用每个手机制造商设备的独特优势,”叶说。“它帮助我们将他们的尖端创新引入 Snapchat 应用程序,让 Snapchat 用户更好地捕捉他们的生活瞬间。”

Snapchat 团队期待与更多 OEM 厂商合作,利用 Camera2 Extensions API 进一步提高应用程序跨设备的处理能力。他们还期待使用新的 API 来提高应用程序的向后兼容性,这将使更多用户扩展中受益。

建议使用 Camera2 扩展 API。它提供了广泛的功能和稳定的性能,以提高开发人员交付功能的速度。”叶说。

正文:开始使用

Camera2 提供了一个 Extensions API,用于访问设备制造商在各种 Android 设备上实现扩展。如需查看支持扩展模式列表,请参阅相机扩展

如需查看支持扩展的设备列表,请参阅支持的设备

扩展架构

下图显示了相机扩展程序架构
请添加图片描述

Camera2 应用可以通过 Camera2 API 使用扩展。Camera2 API 提供了查询可用扩展、配置扩展相机会话以及与相机扩展 OEM 库通信方法。这样,您的应用就可以使用夜间、HDR、自动、焦外成像或脸部照片修复等扩展程序。

测试相机设备的 Camera2 Extensions API 兼容

以下代码段检查设备是否支持 Camera2 Extensions API。并非所有设备都支持扩展,或者设备可能支持一部分扩展。该代码段会返回支持相机扩展的兼容相机 ID 的列表

private fun getExtensionCameraIds(cameraManager: CameraManager): List =
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        cameraManager.cameraIdList.filter { cameraId ->
            val characteristics = cameraManager.getCameraCharacteristics(cameraId)
            val extensionCharacteristics =
                cameraManager.getCameraExtensionCharacteristics(cameraId)
            val capabilities =
                characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)
            extensionCharacteristics.supportedExtensions.isNotEmpty() &&
                    capabilities?.contains(
                        CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
                    ) ?: false
        }
    } else emptyList()

使用 Camera2 Extensions API 创建 CameraExtensionSession

兼容的设备搭配使用时,Camera2 Extensions API 可让您访问某些相机扩展。以下代码段举例说明如何创建 CameraExtensionSession以便为现有 Camera2 应用使用夜间拍摄模式

private val captureCallbacks = object : CameraExtensionSession.ExtensionCaptureCallback() {
    // Implement Capture Callbacks
}
private val extensionSessionStateCallback = object : CameraExtensionSession.StateCallback() {
    override fun onConfigured(session: CameraExtensionSession) {
        cameraExtensionSession = session
        try {
            val captureRequest =
                cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).apply {
                    addTarget(previewSurface)
                }.build()
            session.setRepeatingRequest(
                captureRequest,
                Dispatchers.IO.asExecutor(),
                captureCallbacks
            )
        } catch (e: CameraAccessException) {
            Snackbar.make(
                previewView,
                "Failed to preview capture request",
                Snackbar.LENGTH_SHORT
            ).show()
            requireActivity().finish()
        }
    }

    override fun onClosed(session: CameraExtensionSession) {
        super.onClosed(session)
        cameraDevice.close()
    }

    override fun onConfigureFailed(session: CameraExtensionSession) {
        Snackbar.make(
            previewView,
            "Failed to start camera extension preview",
            Snackbar.LENGTH_SHORT
        ).show()
        requireActivity().finish()
    }
}

private fun startExtensionSession() {
    val outputConfig = arrayListOf(
        OutputConfiguration(stillImageReader.surface),
        OutputConfiguration(previewSurface)
    )
    val extensionConfiguration = ExtensionSessionConfiguration(
        CameraExtensionCharacteristics.EXTENSION_NIGHT,
        outputConfig,
        Dispatchers.IO.asExecutor(),
        extensionSessionStateCallback
    )
    cameraDevice.createExtensionSession(extensionConfiguration)
}

更多api

按照以上操作一个基本获取能力就完成了,如果想要查看更多api参考 Camera2 Extensions API 示例

原文地址:https://blog.csdn.net/u014540814/article/details/134592476

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_16765.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注