ZXing扫码

来源:互联网 发布:mac ps hud拾色器 编辑:程序博客网 时间:2024/03/29 21:01

引用的库

引入 com.google.zxing.core 库,代码精简结构
这里写图片描述

修改布局

  • 修改 CaptureActivity 的布局文件,并添加一行文字
<merge xmlns:android="http://schemas.android.com/apk/res/android"       xmlns:tools="http://schemas.android.com/tools">  <SurfaceView android:id="@+id/preview_view"               android:layout_width="fill_parent"               android:layout_height="fill_parent"/>  <com.google.zxing.client.android.ViewfinderView      android:id="@+id/viewfinder_view"      android:layout_width="fill_parent"      android:layout_height="fill_parent"/>  <RelativeLayout       android:layout_width="match_parent"       android:layout_height="match_parent">        <TextView android:id="@+id/status_view"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:background="@color/transparent"            android:text="@string/scan_qrcode"            android:textColor="@color/common_white"              android:textSize="@dimen/sp15"/>   </RelativeLayout></merge>
  • 修改 CameraManager.java 的 getFramingRect 方法以修改扫码框的大小
//      int width = findDesiredDimensionInRange(screenResolution.x, MIN_FRAME_WIDTH, MAX_FRAME_WIDTH);//      int height = findDesiredDimensionInRange(screenResolution.y, MIN_FRAME_HEIGHT, MAX_FRAME_HEIGHT);// 程序里是一个正方形int width = screenResolution.x * 496 / 720;int height = width;int leftOffset = (screenResolution.x - width) / 2;int topOffset = (screenResolution.y - height)/ 4;
  • ViewfinderView.java 的 onDraw 添加修改四个边角和中间的扫描线
  /**   * 四个绿色边角对应的长度   */  private int screenRate;  /**   * 四个绿色边角对应的宽度   */  private static final int CORNER_WIDTH = 10;  /**   * 扫描框中的中间线的宽度   */  private static final int MIDDLE_LINE_WIDTH = 6;  /**   * 扫描框中的中间线的与扫描框左右的间隙   */  private static final int MIDDLE_LINE_PADDING = 5;  /**   * 中间那条线每次刷新移动的距离   */  private static final int SPEEN_DISTANCE = 5;  /**   * 中间滑动线的最顶端位置   */  private int slideTop;  private boolean isFirst;  public void onDraw(final Canvas canvas) {    ......     int width = canvas.getWidth();    int height = canvas.getHeight();    if (!isFirst) {      isFirst = true;      slideTop = frame.top;    }     if (resultBitmap != null) {      // Draw the opaque result bitmap over the scanning rectangle      paint.setAlpha(CURRENT_POINT_OPACITY);      canvas.drawBitmap(resultBitmap, null, frame, paint);    } else {          // 四个角      paint.setColor(Color.GREEN);      canvas.drawRect(frame.left, frame.top, frame.left + screenRate,              frame.top + CORNER_WIDTH, paint);      canvas.drawRect(frame.left, frame.top, frame.left + CORNER_WIDTH, frame.top              + screenRate, paint);      canvas.drawRect(frame.right - screenRate, frame.top, frame.right,              frame.top + CORNER_WIDTH, paint);      canvas.drawRect(frame.right - CORNER_WIDTH, frame.top, frame.right, frame.top              + screenRate, paint);      canvas.drawRect(frame.left, frame.bottom - CORNER_WIDTH, frame.left              + screenRate, frame.bottom, paint);      canvas.drawRect(frame.left, frame.bottom - screenRate,              frame.left + CORNER_WIDTH, frame.bottom, paint);      canvas.drawRect(frame.right - screenRate, frame.bottom - CORNER_WIDTH,              frame.right, frame.bottom, paint);      canvas.drawRect(frame.right - CORNER_WIDTH, frame.bottom - screenRate,              frame.right, frame.bottom, paint);      // 中间的扫描线      slideTop += SPEEN_DISTANCE;      if (slideTop >= frame.bottom) {        slideTop = frame.top;      }      canvas.drawRect(frame.left + MIDDLE_LINE_PADDING, slideTop - MIDDLE_LINE_WIDTH / 2,              frame.right - MIDDLE_LINE_PADDING, slideTop + MIDDLE_LINE_WIDTH / 2, paint);      ......     }}
  • 效果
    这里写图片描述

转竖屏

  • 修改 CaptureActivity.java 的 onResume 方法
//    if (prefs.getBoolean(PreferencesActivity.KEY_DISABLE_AUTO_ORIENTATION, true)) {//      setRequestedOrientation(getCurrentOrientation());//    } else {//      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);//    }    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  • 修改 CameraConfigurationManager.java 的 setDesiredCameraParameters 方法
parameters.setPreviewSize(cameraResolution.x, cameraResolution.y);// 为了竖屏camera.setDisplayOrientation(90);camera.setParameters(parameters);Camera.Parameters afterParameters = camera.getParameters();
  • 修改 CameraManager.java 的 getFramingRectInPreview 方法
//      rect.left = rect.left * cameraResolution.x / screenResolution.x;//      rect.right = rect.right * cameraResolution.x / screenResolution.x;//      rect.top = rect.top * cameraResolution.y / screenResolution.y;//      rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;//为了竖屏rect.left = rect.left * cameraResolution.y / screenResolution.x;rect.right = rect.right * cameraResolution.y / screenResolution.x;rect.top = rect.top * cameraResolution.x / screenResolution.y;rect.bottom = rect.bottom * cameraResolution.x / screenResolution.y;

重新扫码

调用 CaptureActivity 的 restartPreviewAfterDelay 方法

拍照权限被拒绝的处理

在 CaptureActivity 的 initCamera(SurfaceHolder surfaceHolder) 方法中,如果被安全软件禁止了拍照的权限,会进入异常处理里。

protected void initCamera(SurfaceHolder surfaceHolder) {    if (surfaceHolder == null) {      throw new IllegalStateException("No SurfaceHolder provided");    }    if (cameraManager.isOpen()) {      Log.w(TAG, "initCamera() while already open -- late SurfaceView callback?");      return;    }    try {      cameraManager.openDriver(surfaceHolder);      // Creating the handler starts the preview, which can also throw a RuntimeException.      if (handler == null) {        handler = new CaptureActivityHandler(this, decodeFormats, decodeHints, characterSet, cameraManager);      }      decodeOrStoreSavedBitmap(null, null);    } catch (IOException ioe) {      showDialog();      Log.w(TAG, ioe);//      displayFrameworkBugMessageAndExit();    } catch (RuntimeException e) {      showDialog();      // Barcode Scanner has seen crashes in the wild of this variety:      // java.?lang.?RuntimeException: Fail to connect to camera service      Log.w(TAG, "Unexpected error initializing camera", e);//      displayFrameworkBugMessageAndExit();    }  }  private void showDialog() {    final DialogUtil.RecipeDialog dialog = DialogUtil.createCommonOneBtnDialog(this,            getString(R.string.no_camera_permission), getString(R.string.ok));    dialog.show();    dialog.setCancelable(true);    dialog.setCanceledOnTouchOutside(true);    dialog.setOkClickListener(new View.OnClickListener() {      @Override      public void onClick(View v) {        dialog.dismiss();      }    });  }
0 0
原创粉丝点击