Android NDK开发详解相机之使用相机
选择相机库
注意 :如果您要使用设备的默认相机应用执行拍照或录制视频等基本相机操作,请参阅相机 intent。
如果要向 Android 应用中添加相机功能,您有以下三个主要选项:
CameraX
Camera2
Camera(已废弃)
对于大多数开发者,建议使用 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,并且现有应用应迁移以利用新功能,并避免与未来设备不兼容。
相机 intent
如果您要使用设备的默认相机应用执行拍照或录制视频等基本相机操作,则无需与相机库集成,请改用 Intent。
使用相机应用拍照
Android 通过调用 Intent 将操作委托给其他应用。此过程涉及三个部分:Intent 本身,用于启动外部 Activity 的调用,以及用于在焦点返回到您的 activity 时处理图像数据的一些代码。
下面是一个调用 Intent 来拍照的函数。
Kotlin
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
}
}
Java
static final int REQUEST_IMAGE_CAPTURE = 1;
private void dispatchTakePictureIntent() {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
try {
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
} catch (ActivityNotFoundException e) {
// display error state to the user
}
}
使用相机应用录制视频
您还可以调用 Intent 来录制视频。
Kotlin
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
}
}
}
Java
static final int REQUEST_VIDEO_CAPTURE = 1;
private void dispatchTakeVideoIntent() {
Intent takeVideoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
if (takeVideoIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takeVideoIntent, REQUEST_VIDEO_CAPTURE);
}
else {
//display error state to the user
}
}
startActivityForResult() 方法受调用 resolveActivity()(返回可以处理 Intent 的第一个 activity 组件)的条件保护。执行此检查,确保您调用的 Intent 不会造成应用崩溃。
其他资源
对于基本相机操作,请使用 Intent。否则,我们建议您使用 Camera2 和 CameraX 库来处理比拍照或录制视频等基本操作更复杂的操作。
CameraX 相机软件包
Camera2 相机软件包
相机示例项目
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2023-11-02。