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
- ZXing扫码
- Zxing扫码流程梳理
- ios zxing扫码问题
- Android Camera相关及zxing扫码
- 使用zxing扫码打开闪光灯
- Android Zxing 二维码扫码性能优化
- zxing私人定制之一 初试扫码
- ZXing 扫码 图片变形问题
- Android Zxing 二维码扫码性能优化
- zxing打开扫码页面,黑屏问题
- zxing扫码工具相机变形解决方法
- 关于zxing扫码界面的优化
- Android Camera结合Zxing优化扫码
- ZXing笔记(2)—portrait ZXing,竖直扫码
- ZXing扫二维码,变形
- ZXING-二维码扫面
- 使用 ZXing Android Embedded 实现二维码扫码
- 【Android】zxing扫码识别及生成二维码
- lua语言中矩阵下标为负值的含义
- EventBus使用详解(二)—— EventBus使用进阶
- iOS 整体项目竖屏 相机横屏
- 关于OpenCV的那些事——画AR物体(单目控制)
- 通用权限2篇
- ZXing扫码
- 2015.08.17_自定义控件步骤(自我总结)
- C#语法之比较
- 从MVC到前后端分离
- GCC编译选项
- POJ1742.Coins(背包DP && 男人八题)
- ScrollView解决占满问题
- javascript走马灯广告的实现
- CDS 网络通信,异常重启---调试