Google Play服务中的条码扫描识别

资料来源:Reading QR Codes Using the Mobile Vision API
最近的Google Play services SDK版本使得安卓开发者能创建识别二维码的app。
这个文章,将说明怎么来使用它。

必要环境:
最新版本的android studio
带相册的安卓设备

1.安装Google Play Services SDK
在项目的配件文件build.gradle中加入下列这句:

compile 'com.google.android.gms:play-services:7.8.0'

当你点击了Sync Now同步后,可能会报如下错误:
点击 Install repository and sync project 安装sdk

2.修改mainfest
在AndroidManifest.xml中加入下列代码,当你运行app时,它将会自动加入二维码库

<meta-data android:name="com.google.android.gms.vision.DEPENDENCIES" android:value="barcode"/>

权限也是必须的:

<uses-permission android:name="android.permission.CAMERA" />

3.从图片中识别二维码
先在assets目录中加入一张带二维码的图片,这里命名为 myqrcode.jpg。
1)将图片读取后生成Bitmap对象
因为api接口需要将Bitmap做为参数,所以得先把图片转成Bitmap。
参考下列代码:

Bitmap myQRCode = BitmapFactory.decodeStream(getAssets().open("myqrcode.jpg"));

2)创建识别对象
通过创建BarcodeDetector的实例对象来识别二维码(or 条形码)。
获取BarcodeDetector实例代码:

BarcodeDetector barcodeDetector = 
    new BarcodeDetector.Builder(this)
    .setBarcodeFormats(Barcode.QR_CODE)
    .build();        
注意这里默认是识别支持的条形码的。修改setBarcodeFormats 来指明需要识别的目标类型。

3)识别
通过早前的Bitmap 对象来创建Frame对象

Frame myFrame = new Frame.Builder()
        .setBitmap(myQRCode)
        .build();    

通过调用BarcodeDetector的detect方法来识别图片并生成一个带所有二维码信息的SparseArray

SparseArray<Barcode> barcodes = barcodeDetector.detect(myFrame);

每个item都是一个条码对象。其中的displayValue 字段是识别后的信息,可以打印看看。

if(barcodes.size() != 0) {

    // 打印扫描结果
    Log.d("My QR Code's Data", 
        barcodes.valueAt(0).displayValue
    );
}

4.通过相机扫描识别
用相机来扫描识别二维码也是非常简单的。
下列写一个测试例子:

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:padding="16dp">

    <SurfaceView
        android:layout_width="640px"
        android:layout_height="480px"
        android:layout_centerVertical="true"
        android:layout_alignParentLeft="true"
        android:id="@+id/camera_view"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/code_info"
        android:layout_toRightOf="@+id/camera_view"
        android:textSize="20sp"
        android:layout_marginLeft="16dp"
        android:text="Nothing to read."
        android:layout_alignParentTop="true"
        />

</RelativeLayout>

activity主要代码:

cameraView = (SurfaceView)findViewById(R.id.camera_view);
barcodeInfo = (TextView)findViewById(R.id.code_info);

barcodeDetector = 
    new BarcodeDetector.Builder(this)
    .setBarcodeFormats(Barcode.QR_CODE)
    .build();

cameraSource = new CameraSource
                .Builder(this, barcodeDetector)
                .setRequestedPreviewSize(640, 480)
                .build();

                cameraView.getHolder().addCallback(new SurfaceHolder.Callback() {
    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        try {
            cameraSource.start(cameraView.getHolder());
        } catch (IOException ie) {
            Log.e("CAMERA SOURCE", ie.getMessage());
        }

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        cameraSource.stop();
    }
});

barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {
    @Override
    public void release() {
    }

    @Override
    public void receiveDetections(Detector.Detections<Barcode> detections) {

        final SparseArray<Barcode> barcodes = detections.getDetectedItems();

        if (barcodes.size() != 0) {
        // 因为receiveDetections在非UI线程中执行
            barcodeInfo.post(new Runnable() {    
                public void run() {
                    barcodeInfo.setText(    
                            barcodes.valueAt(0).displayValue
                    );
                }
            });
        }

    }
});

运行app后,可以看到app能很快的识别出二维码。
这里写图片描述

结论:
这篇文章主要讲述怎么通过mobile vision api来识别带二维码的图片或用相机扫描识别二维码。
当然也可以识别其它商品条形码类似UPC-A and EAN-13。
如要学习更多的mobile vision API,请阅读官方文档:documentation

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值