ZBar扫码

来源:互联网 发布:华为抢购软件神器 编辑:程序博客网 时间:2024/04/25 02:39

引用的库

barcodescanner

引入jar和jni文件,文件结构为
这里写图片描述

修改布局

  • ViewFinderView的updateFramingRect方法更改扫码框大小
//            width = findDesiredDimensionInRange(PORTRAIT_WIDTH_RATIO,//                    viewResolution.x, MIN_FRAME_WIDTH, PORTRAIT_MAX_FRAME_WIDTH);//            height = findDesiredDimensionInRange(PORTRAIT_HEIGHT_RATIO,//                    viewResolution.y, MIN_FRAME_HEIGHT, PORTRAIT_MAX_FRAME_HEIGHT);            width = (int) (496.0 / 720 * getWidth());            height = width;int leftOffset = (viewResolution.x - width)  /  2;        int topOffset = (viewResolution.y - height)  /  3;
  • 更改四个角
public void drawViewFinderBorder(Canvas canvas) {//        canvas.drawLine(mFramingRect.left - 1, mFramingRect.top - 1,//                mFramingRect.left - 1, mFramingRect.top - 1 + mBorderLineLength, mBorderPaint);//        canvas.drawLine(mFramingRect.left - 1, mFramingRect.top - 1,//                mFramingRect.left - 1 + mBorderLineLength, mFramingRect.top - 1, mBorderPaint);////        canvas.drawLine(mFramingRect.left - 1, mFramingRect.bottom + 1,//                mFramingRect.left - 1, mFramingRect.bottom + 1 - mBorderLineLength, mBorderPaint);//        canvas.drawLine(mFramingRect.left - 1, mFramingRect.bottom + 1,//                mFramingRect.left - 1 + mBorderLineLength, mFramingRect.bottom + 1, mBorderPaint);////        canvas.drawLine(mFramingRect.right + 1, mFramingRect.top - 1,//                mFramingRect.right + 1, mFramingRect.top - 1 + mBorderLineLength, mBorderPaint);//        canvas.drawLine(mFramingRect.right + 1, mFramingRect.top - 1,//                mFramingRect.right + 1 - mBorderLineLength, mFramingRect.top - 1, mBorderPaint);////        canvas.drawLine(mFramingRect.right + 1, mFramingRect.bottom + 1,//                mFramingRect.right + 1, mFramingRect.bottom + 1 - mBorderLineLength, mBorderPaint);//        canvas.drawLine(mFramingRect.right + 1, mFramingRect.bottom + 1,//                mFramingRect.right + 1 - mBorderLineLength, mFramingRect.bottom + 1, mBorderPaint);        canvas.drawRect(mFramingRect.left, mFramingRect.top, mFramingRect.left + screenRate,                mFramingRect.top + CORNER_WIDTH, mLaserPaint);        canvas.drawRect(mFramingRect.left, mFramingRect.top, mFramingRect.left + CORNER_WIDTH, mFramingRect.top                + screenRate, mLaserPaint);        canvas.drawRect(mFramingRect.right - screenRate, mFramingRect.top, mFramingRect.right,                mFramingRect.top + CORNER_WIDTH, mLaserPaint);        canvas.drawRect(mFramingRect.right - CORNER_WIDTH, mFramingRect.top, mFramingRect.right, mFramingRect.top                + screenRate, mLaserPaint);        canvas.drawRect(mFramingRect.left, mFramingRect.bottom - CORNER_WIDTH, mFramingRect.left                + screenRate, mFramingRect.bottom, mLaserPaint);        canvas.drawRect(mFramingRect.left, mFramingRect.bottom - screenRate,                mFramingRect.left + CORNER_WIDTH, mFramingRect.bottom, mLaserPaint);        canvas.drawRect(mFramingRect.right - screenRate, mFramingRect.bottom - CORNER_WIDTH,                mFramingRect.right, mFramingRect.bottom, mLaserPaint);        canvas.drawRect(mFramingRect.right - CORNER_WIDTH, mFramingRect.bottom - screenRate,                mFramingRect.right, mFramingRect.bottom, mLaserPaint);    }
  • 中间的扫描线
public void drawLaser(Canvas canvas) {         //   Draw a red "laser scanner" line through the middle to show decoding is active//        mLaserPaint.setAlpha(SCANNER_ALPHA[scannerAlpha]);//        scannerAlpha = (scannerAlpha + 1) % SCANNER_ALPHA.length;//        int middle = mFramingRect.height() / 2 + mFramingRect.top;//        canvas.drawRect(mFramingRect.left + 2, middle - 1, mFramingRect.right - 1, middle + 2, mLaserPaint);//        postInvalidateDelayed(ANIMATION_DELAY,                mFramingRect.left - POINT_SIZE,                mFramingRect.top - POINT_SIZE,                mFramingRect.right + POINT_SIZE,                mFramingRect.bottom + POINT_SIZE);        // 滚动的绿线        slideTop += SPEEN_DISTANCE;        if (slideTop >= mFramingRect.bottom) {            slideTop = mFramingRect.top;        }        canvas.drawRect(mFramingRect.left + MIDDLE_LINE_PADDING, slideTop - MIDDLE_LINE_WIDTH / 2,                mFramingRect.right - MIDDLE_LINE_PADDING, slideTop + MIDDLE_LINE_WIDTH / 2, mLaserPaint);    }
  • BarcodeScannerView.java的setupLayout方法添加扫码框下的文字
if (mViewFinderView instanceof View) {            addView((View) mViewFinderView);            RelativeLayout relativeLayout1 = new RelativeLayout(getContext());            TextView textView = new TextView(getContext());            textView.setText(getContext().getString(R.string.scan_qrcode));            textView.setTextColor(Color.WHITE);            textView.setTextSize(NUM15);            textView.setGravity(Gravity.CENTER_HORIZONTAL);            relativeLayout1.addView(textView);            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(                    ViewGroup.LayoutParams.MATCH_PARENT,                    ViewGroup.LayoutParams.WRAP_CONTENT);            layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);            // ViewFinderView里定义了扫码框的尺寸位置,这里根据那里算出来的            int height = (int) (496.0 / 720 * PhoneInfoUtil.getScreenPix(getContext()).widthPixels);            int topOffset = (PhoneInfoUtil.getScreenPix(getContext()).heightPixels - height)  /  NUM3;            int textTopMargin = height + topOffset + 10;            layoutParams.setMargins(0, textTopMargin, 0, 0);            textView.setLayoutParams(layoutParams);            addView(relativeLayout1);        } else {            throw new IllegalArgumentException("IViewFinder object returned by "                    + "'createViewFinderView()' should be instance of android.view.View");        }

重新扫码&拍照权限被拒绝的处理

  • BarcodeScannerView的
    public void startCamera() {        startCamera(CameraUtils.getCameraInstance());    }    public void startCamera(Camera camera) {        mCamera = camera;        if (mCamera != null) {            mViewFinderView.setupViewFinder();            mPreview.setCamera(mCamera, this);            mPreview.initCameraPreview();        }    }

没有拍照权限时,mCamera是null,所以修改两个方法,返回Camera对象
重新扫码也是调用这个方法即可

  • 扫码的Activity需要实现ZBarScannerView.ResultHandler
    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        mScannerView = new ZBarScannerView(this);        // 只识别二维码        List<BarcodeFormat> list = new ArrayList<>();        list.add(BarcodeFormat.QRCODE);        mScannerView.setFormats(list);        setContentView(mScannerView);    }    @Override    public void onResume() {        super.onResume();        mScannerView.setResultHandler(this); // Register ourselves as a handler for scan results.        if (mScannerView.startCamera() == null) {            // 拍照权限被拒绝时,返回值为null            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();                }            });        }        mScannerView.setAutoFocus(true); // 自动聚焦    }    @Override    public void onPause() {        super.onPause();        mScannerView.stopCamera();           // Stop camera on pause    }
0 0