选择一个相机库
注意:如果您想使用设备的默认相机应用程序执行基本的相机操作,如捕捉照片或视频,请参阅Camera intents(下文有中文翻译)。
如果你想在Android应用程序中添加摄像头功能,你有三个主要选项:
对于大多数开发者,我们推荐CameraX。CameraX是一个Jetpack库,支持绝大多数Android设备(Android 5.0及更高版本),并提供了围绕常见用例设计的一致的高级API。CameraX为您解决设备兼容性问题,这样您就不必向应用程序添加特定于设备的代码。
CameraX是建立在Camera2包之上的。如果您需要低级别的相机控件来支持复杂的用例,Camera2是一个不错的选择,但是这个API比CameraX更复杂,并且需要管理特定于设备的配置。与CameraX一样,Camera2可以在Android 5.0 (API级别21)及更高版本上运行。
原来的Android Camera类已弃用。新的应用程序应该使用CameraX(推荐)或Camera2,现有的应用程序应该迁移,以利用新功能,避免失去与未来设备的兼容性。
Camera intents
要执行基本的相机操作,如使用设备的默认相机应用程序捕捉照片或视频,您不需要集成相机库。使用Intent就可以了。
用相机应用拍张照片
Android通过调用Intent将操作委托给其他应用程序。这个过程包括三部分:Intent本身,启动外部Activity的调用,以及当焦点返回到Activity时处理图像数据的一些代码。
这是一个调用Intent来捕捉照片的函数。
val REQUEST_IMAGE_CAPTURE = 1
private fun dispatchTakePictureIntent() {
val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
try {
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
} catch (e: ActivityNotFoundException) {
// display error state to the user
}
}
用摄像应用录制视频
你也可以调用Intent来捕捉视频。
val REQUEST_VIDEO_CAPTURE = 1
private fun dispatchTakeVideoIntent() {
Intent(MediaStore.ACTION_VIDEO_CAPTURE).also { takeVideoIntent ->
takeVideoIntent.resolveActivity(packageManager)?.also {
startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE)
} ?: run {
//display error state to the user
}
}
}
startActivityForResult()方法由调用resolveActivity()的条件保护,该条件返回第一个可以处理Intent的活动组件。执行这个检查来确保你调用的Intent不会让你的应用程序崩溃。
相机的扩展
Camera2和CameraX都提供了一个扩展API,让你的应用程序访问以下供应商在Android设备上实现的扩展:
- Auto:根据当前场景背景调整扩展模式,这取决于供应商库实现。例如,在低光场景下,Auto可能会切换到夜间来拍照。对于肖像照片,自动可以应用面部修饰或散景。
- Bokeh:锐化前景主题,模糊背景。通常用于拍摄背景柔和、失焦的人像照片。
- Face Retouch:润色皮肤纹理,眼下色调等。
- HDR(高动态范围):扩大曝光范围,产生更生动的照片。在HDR模式下,相机拍摄几张不同曝光值的照片,并将它们合并为一张。
- Night:在低光情况下使照片变亮。相机可以在不同的曝光值下拍摄几张照片,并将它们合并为一张。这个过程可能需要几秒钟,在相机拍照时,用户应该保持手机不动。
Camera2和CameraX扩展api公开了相同的扩展集,这些扩展在许多受支持的设备上可用。
注意:Camera2和CameraX扩展只用于预览和图像捕获用例,而不是视频捕获。
支持的设备
并非所有设备都支持扩展,即使设备支持扩展,也可能不支持所有扩展。
有关支持扩展的已知设备的列表,请参见受支持的设备。要检查扩展是否在您的设备上可用,请分别查看Camera2 Extensions API和CameraX Extensions API文档。
下一步
了解如何为你的应用程序启用摄像头扩展: