在您项目根目录下的build.gradle增加 maven 仓库依赖
xxxxxxxxxxallprojects {repositories {google()jcenter()...maven {url 'https://public-n3.advai.net/repository/maven-releases/'}}}
在app/build.gradle中增加增加包依赖
xxxxxxxxxxdependencies {...// 版本记录查看:http://public-n3.advai.net/repository/maven-releases/ai/advance/mobile-sdk/android/global-iqa/maven-metadata.xmlimplementation 'ai.advance.mobile-sdk.android:global-iqa:1.2.8'}
您可以通过以下链接 查看版本记录
初始化 SDK
在自定义的 application 中增加如下初始化代码
xxxxxxxxxxGlobalIQASDK.init(application);
设置 license (由您的服务端调用 openAPI 获取 license)
xxxxxxxxxxString checkResult = GlobalIQASDK.setLicenseAndCheck(license);if ("SUCCESS".equals(checkResult)) {// license 有效startGlobalIQAActivity();} else {// license 不可用,过期/格式错误/appId不在授权列表内}
用户绑定(强烈建议)。
您可以通过该方法将自己的用户唯一标识传给我们,我们会根据该标识建立映射关系。当遇到问题时,方便同我们进行日志追踪。
xxxxxxxxxxGlobalIQASDK.bindUser(String userId)
启动与获取结果
我们提供了两种方式来获取图片和检测结果,您可以通过 SDK 直接获取,也可以在后端通过 IDVID 请求结果。
支持通过如下示例代码修改页面的风格,如果下方的样式无法满足您的自定义需求,请点击此处下载UI源码进行您的自定义操作
xxxxxxxxxx/*** 请求状态码*/public static final int REQUEST_CODE_IQA = xxxx;/*** 启动页面* @param region 地区 ISO 码,使用2位或者3位简码都可以,参见维基百科:https://zh.wikipedia.org/wiki/ISO_3166-1* @param cardType 卡片类型,枚举值: ID_CARD,DRIVING_LICENSE,UMID,SSS,TIN,PASSPORT,VOTERID,NATIONALID,PRC,PAGIBG,POSTALID* @param cardSide 卡片正反面,枚举值: FRONT,BACK*/private void startGlobalIQAActivity(String region, CardType cardType, CardSide cardSide) {Intent intent = new Intent(MainActivity.this, GlobalIQAActivity.class);intent.putExtra(GlobalIQAActivity.EXTRA_IQA_EXTRAS,new IQAExtras.Builder(region, cardType, cardSide).setSoundPlayEnable(true) // 声音播报是否开启,默认开启.setReturnEmptyOfOCR(false)//是否在识别为空的字段上返回null,默认为false.setMode(Mode.DEFAULT)// 设置启动模式:扫描/拍照/默认.build());// UI 色调自定义,非必须UIExtras.Builder builder = new UIExtras.Builder().setPageColor(getResources().getColor(R.color.cardview_dark_background))// 页面主色调.setPrimaryTextColor(your colorRes) // 页面主体文字颜色.setFrameRectColor(your colorRes) // 相机蒙版层的颜色.setFrameRectCornerRadius(20) // 相机控件蒙版支持设置圆角(单位:px).setTitleBackGroundColor(your colorRes) // 标题栏的颜色.setFlipCameraBtnVisible(false)// 切换相机按钮是否可见,默认可见.setLightBtnVisible(false)// 手电筒按钮是否可见,默认可见.setTipIconVisible(false)// 竖屏扫描过程中底部提示控件的小图标是否可见.setTitleTextColor(your colorRes)// 标题栏文字颜色.setPagePortraitBackgroundResource(R.drawable.xxx)//竖屏状态下页面的背景图片.setPageLandscapeBackgroundResource(R.drawable.xxx)//横屏状态下页面的背景图片.setPageLandscapeTitleBgResource(R.drawable.xxx)//横屏状态下页面标题部分背景图片.setPagePortraitTitleBgResource(R.drawable.xxx)//竖屏状态下页面标题部分背景图片.setCameraWidthPercentInPortraitState(0.8f)// 竖屏状态相机控件占屏幕的百分比,取值0~1.setCameraHeightPercentInLandscapeState(0.7)// 竖屏状态相机控件占屏幕的百分比,取值0~0.7.setRetakeBtnTextColor(your colorRes)//拍照模式重拍按钮文字颜色.setContinueBtnTextColor(your colorRes)//拍照模式继续按钮文字颜色.setTakePhotoTipDialogShowSeconds(3)//扫描超时提示框倒计时秒数设置,设置为0则不会弹框.setScanLimitSeconds(20)// 扫描超时时间设置,单位秒,取值5~60.setCountdownTimerVisible(true)// 扫描模式是否显示倒计时控件,默认显示(此设置不会影响倒计时逻辑,仅决定控件是否显示).setTakePhotoViewIcon(R.drawable.xxx)// 拍照按钮图标.setTakePhotoTipViewBackgroundColor(your colorRes)// 拍照模式,相机控件下方提示语控件的背景色.takePhotoTipViewLeftIconVisible(false)// 拍照模式,相机控件下方提示语控件左侧的图标是否可见,默认可见.setScreenOrientation(ScreenOrientation.xx);// 锁定屏幕方向,默认自适应旋转方向,枚举值:LANDSCAPE,PORTRAIT,AUTO// 通过下面的方法,可以设置扫描时相机控件下方提示语的 UI 样式TipViewUIElements elements = new TipViewUIElements();elements.setNoCardDrawableResId(R.drawable.xxx);// 未检测到卡片elements.setHoldSteadilyDrawableResId(R.drawable.xxx);// 请扶稳手机elements.setCardPoorQualityDrawableResId(R.drawable.xxx);// 卡片质量差:模糊/光斑/过暗elements.setCardIncompleteDrawableResId(R.drawable.xxx);// 卡片不完整elements.setCardTooSmallDrawableResId(R.drawable.xxx);// 卡片过小elements.setCardOccludedDrawableResId(R.drawable.xxx);// 卡片被遮挡elements.setViewWidthPercentRelativeToCameraView(1f); // 提示语控件相对于相机控件的宽度比例,如:设置为1表示何相机控件等宽elements.setAspectRatio(0.25f);// 控件宽高比,宽/高builder.setPortraitTipViewBackgrounds(elements)// 竖屏.setLandscapeTipViewBackgrounds(landscapeElements)// 横屏intent.putExtra(GlobalIQAActivity.EXTRA_UI_EXTRAS,builder.build());// 相机控件上方文字支持传入富文本:SpannableString spannableString1 = new SpannableString("xxxxx");spannableString1.setSpan(....);intent.putExtra(GlobalIQAActivity.EXTRA_SPANNABLE_ABOVE_CAMERA, spannableString1);// 拍照模式,相机控件下方提示语支持传入富文本:SpannableString spannableString2 = new SpannableString("xxxxx");spannableString2.setSpan(....);intent.putExtra(GlobalIQAActivity.EXTRA_SPANNABLE_TIP_TEXT_OF_TAKE_PHOTO, spannableString2);// 拍照模式,拍照后预览时图像下方提示语支持传入富文本:SpannableString spannableString3 = new SpannableString("xxxxx");spannableString3.setSpan(....);intent.putExtra(GlobalIQAActivity.EXTRA_SPANNABLE_PREVIEW_TIP_OF_TAKE_PHOTO, spannableString3);startActivityForResult(intent, REQUEST_CODE_IQA);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {if (requestCode == REQUEST_CODE_IQA) {boolean success = GlobalIQAResult.isSuccess();if (success) {String idvid = GlobalIQAResult.getIDVID();// 图像 idBitmap bitmap = GlobalIQAResult.getBitmap();// bitmap 格式的图像String pictureType = GlobalIQAResult.getPictureType();// 图片类型,takePhoto 表示拍照,scan 表示扫描String base64Image = GlobalIQAResult.getBase64Image();// base64格式的图像JSONObject idForgeryResult = GlobalIQAResult.getIdForgeryResult();//假证结果JSONObject ocrResult = GlobalIQAResult.getOCRResult();// ocr 结果String transactionId = GlobalIQAResult.getTransactionId();// 本次的事务idboolean pay = GlobalIQAResult.isPay();//本次调用是否计费} else {String errorCode = GlobalIQAResult.getErrorCode();// 本次错误码String errorMsg = GlobalIQAResult.getErrorMsg();//本次错误描述信息,可能为空String transactionId = GlobalIQAResult.getTransactionId();//本次的事务id,可能为空}}}
| ErrorCode | 解释 |
|---|---|
| USER_GIVE_UP | 用户点击了返回键 |
| DEVICE_NOT_SUPPORT | SDK不支持该手机 |
| PARAMETER_ERROR | 参数错误 |
| OCR_NO_RESULT | OCR识别结果为空 |
| TOO_MANY_CARDS | OCR识别结果检测到多张卡片 |
| 其它通用Code | 参见文档 |
图片元素自定义
利用 gradle 打包合并资源的机制,在您的app模块中放置 SDK 中的同名图片资源,从而实现图片元素的自定义。
各个图片资源的名称对应关系如下:
xxxxxxxxxxiqa_back 返回按钮iqa_land_confirm 横屏确认按钮iqa_land_retake 横屏重拍按钮iqa_light_off 手电筒关闭按钮iqa_light_on 手电筒打开按钮iqa_scan_processing 横屏扫描时底部实时提示的 icon,对应文案为:请扶稳手机iqa_scan_successfully 横屏扫描时底部实时提示的 icon,对应文案为:证件扫描成功iqa_scan_warning 横屏扫描时底部实时提示的 icon,对应提示卡片问题(模糊,卡片不全,面积小等)iqa_take_photo 拍照按钮iqa_take_photo_tip 拍照模式时,相机下方提示的文案左侧小 iconiqa_transform_camera 切换摄像头普通状态iqa_transform_camera_pressed 切换摄像头按压状态advance_iqa_tip_capture 扫描超时后,弹出倒计时框里的iconadvance_iqa_scan 扫描时,相机上的扫描动画图片
文字自定义
利用 gradle 打包合并资源的机制,在您的app模块中放置 SDK 中的同名文字资源,从而实现文字元素的自定义。
xxxxxxxxxx// 文字资源英文名称 & 内容列表,替换时请注意语言国际化<resources><string name="no_card">No document is detected</string><string name="hold_phone">Please hold the phone steadily</string><string name="iqa_no_camera_permission">Camera is not turned on, please turn on camera permissions</string><string name="iqa_confirm">Yes</string><string name="iqa_auth_check">Please Wait</string><string name="iqa_failed_reason_bad_network">Please check network</string><string name="too_small_card">Document is too small</string><string name="device_not_support">The device does not supported</string><string name="iqa_time_out_tips">Time out, try taking photo manually.</string><string name="iqa_retry_tips">Time out, please try again.</string><string name="iqa_scan_document">Scan Document</string><string name="iqa_front_side_of_document">Front Side of Document</string><string name="iqa_back_side_of_document">Back Side of Document</string><string name="iqa_top_desc">Please place the document in the center with the edges aligned</string><string name="iqa_card_poor_quality">Document is too dim/blurred/overexposed</string><string name="iqa_scan_successfully">Document collected successfully</string><string name="iqa_min_gap_ratio">The document is incomplete\nplease make sure the document in the center with the edges aligned</string><string name="iqa_take_photo_tips">Try taking photo manually\nAlign document, then press button</string><string name="iqa_take_photo_ensure">Please ensure that all data on your documents is visible and readable.</string><string name="iqa_retake">Retake</string><string name="iqa_continue">Continue</string><string name="iqa_card_occluded">Please keep your ID card unobstructed</string></resources>
国际化
SDK 支持英文,印尼语,中文 三种语言/语音,跟随手机系统语言自动切换。
若没有跟随系统语言自动切换 ,请检查手机语言设置,确保【地区】和【语言】均已切换至对应的语言
若仍然出现语言国际化问题,同时 app 仅支持某种语言,可以通过在build.gradle中增加如下配置,过滤掉不需要的语言
xxxxxxxxxxandroid {defaultConfig {...resConfigs("in-rID") // 以仅支持印尼语为例}}
运行时权限
本 SDK 需要如下权限,并且已经在 aar 的清单文件中做了配置且 SDK 本身已经做好了安卓 6.0 以上权限的动态申请。
xxxxxxxxxx<uses-feature android:name="android.hardware.camera" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.CAMERA" />
关于 App Bundle 打包
SDK 中包含 .so 文件,为了减少包大小,在上架 Google Play 时可以选择使用 Bundle 打包,请验证打包后的 APK 在各个架构的手机上都可以运行,如果出现提示【该设备不支持】,则表示组装 APK 时缺失了 .aar 中的 .so 文件,请联系我们索取 .so 与 .aar 分离的版本。
代码混淆
SDK 已经做好了代码混淆,无需额外增加配置。
关于Androidx
考虑到 Androidx 与 support 包的互斥,本 SDK 的 .aar 全部是 support 包,如果您的项目是 androidX 类包,编译时遇到提示 support 包冲突错误,请在您项目的根目录下的gradle.properties文件中增加下述配置,重新编译项目即可:
xxxxxxxxxxandroid.enableJetifier=true
SDK 兼容性
armeabi-v7a,arm64-v8a,x86,x86_64,armeabi