这里主要介绍一款控件 zxing-android-embedded 。
直接使用 ZXing 当然也不是不可以,甚至zxing现在也提供了android-integration,但是需要用户下载zxing的安卓应用,而该应用功能又有些冗余,于是很多blog都提供了一些精简的步骤,但是,一定程度上增加了开发负担,此时正是 zxing-android-embedded 派的上用场的时候。
建议先下载该控件的demo,运行后有个直观的感受,如果demo里面的例子已经满足个人的需求,直接把对应的activity加到自己的工程即可,比如提供的 CustomScannerActivity.java 就是一个正方形的竖屏的扫码框,在 AndroidManifest.xml 中添加
<activity android:name=".CustomScannerActivity" android:screenOrientation="fullSensor" android:stateNotNeeded="true" android:theme="@style/zxing_CaptureTheme" android:windowSoftInputMode="stateAlwaysHidden"> </activity>
在需要使用扫码的activity中初始化,并调用
IntentIntegrator integrator = new IntentIntegrator(this); //是否播放提示音 integrator.setBeepEnabled(true); //是否保留扫码成功时候的截图 //integrator.setBarcodeImageEnabled(true); //调用 integrator.setCaptureActivity(CustomScannerActivity.class).initiateScan();
设置扫码结果的回调
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data); if(result != null) { if(result.getContents() == null) { Toast.makeText(this, "您取消了扫描", Toast.LENGTH_LONG).show(); } else { //二维码的实际内容 String content = result.getContents(); //如果你在调用扫码的时候setBarcodeImageEnabled(true) //通过下面的方法获取截图的路径 String imgPath = result.getBarcodeImagePath(); } } else { Log.d(TAG, "Weird"); super.onActivityResult(requestCode, resultCode, data); } }
以下主要介绍如何定制化扫码框,比如添加四个直角:
比较好的做法是通过Android Studio将下载的 zxing-android-embedded 作为module加入到工程中,在主module中添加gradle依赖
compile(project(':zxing-android-embedded')) { transitive = true }在 package com.journeyapps.barcodescanner 中找到 ViewfinderView,修改 onDraw 方法,以下给出核心代码,具体参考附件
float density = getContext().getResources().getDisplayMetrics().density; //画扫描框边上的角,总共8个部分 //四个边角对应的宽度 int CORNER_WIDTH = (int) (3 * density); int CORNER_LEN = (int) (25 * density); paint.setColor(laserColor); canvas.drawRect(frame.left, frame.top, frame.left + CORNER_LEN, frame.top + CORNER_WIDTH, paint); canvas.drawRect(frame.left, frame.top, frame.left + CORNER_WIDTH, frame.top + CORNER_LEN, paint); canvas.drawRect(frame.right - CORNER_LEN, frame.top, frame.right, frame.top + CORNER_WIDTH, paint); canvas.drawRect(frame.right - CORNER_WIDTH, frame.top, frame.right, frame.top + CORNER_LEN, paint); canvas.drawRect(frame.left, frame.bottom - CORNER_WIDTH, frame.left + CORNER_LEN, frame.bottom, paint); canvas.drawRect(frame.left, frame.bottom - CORNER_LEN, frame.left + CORNER_WIDTH, frame.bottom, paint); canvas.drawRect(frame.right - CORNER_LEN, frame.bottom - CORNER_WIDTH, frame.right, frame.bottom, paint); canvas.drawRect(frame.right - CORNER_WIDTH, frame.bottom - CORNER_LEN, frame.right, frame.bottom, paint);效果图