`
xuanzhui
  • 浏览: 196506 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Android扫描二维码

 
阅读更多

       这里主要介绍一款控件 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);
 效果图
  • 大小: 3.1 MB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics