文章目录
- 应用举例(可以不看这一part,直接跳过看具体怎么做):
- Snapchat 通过 Camera2 Extensions API 将新相机功能的集成速度提高了 50%**
- Camera2 扩展 API 可以访问高级功能
- 更多设备上的更多机会
- 正文:开始使用
- 扩展架构
- 测试相机设备的 Camera2 Extensions API 兼容性
- 使用 Camera2 Extensions API 创建 CameraExtensionSession
- 更多api
应用举例(可以不看这一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 示例。