目录

Customized View支持开发者自定义扫码界面,扫码过程和相机控制将由Scan Kit完成。您可以参考我们提供的示例代码快速构建扫码界面UI。

1. 业务流程

使用Customized View Mode的主要业务流程如下:

1. 用户打开应用发起扫码请求。

2. 校验是否有相机权限和文件读取权限。

3. 初始化应用定制的view,构建扫码界面,开始扫码。

4. 如果扫码成功,HMS SDK回调应用的“onResult”接口传递扫码结果。

5. 应用封装扫码结果返回给用户。

2. 开发步骤

自定义扫码页面元素

参见Customized View自定义页面元素。

通过Customized View实现相机扫码功能

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,示例代码如下:

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3.    super.onCreate(savedInstanceState);
  4.    setContentView(R.layout.activity_defined);
  5.    //绑定相机预览布局
  6.    frameLayout = findViewById(R.id.rim);
  7.    //设置扫码识别区域,您可以按照需求调整参数
  8.    DisplayMetrics dm = getResources().getDisplayMetrics();
  9.    float density = dm.density;
  10.    mScreenWidth = getResources().getDisplayMetrics().widthPixels;
  11.    mScreenHeight = getResources().getDisplayMetrics().heightPixels;
  12.    //当前demo扫码框的宽高是300dp
  13.    final int SCAN_FRAME_SIZE = 300;
  14.    int scanFrameSize = (int) (SCAN_FRAME_SIZE * density);
  15.    Rect rect = new Rect();
  16.    rect.left = mScreenWidth / 2 - scanFrameSize / 2;
  17.    rect.right = mScreenWidth / 2 + scanFrameSize / 2;
  18.    rect.top = mScreenHeight / 2 - scanFrameSize / 2;
  19.    rect.bottom = mScreenHeight / 2 + scanFrameSize / 2;
  20.    //初始化RemoteView,并通过如下方法设置参数:setContext()(必选)传入context、setBoundingBox()设置扫描区域、setFormat()设置识别码制式,设置完毕调用build()方法完成创建
  21.    remoteView = new RemoteView.Builder().setContext(this).setBoundingBox(rect).setFormat(HmsScan.QRCODE_SCAN_TYPE, HmsScan.DATAMATRIX_SCAN_TYPE).build();
  22.    //将自定义view加载到activity
  23.    remoteView.onCreate(savedInstanceState);
  24.    FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
  25.    frameLayout.addView(remoteView, params);
  26. }

2. 对RemoteView设置结果回调监听,获取扫码结果对象HmsScan,其中包含的信息参见码值解析。

  1. @Override
  2. protected void onCreate(Bundle savedInstanceState) {
  3.    …
  4.    //识别结果回调事件订阅  
  5.    remoteView.setOnResultCallback(new OnResultCallback() {  
  6.        @Override  
  7.        public void onResult(HmsScan[] result) {  
  8.            //获取到扫码结果HmsScan
  9.            showResult(result);  
  10.        }  
  11.    });
  12. }

3. 对RemoteView设置生命流程监听。

  1. @Override
  2. protected void onStart() {
  3.    super.onStart();
  4.    remoteView.onStart();
  5. }
  6. @Override
  7. protected void onResume() {
  8.    super.onResume();
  9.    remoteView.onResume();
  10. }
  11. @Override
  12. protected void onPause() {
  13.    super.onPause();
  14.    remoteView.onPause();
  15. }
  16. @Override
  17. protected void onStop() {
  18.    super.onStop();
  19.    remoteView.onStop();
  20. }
  21. @Override
  22. protected void onDestroy() {
  23.    super.onDestroy();
  24.    remoteView.onDestroy();
  25. }

4. 对RemoteView设置其他可选监听。

  1. protected void onCreate(Bundle savedInstanceState) {
  2.    …
  3.    //光线暗时,会回调该接口,示例代码用于控制显示闪光灯开关
  4.    flushBtn = findViewById(R.id.flush_btn);
  5.    remoteView.setOnLightVisibleCallback(new OnLightVisibleCallBack() {
  6.        @Override
  7.        public void onVisibleChanged(boolean visible) {
  8.            if(visible){
  9.                flushBtn.setVisibility(View.VISIBLE);
  10.            }  
  11.        }  
  12.    });
  13.    …
  14. }

5. (可选)暂停或恢复扫码。

      a. 开发者在扫码成功后,如不想结束当前“Activity”并继续进行其他操作,可以调用暂停扫码接口。

  1. remoteView.pauseContinuouslyScan();

      b. 需要从暂停扫码状态恢复扫码,可以调用恢复扫码接口,恢复当前“Activity”接收扫码结果。

  1. remoteView.resumeContinuouslyScan();
说明:

暂停扫码会重置相机焦距。例如,若焦距处在放大状态,暂停扫码并恢复扫码后,焦距恢复正常状态。

6. 如果您需要增加从图片文件扫描码的功能,可使用Bitmap Mode实现。

   a. 设定导入图片扫码的按钮;

   b. 参考Bitmap Mode图片扫码模式,实现具体流程请参考图片扫码模式。