开发准备
1. 注册腾讯云账号,单击进入 文字识别控制台,即可开通相应服务。
2. 在 账号中心 获取 API 密钥。
3. 前往文字识别客户端 SDK 接入页面 下载对应 SDK。
Android 端 OCR SDK 接入流程
Android 端OCR SDK 介绍
SDK 提供的文件为 OCR_Android_SDK_V1.0.9,该文件封装了 OCR 识别终端能力。目前包括了身份证识别、银行卡识别、名片识别、车辆 Vin 码识别、车牌识别、驾驶证识别以及行驶证识别。
环境依赖
当前 Android 端 OCR 识别 SDK 适用于 API 19 (Android 4.4) 及以上版本。
接入步骤
1. 将 OcrSDK-public-v2.0.0.1-release.aar、OcrSDK-common-model-v1.0.0-release.aar 和公共库 tencent-ai-sdk-aicamera-1.0.18-release.aar 、tencent-ai-sdk-common-1.1.27-release.aar添加到您工程目录的 libs 目录下。
2. 在您工程的 build.gradle 中进行如下配置:
dependencies {// 依赖腾讯云的 OcrSDK 的 aarimplementation files('libs/OcrSDK-common-model-v1.0.0-release.aar')implementation files('libs/OcrSDK-public-v2.0.0.1-release.aar')implementation files('libs/tencent-ai-sdk-aicamera-1.0.18-release.aar')implementation files('libs/tencent-ai-sdk-common-1.1.28-release.aar')// OCR SDK 返回实体对象需要的依赖implementation 'com.google.code.gson:gson:2.8.5'}
3. 同时需要在 AndroidManifest.xml 文件中进行必要的权限声明
<!--摄像头使用权限--><uses-feature android:name="android.hardware.camera" /><uses-permissionandroid:name="android.permission.CAMERA"android:required="true" /><!--文件存储使用权限[可选]--><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><!--网络访问权限--><uses-permission android:name="android.permission.INTERNET" />
对于需要兼容 Android 6.0 以上的用户,以上权限除了需要在 AndroidManifest.xml 文件中声明权以外,还需使用代码动态申请权限。
SDK 接口使用说明
SDK 初始化:
使用 OCR SDK 之前需要进行初始化,您可以按照您的需求设置默认值。
// 启动参数配置OcrModeType modeType = OcrModeType.OCR_DETECT_AUTO_MANUAL; // 设置默认的业务识别模式自动 + 手动步骤模式OcrType ocrType = OcrType.BankCardOCR; // 设置默认的业务识别,银行卡OcrSDKConfig configBuilder = OcrSDKConfig.newBuilder(SecretPamera.secretId, SecretPamera.secretKey, null).setOcrType(ocrType).setModeType(modeType).build();// 初始化 SDKOcrSDKKit.getInstance().initWithConfig(this.getApplicationContext(), configBuilder);
目前 OCR SDK 支持的业务模式:
OcrModeType 类型 | 代表含义 |
OCR_DETECT_MANUAL | 手动拍摄模式 |
OCR_DETECT_AUTO_MANUAL | 自动识别模式(tips:20s后提示,是否切换到手动拍摄) |
更新临时密钥
OCR SDK 支持使用临时密钥接口,使用临时密钥的好处主要有以下两点,第一将固定密钥与终端分离可以增加安全性;第二因为兑换临时密钥是您完全可控的行为,因此您可以根据自定义规则来控制最终用户的接口访问权限。因此建议您使用临时密钥的方式,具体可以参考文档 (临时密钥文档与流程链接)
OcrSDKKit.getInstance().updateFederationToken(tmpSecretId, tmpSecretKey, token);
OCR 识别(返回 Json 字符串):
当您需要使用 OCR 识别的功能的时候,您可以直接调用识别接口,进行 OCR 业务识别。
// 启动 ocr 识别,识别类型为身份证正面OcrSDKKit.getInstance().startProcessOcr(MainActivity.this, OcrType.IDCardOCR_FRONT, customConfigUi, new ISDKKitResultListener() {@Overridepublic void onProcessSucceed(String response, String srcBase64Image, String requestId) {popTip(response, "Succeed"); // 展示 ocr 识别结果}@Overridepublic void onProcessFailed(String errorCode, String message, String requestId) {popTip(message, errorCode); // 展示 ocr 识别错误信息}});
OCR 识别(返回对象实体类):
当您需要使用 OCR 识别功能,同时需要直接获取实体对象而非 JsonString 时,可以使用此方法。
OcrSDKKit.getInstance().startProcessOcrResultEntity(OcrTypeIdCardActivity.this,OcrType.IDCardOCR_FRONT, null, IdCardOcrResult.class,new ISdkOcrEntityResultListener<IdCardOcrResult>() {@Overridepublic void onProcessSucceed(IdCardOcrResult idCardOcrResult, String base64Str) {Log.e(TAG, "IdCardOcrResult:" + idCardOcrResult.toString()); // OCR 识别成功 IdCardOcrResult}@Overridepublic void onProcessFailed(String errorCode, String message, String requestId) {Log.e(TAG, "errorCode:" + errorCode + " message:" + message); // OCR 识别失败 IdCardOcrResult}});
目前 OCR SDK 支持几种类型的识别模式如下表所示,以及对应的实体类返回结果。
OcrType 类型 | 代表含义 | 对应结果实体类 |
OcrType.IDCardOCR_FRONT | 身份证人像面识别模式 | IdCardOcrResult |
OcrType.IDCardOCR_BACK | 身份证国徽面识别模式 | IdCardOcrResult |
OcrType.BankCardOCR | 银行卡正面识别模式 | BankCardOcrResult |
OcrType.BusinessCardOCR | 名片卡正面识别模式 | BusinessCardOcrResult |
OcrType.VinOCR | 车辆的 VIN 识别模式 | VinOcrResult |
OcrType.LicensePlateOCR | 车辆的车牌识别模式 | CarLicensePlateResult |
OcrType.DriverLicenseOCR_FRONT | 驾驶证主页识别模式 | DriverLicenseCardResult |
OcrType.DriverLicenseOCR_BACK | 驾驶证副页识别模式 | DriverLicenseCardResult |
OcrType.VehicleLicenseOCR_FRONT | 行驶证主页识别模式 | VehicleLicenseCardResult |
OcrType.VehicleLicenseOCR_BACK | 行驶证副页识别模式 | VehicleLicenseCardResult |
OcrType.GENERAL_VIN | 车辆的VIN码通用识别模式(主要推荐拍照模式使用) | VinOcrResult |
OcrType.IDCardOCR_HK03 | 香港身份证03版本识别模式 | HKIDCardOcrResult |
OcrType.IDCardOCR_HK18 | 香港身份证18版本识别模式 | HKIDCardOcrResult |
OcrType.Exit_Entry_HK_Macao_Card | 港澳台通行证识别模式 | PermitOcrResult |
OcrType.MLID_PASSPORT | 国际护照识别模式 | MLIDPassportOcrResult |
OcrType.HMT_RESIDENT_PERMIT_OCR | 港澳台居住证 | HmtResidentPermitOcrResult |
SDK 版本号获取:
OCR SDK 提供了直接获取 SDK 版本号的接口,您可以调用此接口获取。
OcrSDKKit.getInstance().getVersion()
SDK 资源释放:
在您 App 退出使用或者需要重启加载 OCR 功能的时候,可以调用 SDK 资源释放接口。
@Overrideprotected void onDestroy() {if (mDialog != null) {mDialog.dismiss();}// 释放 OCR SDK 的资源OcrSDKKit.getInstance().release();super.onDestroy();}
混淆规则配置
如果您的应用开启了混淆功能,为确保 SDK 的正常使用,请把以下部分添加到您的混淆文件中。
#保留自定义的 OcrSDKKit 类和类成员不被混淆-keep class com.tencent.ocr.sdk.** {*;}#第三方 jar 包不被混淆-keep class com.tencent.youtu.** {*;}#公共库相关内容不混淆-keep class com.tencent.could.** {*;}
常见问题
1. 如同时集成其余 SDK,出现 More than one file was found with OS independent path 'lib/armeabi-v7a/libc++_shared.so'. 的问题。
主要是 OCR SDK 和其余 SDK 都添加了
libc++_shared.so
这个库,解决办法可以在 build.gradle 中添加如下配置:android {...// 过滤重复定义 so 的问题packagingOptions{pickFirst 'lib/armeabi-v7a/libc++_shared.so'}}
2. 如果集成方使用了 AndResGuard 的混淆工具,可以添加混淆配置:
// for OCR SDK"R.string.ocr_*","R.string.rst_*","R.string.net_*","R.string.msg_*",
3. 集成 OCR SDK 后如果出现 Invoke-customs are only supported starting with Android O (--min-api 26) 错误?
需要在 build.gradle 中添加如下配置:
// java 版本支持1.8compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility JavaVersion.VERSION_1_8}
4. 如果使用了 AutoSize 组件,同时又使用了 OCR 的横屏模式时,横屏模式出现页面元素大小异常的问题。主要原因是 AutoSize 默认设置为竖屏情况下的宽高基准,可以在 Application 里注册下面的回调,实现横竖屏基准自适应:
/*** AutoSize随界面横竖自适应方法, 可在Application中注册* 以design_width_in_dp 360, design_height_in_dp 640 为例(客户可以修改成自己定义的)* <meta-data* android:name="design_width_in_dp"* android:value="360"/>* <meta-data* android:name="design_height_in_dp"* android:value="640"/>** DESIGN_WIDTH_DP = 360;* DESIGN_WIDTH_DP = 640;*/public static void addAutoSizeListener() {AutoSizeConfig.getInstance().setOnAdaptListener(new onAdaptListener() {@Overridepublic void onAdaptBefore(Object target, Activity activity) {Context context = activity;int[] currentSize = ScreenUtils.getScreenSize(context);// 设置当前屏幕的大小AutoSizeConfig.getInstance().setScreenWidth(currentSize[0]);AutoSizeConfig.getInstance().setScreenHeight(currentSize[1]);// 获取当前Activity对应的屏幕方向int orientation = activity.getResources().getConfiguration().orientation;// 如果是横屏,调整对应的屏幕基准if (orientation == Configuration.ORIENTATION_LANDSCAPE) {AutoSizeConfig.getInstance().setDesignWidthInDp(DESIGN_HEIGHT_DP);AutoSizeConfig.getInstance().setDesignHeightInDp(DESIGN_WIDTH_DP);} else {// 如果是竖屏,调整对应的屏幕基准AutoSizeConfig.getInstance().setDesignWidthInDp(DESIGN_WIDTH_DP);AutoSizeConfig.getInstance().setDesignHeightInDp(DESIGN_HEIGHT_DP);}}@Overridepublic void onAdaptAfter(Object target, Activity activity) {}});}