@Override
 public void handleMessage(Message message) {
   if (message.what == R.id.restart_preview) {
     Log.d(TAG, "Got restart preview message");
     restartPreviewAndDecode();
   } else if (message.what == R.id.decode_succeeded) {
     Log.d(TAG, "Got decode succeeded message");
     state = State.SUCCESS;
     Bundle bundle = message.getData();
     Bitmap barcode = null;
     float scaleFactor = 1.0f;
     if (bundle != null) {
       byte[] compressedBitmap = bundle.getByteArray(DecodeThread.BARCODE_BITMAP);
       if (compressedBitmap != null) {
         barcode =
             BitmapFactory.decodeByteArray(compressedBitmap, 0, compressedBitmap.length, null);
         // Mutable copy:
         barcode = barcode.copy(Bitmap.Config.ARGB_8888, true);
       }
       scaleFactor = bundle.getFloat(DecodeThread.BARCODE_SCALED_FACTOR);
     }
     activity.handleDecode((Result) message.obj, barcode, scaleFactor);
   } else if (message.what == R.id.decode_failed) {
     // We're decoding as fast as possible, so when one decode fails,
     // start another.
     state = State.PREVIEW;
     cameraManager.requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
   } else if (message.what == R.id.return_scan_result) {
     Log.d(TAG, "Got return scan result message");
     activity.setResult(Activity.RESULT_OK, (Intent) message.obj);
     activity.finish();
   } else if (message.what == R.id.launch_product_query) {
     Log.d(TAG, "Got product query message");
     String url = (String) message.obj;
     Intent intent = new Intent(Intent.ACTION_VIEW);
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
     intent.setData(Uri.parse(url));
     /** 这段代码是zxing项目组想要用chrome打开浏览器浏览url */
     ResolveInfo resolveInfo =
         activity.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
     String browserPackageName = null;
     if (resolveInfo != null && resolveInfo.activityInfo != null) {
       browserPackageName = resolveInfo.activityInfo.packageName;
       Log.d(TAG, "Using browser in package " + browserPackageName);
     }
     // Needed for default Android browser / Chrome only apparently
     if ("com.android.browser".equals(browserPackageName)
         || "com.android.chrome".equals(browserPackageName)) {
       intent.setPackage(browserPackageName);
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
       intent.putExtra(Browser.EXTRA_APPLICATION_ID, browserPackageName);
     }
     try {
       activity.startActivity(intent);
     } catch (ActivityNotFoundException ignored) {
       Log.w(TAG, "Can't find anything to handle VIEW of URI " + url);
     }
   }
 }
  public CaptureActivityHandler(
      CaptureActivity activity,
      Collection<BarcodeFormat> decodeFormats,
      Map<DecodeHintType, ?> baseHints,
      String characterSet,
      CameraManager cameraManager) {
    this.activity = activity;

    // 启动扫描线程
    decodeThread =
        new DecodeThread(
            activity,
            decodeFormats,
            baseHints,
            characterSet,
            new ViewfinderResultPointCallback(activity.getViewfinderView()));
    decodeThread.start();

    state = State.SUCCESS;

    // Start ourselves capturing previews and decoding.
    this.cameraManager = cameraManager;

    // 开启相机预览界面
    cameraManager.startPreview();

    restartPreviewAndDecode();
  }
  /** 完成一次扫描后,只需要再调用此方法即可 */
  private void restartPreviewAndDecode() {
    if (state == State.SUCCESS) {
      state = State.PREVIEW;

      // 向decodeThread绑定的handler(DecodeHandler)发送解码消息
      cameraManager.requestPreviewFrame(decodeThread.getHandler(), R.id.decode);
      activity.drawViewfinder();
    }
  }