it编程 > App开发 > Android

Android CameraX 使用指南及一些高级功能(简化相机开发)

28人参与 2025-07-28 Android

前言

在android开发中,相机功能一直是比较复杂的部分,需要处理不同设备的兼容性、生命周期管理以及复杂的api调用。google推出的camerax库极大地简化了这一过程,让开发者能够更轻松地实现高质量的相机功能。本文将带你全面了解camerax的使用方法。

什么是camerax?

camerax是jetpack系列中的一个库,它基于camera2 api构建,但提供了更高层次的抽象,具有以下优点:

添加依赖

首先,在build.gradle文件中添加camerax依赖:

def camerax_version = "1.3.0"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
implementation "androidx.camera:camera-lifecycle:${camerax_version}"
implementation "androidx.camera:camera-view:${camerax_version}"

基本使用流程

1. 请求相机权限

在androidmanifest.xml中添加权限声明:

<uses-permission android:name="android.permission.camera" />
<uses-feature android:name="android.hardware.camera" />

运行时请求权限:

private val requestpermissionlauncher = registerforactivityresult(
    activityresultcontracts.requestpermission()
) { isgranted ->
    if (isgranted) {
        startcamera()
    } else {
        toast.maketext(this, "permission denied", toast.length_short).show()
    }
}
// 检查并请求权限
if (contextcompat.checkselfpermission(
        this, manifest.permission.camera
    ) == packagemanager.permission_granted
) {
    startcamera()
} else {
    requestpermissionlauncher.launch(manifest.permission.camera)
}

2. 配置预览视图

在布局文件中添加previewview:

<androidx.camera.view.previewview
    android:id="@+id/viewfinder"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

3. 初始化camerax

private fun startcamera() {
    val cameraproviderfuture = processcameraprovider.getinstance(this)
    cameraproviderfuture.addlistener({
        // 用于绑定相机生命周期
        val cameraprovider: processcameraprovider = cameraproviderfuture.get()
        // 预览
        val preview = preview.builder()
            .build()
            .also {
                it.setsurfaceprovider(viewfinder.surfaceprovider)
            }
        // 选择后置摄像头
        val cameraselector = cameraselector.default_back_camera
        try {
            // 解绑之前的所有用例
            cameraprovider.unbindall()
            // 绑定用例到生命周期
            cameraprovider.bindtolifecycle(
                this, cameraselector, preview
            )
        } catch(exc: exception) {
            log.e(tag, "use case binding failed", exc)
        }
    }, contextcompat.getmainexecutor(this))
}

高级功能

图像分析

camerax可以轻松实现图像分析:

val imageanalysis = imageanalysis.builder()
    .setbackpressurestrategy(imageanalysis.strategy_keep_only_latest)
    .build()
imageanalysis.setanalyzer(executor) { imageproxy ->
    // 在这里处理图像
    val rotationdegrees = imageproxy.imageinfo.rotationdegrees
    // 处理完成后关闭imageproxy
    imageproxy.close()
}
// 记得在bindtolifecycle中添加这个用例
cameraprovider.bindtolifecycle(
    this, cameraselector, preview, imageanalysis
)

拍照功能

private fun takephoto() {
    // 创建图片捕获用例
    val imagecapture = imagecapture.builder()
        .setcapturemode(imagecapture.capture_mode_minimize_latency)
        .build()
    // 绑定用例
    cameraprovider.bindtolifecycle(
        this, cameraselector, preview, imagecapture
    )
    // 创建输出选项
    val outputoptions = imagecapture.outputfileoptions.builder(
        file(externalmediadirs.first(), "${system.currenttimemillis()}.jpg")
    ).build()
    // 拍照
    imagecapture.takepicture(
        outputoptions,
        contextcompat.getmainexecutor(this),
        object : imagecapture.onimagesavedcallback {
            override fun onerror(exc: imagecaptureexception) {
                log.e(tag, "photo capture failed: ${exc.message}", exc)
            }
            override fun onimagesaved(output: imagecapture.outputfileresults) {
                val saveduri = output.saveduri ?: uri.fromfile(outputoptions.outputfile)
                log.d(tag, "photo capture succeeded: $saveduri")
            }
        }
    )
}

处理设备特性

camerax提供了简单的方式来检查设备支持的功能:

val camerainfo = cameraprovider.availablecamerainfos.find {
    it.cameraselector == cameraselector
}
// 检查闪光灯支持
val hasflash = camerainfo?.torchstate?.value != null
// 检查变焦支持
val haszoom = camerainfo?.zoomstate?.value != null

最佳实践

总结

camerax极大地简化了android相机开发,让开发者能够专注于业务逻辑而不是底层细节。通过本文的介绍,你应该已经掌握了camerax的基本用法和一些高级功能。现在,你可以尝试在自己的应用中实现相机功能了!

参考资源

到此这篇关于android camerax 使用指南及一些高级功能(简化相机开发)的文章就介绍到这了,更多相关android camerax 使用内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

Android Paging 分页加载库使用实践

07-30

Android实现屏幕录制与本地保存功能的完整指南

07-31

Android Studio切换主线程的两种方式详解

07-24

Android Studio如何利用Application操作全局变量的代码详解

07-24

Android自定义ViewPager实现无限循环效果的完整指南

07-22

如何在 Android 中定义和使用自定义属性

07-18

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论