{"id":18565055,"url":"https://github.com/jenly1314/camerascan","last_synced_at":"2026-01-31T14:08:31.165Z","repository":{"id":186319243,"uuid":"674996944","full_name":"jenly1314/CameraScan","owner":"jenly1314","description":"📷 CameraScan一个简化扫描识别流程的通用基础库","archived":false,"fork":false,"pushed_at":"2025-05-25T16:15:14.000Z","size":23810,"stargazers_count":57,"open_issues_count":0,"forks_count":10,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-06-09T10:05:43.251Z","etag":null,"topics":["analyzer","android","camera","camera-library","camera-preview","camera-scan","camerax","preview","scanner"],"latest_commit_sha":null,"homepage":"https://jenly1314.github.io/CameraScan/","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jenly1314.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-08-05T12:35:16.000Z","updated_at":"2025-05-30T05:26:57.000Z","dependencies_parsed_at":null,"dependency_job_id":"2b950729-34d8-4207-972c-f82783e3e4a9","html_url":"https://github.com/jenly1314/CameraScan","commit_stats":{"total_commits":16,"total_committers":1,"mean_commits":16.0,"dds":0.0,"last_synced_commit":"94ca39a79625c793e73bab4833b61746c1d33497"},"previous_names":["jenly1314/camerascan"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/jenly1314/CameraScan","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenly1314%2FCameraScan","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenly1314%2FCameraScan/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenly1314%2FCameraScan/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenly1314%2FCameraScan/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jenly1314","download_url":"https://codeload.github.com/jenly1314/CameraScan/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenly1314%2FCameraScan/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261560196,"owners_count":23177336,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["analyzer","android","camera","camera-library","camera-preview","camera-scan","camerax","preview","scanner"],"created_at":"2024-11-06T22:17:32.254Z","updated_at":"2026-01-31T14:08:31.156Z","avatar_url":"https://github.com/jenly1314.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CameraScan\n\n[![MavenCentral](https://img.shields.io/maven-central/v/com.github.jenly1314/camera-scan?logo=sonatype)](https://repo1.maven.org/maven2/com/github/jenly1314/camera-scan)\n[![JitPack](https://img.shields.io/jitpack/v/github/jenly1314/CameraScan?logo=jitpack)](https://jitpack.io/#jenly1314/CameraScan)\n[![CI](https://img.shields.io/github/actions/workflow/status/jenly1314/CameraScan/build.yml?logo=github)](https://github.com/jenly1314/CameraScan/actions/workflows/build.yml)\n[![Download](https://img.shields.io/badge/download-APK-brightgreen?logo=github)](https://raw.githubusercontent.com/jenly1314/CameraScan/master/app/release/app-release.apk)\n[![API](https://img.shields.io/badge/API-23%2B-brightgreen?logo=android)](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)\n[![License](https://img.shields.io/github/license/jenly1314/CameraScan?logo=open-source-initiative)](https://opensource.org/licenses/apache-2-0)\n\nCameraScan for Android 是一个简化扫描识别流程的通用基础库。\n\n**CameraScan** 本身并不提供具体的分析识别功能，只是将相机预览、扫描分析等过程进行抽象分离，从而简化扫描识别功能的实现，你只需将 **CameraScan** 作为基础库，然后实现具体的识别业务，便可快速实现各种扫描识别相关功能。\n\n\u003e 在 [ZXingLite](https://github.com/jenly1314/ZXingLite)、[MLKit](https://github.com/jenly1314/MLKit)、[WeChatQRCode](https://github.com/jenly1314/WeChatQRCode) 发布的新版本中都使用了 **CameraScan** 作为相机扫描基础库。\n\n\u003e [**CameraScan**](https://github.com/jenly1314/CameraScan) + [**ViewfinderView**](https://github.com/jenly1314/ViewfinderView) +（[ZXingLite](https://github.com/jenly1314/ZXingLite)、[MLKit](https://github.com/jenly1314/MLKit)、[WeChatQRCode](https://github.com/jenly1314/WeChatQRCode) 其中之一） = 完美搭配。\n\n## 引入\n\n### Gradle:\n\n1. 在Project的 **build.gradle** 或 **setting.gradle** 中添加远程仓库\n\n    ```gradle\n    repositories {\n        //...\n        mavenCentral()\n    }\n    ```\n\n2. 在Module的 **build.gradle** 中添加依赖项\n\n    ```gradle\n    implementation 'com.github.jenly1314:camera-scan:1.4.0'\n    ```\n\n### 温馨提示\n\n#### 关于CameraScan版本与编译的SDK版本要求\n\n\u003e 使用 **v1.4.x** 以上版本时，要求 **compileSdk \u003e= 35**\n\n\u003e 使用 **v1.1.x** 以上版本时，要求 **compileSdk \u003e= 34**\n\n\u003e 使用 **v1.0.x** 以上版本时，要求 **compileSdk \u003e= 33**\n\n## 使用\n\n### 快速实现扫描识别主要有以下几种方式：\n\n\u003e 1、通过继承 **BaseCameraScanActivity** 或者 **BaseCameraScanFragment** 或其子类，可快速实现扫描识别。\n\u003e （适用于大多场景，自定义布局时需覆写 **getLayoutId** 方法）\n\n\u003e 2、在你项目的Activity或者Fragment中实例化一个 **BaseCameraScan**。（适用于想在扫描界面写交互逻辑，又因为项目\n\u003e 架构或其它原因，无法直接或间接继承 **BaseCameraScanActivity** 或 **BaseCameraScanFragment** 时使用）\n\n\u003e 3、继承 **CameraScan** 自己实现一个，可参照默认实现类 **BaseCameraScan**，其他步骤同方式2。（高级用法，谨慎使用）\n\n### 关于 CameraScan\n\n**CameraScan** 作为相机扫描的（核心）基类；所有与相机扫描相关的都是基于此类来直接或间接进行控制的。\n\n### 关于 CameraConfig\n\n主要是相机相关的配置；如：摄像头的前置后置、相机预览相关、图像分析相关等配置。\n\n\u003e CameraConfig中提供的可配置项：`CameraSelector.Builder`、`Preview.Builder`、`ImageAnalysis.Builder`；\n\n\u003e 你可以直接库中内置实现的相机配置： **CameraConfig** 、**AspectRatioCameraConfig** 和 **ResolutionCameraConfig**。\n\n#### 这里简单说下各自的特点：\n\n* **CameraConfig**：CameraX默认的相机配置（基类）。\n* **AdaptiveCameraConfig**：自适应相机配置：主要是根据纵横比和设备屏幕的分辨率找到与相机之间合适的相机配置（v1.1.0新增）\n* ~~**AspectRatioCameraConfig**：根据纵横比配置相机，使输出分析的图像尽可能的接近屏幕的比例~~（已废弃）\n* ~~**ResolutionCameraConfig**：根据尺寸配置相机的目标图像大小，使输出分析的图像的分辨率尽可能的接近屏幕尺寸~~（已废弃）\n\n\u003e 你也可以自定义或覆写 **CameraConfig** 中的 **options** 方法，根据需要定制配置。\n\n这里特别温馨提示：默认配置在未配置相机的目标分析图像大小时，会优先使用：横屏：640 * 480 竖屏：480 * 640；\n\n根据这个图像质量顺便说下默认配置的优缺点：\n\n* 优点：因为图像质量不高，所以在低配置的设备上使用也能hold住，这样就能尽可能的适应各种设备；\n* 缺点：正是由于图像质量不高，从而可能会对检测识别率略有影响，比如在某些机型上体验欠佳。\n* 结论：在适配、性能与体验之间得有所取舍，找到平衡点。\n\n基于上面的配置优缺点特性，CameraScan内部默认会通过 **CameraConfigFactory** 来获取适合当前设备的的相机配置：CameraConfig；如果内部默认配置不满足你的需求，你也可以根据具体需求去设置CameraScan的CameraConfig；\n\n如：通过CameraConfig设置前置摄像头\n\n**方式一：** 通过工厂类创建CameraConfig（**推荐**）\n```java\n// 通过工厂类创建适合当前设备的CameraConfig\nCameraConfig cameraConfig = CameraConfigFactory.createDefaultCameraConfig(this, CameraSelector.LENS_FACING_FRONT);\ngetCameraScan().setCameraConfig(cameraConfig);\n```\n\n**方式二：** 通过对象创建CameraConfig\n```java\n// 此处的CameraConfig可以是CameraConfig的任意子类（其它CameraConfig相关配置修改方式与设置前置摄像头类似）\nCameraConfig cameraConfig = new CameraConfig() {\n    @NonNull\n    @Override\n    public CameraSelector options(@NonNull CameraSelector.Builder builder) {\n        builder.requireLensFacing(CameraSelector.LENS_FACING_FRONT);\n        return super.options(builder);\n    }\n};\n\ngetCameraScan().setCameraConfig(cameraConfig);\n```\n\n\u003e 需要注意的是：`cameraScan.setCameraConfig(cameraConfig)` 一般是在相机启动预览之前调用的，如果是在相机启动预览之后修改了CameraConfig的配置，则需重新调用`cameraScan.startCamera()`后，CameraConfig相关配置才会生效。\n\n### 关于 **Analyzer**\n\n**Analyzer** 为定义的分析器接口；主要用于分析相机预览的帧数据，从而得到具体的结果。一般实现某种扫描识别功能时，你只需自定义并实现一个 **Analyzer** 对应的功能即可。\n\n### 关于 **BaseCameraScanActivity** 和 **BaseCameraScanFragment**\n\n**BaseCameraScanActivity** 和 **BaseCameraScanFragment** 作为扫描预览界面的基类，主要目的是便于快速实现扫描识别。\n\n\u003e 扫描预览界面内部持有 **CameraScan**，并处理了 **CameraScan** 的初始化（如：相机权限、相机预览、生命周期等细节）\n\n### CameraScan配置示例\n\n**CameraScan** 里面包含部分支持链式调用的方法，即调用返回是 **CameraScan** 本身的一些配置建议在调用 **startCamera()** 方法之前调用。\n\n\u003e 如果是通过继承 **BaseCameraScanActivity** 或者 **BaseCameraScanFragment** 或其子类实现的相机扫描，可以在\n**initCameraScan()** 方法中根据需要修改CameraScan相关配置。\n\n示例：\n\n```java\n// 根据需要修改CameraScan相关配置\ncameraScan.setPlayBeep(true) // 设置是否播放音效，默认为false\n    .setVibrate(true) // 设置是否震动，默认为false\n    .setCameraConfig(CameraConfigFactory.createDefaultCameraConfig(this, CameraSelector.LENS_FACING_BACK)) // 设置相机配置信息\n    .setNeedTouchZoom(true) // 支持多指触摸捏合缩放，默认为true\n    .setDarkLightLux(45f) // 设置光线足够暗的阈值（单位：lux），需要通过{@link #bindFlashlightView(View)}绑定手电筒才有效\n    .setBrightLightLux(100f) // 设置光线足够明亮的阈值（单位：lux），需要通过{@link #bindFlashlightView(View)}绑定手电筒才有效\n    .bindFlashlightView(ivFlashlight) // 绑定手电筒，绑定后可根据光线传感器，动态显示或隐藏手电筒按钮；（传空表示不绑定）\n    .setOnScanResultCallback(this) // 设置扫描结果回调，需要自己处理或者需要连扫时，可设置回调，自己去处理相关逻辑\n    .setAnalyzeImage(true); // 设置是否分析图片，默认为true。如果设置为false，相当于关闭了扫描识别功能\n\n```\n\n启动相机预览\n```java\n// 启动预览（如果是通过直接或间接继承BaseCameraScanActivity或BaseCameraScanFragment实现的则无需调用startCamera）\ncameraScan.startCamera();\n```\n\n控制闪光灯\n```java\n// 设置闪光灯（手电筒）是否开启,需在startCamera之后调用才有效\ncameraScan.enableTorch(torch);\n```\n\n设置分析器\n```java\n// 设置分析器\ncameraScan.setAnalyzer(analyzer);\n```\n\u003e 如果是通过直接或间接继承 **BaseCameraScanActivity** 来实现的，可直接覆写 `createAnalyzer` 方法返回具体的分析器即可。\n\n* 看到这里，你对 **CameraScan** 相关配置应该有了基本的了解，**CameraScan** 作为一个简化扫描识别流程的通用基础库，将通用的预览分析流程，进行尽可能的抽象分离，然后实现公共部分；将具体分析功能进行抽象；基于 **CameraScan** 你只需实现一个**Analyzer**，并根据需要进行**CameraScan**相关配置，就可以快速实现具体的扫描检测功能。\n\n\u003e 介绍完 **CameraScan** 相关配置后，下面就来说下界面和布局部分；\n\n### 界面示例\n\n通过继承 **BaseCameraScanActivity** 可快速实现具体的扫描功能；（ **BaseCameraScanFragment** 与之类似）\n\n示例：\n```kotlin\n// 此处的泛型*表示分析得到的具体结果\nclass CameraScanActivity : BaseCameraScanActivity\u003c*\u003e() {\n    /**\n     * 初始化CameraScan\n     */\n    override fun initCameraScan(cameraScan: CameraScan\u003c*\u003e) {\n        super.initCameraScan(cameraScan)\n        // TODO 根据需要初始化CameraScan相关配置\n        cameraScan.setPlayBeep(true)\n    }\n\n    /**\n     * 布局ID；通过覆写此方法可以自定义布局\n     *\n     * @return 布局ID\n     */\n    override fun getLayoutId(): Int {\n        return super.getLayoutId()\n    }\n\n    override fun onScanResultCallback(result: AnalyzeResult\u003c*\u003e) {\n        // TODO 扫描结果回调；分析后得到的结果\n    }\n\n    override fun createAnalyzer(): Analyzer\u003c*\u003e? {\n        // TODO 创建分析器；由具体的分析器去实现分析检测功能\n        return null\n    }\n}\n\n```\n\n\u003e 一般在 [ZXingLite](https://github.com/jenly1314/ZXingLite) 、[MLKit](https://github.com/jenly1314/MLKit) 或 [WeChatQRCode](https://github.com/jenly1314/WeChatQRCode) 对应的库中都有提供 **BaseCameraScanActivity** 的子类，可快速实现具体的分析识别功能。（比如：[MLKit](https://github.com/jenly1314/MLKit)中的条码扫描有：[BarcodeCameraScanActivity](https://github.com/jenly1314/MLKit/blob/master/mlkit-barcode-scanning/src/main/java/com/king/mlkit/vision/barcode/BarcodeCameraScanActivity.java)）\n\n### 布局示例\n\n**PreviewView** 用来预览，布局内至少要保证有 **PreviewView** （必须*）；如果是继承 **BaseCameraScanActivity** 或\n**BaseCameraScanFragment** 或其子类实现的相机扫描；快速实现扫描功能；\n需自定义布局时，通过覆写`getLayoutId`方法即可；预览控件ID可覆写`getPreviewViewId`方法自定义；\n\n**ivFlashlight** 是布局内置的手电筒（非必须的），如果是继承 **BaseCameraScanActivity** 或 **BaseCameraScanFragment**，其内部已默认处理了手电筒点击开关事件；控件id可覆写`getFlashlightId`方法自定义，默认为 **ivFlashlight**。返回0表示无需内置手电筒。您也可以自己去定义\n\n更多CameraScan相关用法可查看 **BaseCameraScanActivity** 源码或参见下面的使用示例。\n\n\nBaseCameraScanActivity和BaseCameraScanFragment使用的默认布局：\n```Xml\n\n\u003cFrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\u003e\n\n    \u003candroidx.camera.view.PreviewView\n        android:id=\"@+id/previewView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" /\u003e\n    \u003c!-- 只需保证有布局内有PreviewView即可，然后你可根据需要添加的控件 --\u003e\n\n    \u003cImageView\n        android:id=\"@+id/ivFlashlight\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:layout_marginTop=\"@dimen/camera_scan_flashlight_margin_top\"\n        android:contentDescription=\"@null\"\n        android:src=\"@drawable/camera_scan_flashlight_selector\" /\u003e\n\u003c/FrameLayout\u003e\n\n```\n\n自定义布局示例：（通过覆写`getLayoutId`方法）\n```Xml\n\n\u003cFrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\u003e\n\n    \u003candroidx.camera.view.PreviewView\n        android:id=\"@+id/previewView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" /\u003e\n    \u003c!-- 只需保证有布局内有PreviewView即可，然后你可根据需要添加的控件 --\u003e\n    \u003ccom.king.view.viewfinderview.ViewfinderView\n        android:id=\"@+id/viewfinderView\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" /\u003e\n    \u003cImageView\n        android:id=\"@+id/ivFlashlight\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center\"\n        android:layout_marginTop=\"@dimen/camera_scan_flashlight_margin_top\"\n        android:contentDescription=\"@null\"\n        android:src=\"@drawable/camera_scan_flashlight_selector\" /\u003e\n\u003c/FrameLayout\u003e\n\n```\n\n\u003e 如上面的自定布局，使用了开源库：[**ViewfinderView**](https://github.com/jenly1314/ViewfinderView)；一般在实现扫码相关需求时，会经常用到。\n\n\u003e 页面完整示例：[CameraScanActivity](app/src/main/java/com/king/camera/scan/app/CameraScanActivity.kt)\n\n更多使用详情，请查看[app](app)中的源码使用示例或直接查看[API帮助文档](https://jenly1314.github.io/CameraScan/api/)\n\n## 其他\n\n- [常见问题解答](https://github.com/jenly1314/ZXingLite/issues/69#issue-529829908)\n\n## 相关推荐\n\n- [MLKit](https://github.com/jenly1314/MLKit) 一个强大易用的工具包。通过ML Kit您可以很轻松的实现文字识别、条码识别、图像标记、人脸检测、对象检测等功能。\n- [WeChatQRCode](https://github.com/jenly1314/WeChatQRCode) 基于OpenCV开源的微信二维码引擎移植的扫码识别库。\n- [ZXingLite](https://github.com/jenly1314/ZXingLite) 基于zxing实现的扫码库，优化扫码和生成二维码/条形码功能。\n- [ViewfinderView](https://github.com/jenly1314/ViewfinderView) ViewfinderView一个取景视图：主要用于渲染扫描相关的动画效果。\n- [LibYuv](https://github.com/jenly1314/libyuv) 基于Google的libyuv编译封装的YUV转换工具库，主要用途是在各种YUV与RGB之间进行相互转换、裁减、旋转、缩放、镜像等。\n- [LogX](https://github.com/jenly1314/LogX) 一个轻量而强大的日志框架；好用不解释。\n\n\u003c!-- end --\u003e\n\n## 版本日志\n\n#### v1.4.0：2026-01-31\n* 更新CameraX相关依赖至v1.5.3\n* 更新minSdk至23\n* 更新compileSdk至35\n* 更新Gradle至v8.13\n* 优化细节\n\n\n#### [查看更多版本日志](CHANGELOG.md)\n\n---\n\n![footer](https://jenly1314.github.io/page/footer.svg)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjenly1314%2Fcamerascan","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjenly1314%2Fcamerascan","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjenly1314%2Fcamerascan/lists"}