暂停扫码会重置相机焦距。例如,若焦距处在放大状态,暂停扫码并恢复扫码后,焦距恢复正常状态。
Customized View支持开发者自定义扫码界面,扫码过程和相机控制将由Scan Kit完成。您可以参考我们提供的示例代码快速构建扫码界面UI。
使用Customized View Mode的主要业务流程如下:
1. 用户打开应用发起扫码请求。
2. 校验是否有相机权限和文件读取权限。
3. 初始化应用定制的view,构建扫码界面,开始扫码。
4. 如果扫码成功,HMS SDK回调应用的“onResult”接口传递扫码结果。
5. 应用封装扫码结果返回给用户。

1. 创建RemoteView,并加载到Activity布局。
a. 绑定相机预览界面,设置扫码识别区域。
在相机预览流中,Scan Kit只截取扫码识别区域的图像,为了获得较好的自动放大效果,建议扫码框放在屏幕中间,且扫码识别区域比绘制的扫码框范围略大。
b. 设置支持识别的码类型并初始化RemoteView,设定页面元素的操作。
开发者可以指定Scan Kit只扫码特定的码制式,以提高扫码速度。例如,当仅需要检测QR码和Data Matrix码时,通过“setFormat(HmsScan.QRCODE_SCAN_TYPE, HmsScan.DATAMATRIX_SCAN_TYPE)”方法实现。当不指定特定的码制式时,不需要调用“setFormat”方法,默认检测Scan Kit支持的码制式。
c. 将RemoteView加载到Activity,示例代码如下:
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_defined);
- //绑定相机预览布局
- frameLayout = findViewById(R.id.rim);
- //设置扫码识别区域,您可以按照需求调整参数
- DisplayMetrics dm = getResources().getDisplayMetrics();
- float density = dm.density;
- mScreenWidth = getResources().getDisplayMetrics().widthPixels;
- mScreenHeight = getResources().getDisplayMetrics().heightPixels;
- //当前demo扫码框的宽高是300dp
- final int SCAN_FRAME_SIZE = 300;
- int scanFrameSize = (int) (SCAN_FRAME_SIZE * density);
- Rect rect = new Rect();
- rect.left = mScreenWidth / 2 - scanFrameSize / 2;
- rect.right = mScreenWidth / 2 + scanFrameSize / 2;
- rect.top = mScreenHeight / 2 - scanFrameSize / 2;
- rect.bottom = mScreenHeight / 2 + scanFrameSize / 2;
- //初始化RemoteView,并通过如下方法设置参数:setContext()(必选)传入context、setBoundingBox()设置扫描区域、setFormat()设置识别码制式,设置完毕调用build()方法完成创建
- remoteView = new RemoteView.Builder().setContext(this).setBoundingBox(rect).setFormat(HmsScan.QRCODE_SCAN_TYPE, HmsScan.DATAMATRIX_SCAN_TYPE).build();
- //将自定义view加载到activity
- remoteView.onCreate(savedInstanceState);
- FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
- frameLayout.addView(remoteView, params);
- }
2. 对RemoteView设置结果回调监听,获取扫码结果对象HmsScan,其中包含的信息参见码值解析。
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- …
- //识别结果回调事件订阅
- remoteView.setOnResultCallback(new OnResultCallback() {
- @Override
- public void onResult(HmsScan[] result) {
- //获取到扫码结果HmsScan
- showResult(result);
- }
- });
- }
3. 对RemoteView设置生命流程监听。
- @Override
- protected void onStart() {
- super.onStart();
- remoteView.onStart();
- }
- @Override
- protected void onResume() {
- super.onResume();
- remoteView.onResume();
- }
- @Override
- protected void onPause() {
- super.onPause();
- remoteView.onPause();
- }
- @Override
- protected void onStop() {
- super.onStop();
- remoteView.onStop();
- }
- @Override
- protected void onDestroy() {
- super.onDestroy();
- remoteView.onDestroy();
- }
4. 对RemoteView设置其他可选监听。
- protected void onCreate(Bundle savedInstanceState) {
- …
- //光线暗时,会回调该接口,示例代码用于控制显示闪光灯开关
- flushBtn = findViewById(R.id.flush_btn);
- remoteView.setOnLightVisibleCallback(new OnLightVisibleCallBack() {
- @Override
- public void onVisibleChanged(boolean visible) {
- if(visible){
- flushBtn.setVisibility(View.VISIBLE);
- }
- }
- });
- …
- }
5. (可选)暂停或恢复扫码。
a. 开发者在扫码成功后,如不想结束当前“Activity”并继续进行其他操作,可以调用暂停扫码接口。
- remoteView.pauseContinuouslyScan();
b. 需要从暂停扫码状态恢复扫码,可以调用恢复扫码接口,恢复当前“Activity”接收扫码结果。
- remoteView.resumeContinuouslyScan();
暂停扫码会重置相机焦距。例如,若焦距处在放大状态,暂停扫码并恢复扫码后,焦距恢复正常状态。
6. 如果您需要增加从图片文件扫描码的功能,可使用Bitmap Mode实现。
a. 设定导入图片扫码的按钮;
b. 参考Bitmap Mode图片扫码模式,实现具体流程请参考图片扫码模式。