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

news/2024/11/29 9:00:21/

资料来源: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() {@Overridepublic void surfaceCreated(SurfaceHolder holder) {try {cameraSource.start(cameraView.getHolder());} catch (IOException ie) {Log.e("CAMERA SOURCE", ie.getMessage());}}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {cameraSource.stop();}
});barcodeDetector.setProcessor(new Detector.Processor<Barcode>() {@Overridepublic void release() {}@Overridepublic 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


http://www.ppmy.cn/news/703681.html

相关文章

springboot错误总结一

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘documentationPluginsBootstrapper’ defined in URL [jar:file:/C:/Users/Administrator/.m2/repository/io/springfox/springfox-spring-web/2.8.0/springfox-spring-we…

使用EL表达式时Tomact报错:javax.el.PropertyNotFoundException: 类型[java.lang.String]上找不到属性[snum]

最近在做一个项目时&#xff0c;遇到tomcat报错 “javax.el.PropertyNotFoundException:类型[java.lang.String]上找不到属性[XXX] 去百度了一下&#xff0c;总结出以下原因&#xff1a; 1 . 可能是你的javabean里面xxx属性出问题&#xff0c;检查以下你的get方法写法是否写…

解决Mysql 主从或主主报1062错误

1062错误——主键冲突&#xff0c;出现这种情况就是从库出现插入操作&#xff0c;主库又插入相同的数据&#xff0c;iothread没问题&#xff0c;sqlthread出错 处理此种错误一般有两种思路&#xff1a; 1、直接跳过错误执行语句 2、找到错误执行语句&#xff0c;修复主库2数据 …

C++刷题错误集锦

AddressSanitizer: heap-buffer-overflow on address 堆缓存移除&#xff0c;数组访问越界了。C之invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’ 函数原型上参数是int类型&#xff0c;但是在调用函数的时候却是“int&am…

ZUCC数据库原理 第二部分开发 实验6

实验6 JDBC进阶&#xff08;3&#xff09; 一、相关知识点 1、JDBC基本概念 2、批处理 3、DAO和OR映射 二、实验目的&#xff1a; 掌握批量SQL语句执行的方法&#xff0c;理解DAO和ORM的基本概念 三、实验内容&#xff1a; 利用批量SQL语句执行的方法实现实验5中的最后两…

实验记录 | 6/29

使用scSplitter拆分10X 的数据的时候&#xff0c;出现了问题。 EXITING because of FATAL ERROR in reads input: quality string length is not equal to sequence length ST-K00126:608:HWNLJBBXX:6:2115:23480:3459 ST-K00126:608:HWNLJBBXX:6:1212:4005:42513 2:N:0:GATCTC…

php code128条码,PHP教程:php实现生成code128条形码的方法详解

《PHP教程&#xff1a;php实现生成code128条形码的方法详解》要点&#xff1a; 本文介绍了PHP教程&#xff1a;php实现生成code128条形码的方法详解&#xff0c;希望对您有用。如果有疑问&#xff0c;可以联系我们。 本文实例讲述了php实现生成code128条形码的方法.分享给大家供…

硬件检测信息记录

硬盘&#xff1a;东芝 THNSNJ128GCSY (固态硬盘 [基础信息] ---------------------------------------------------------------------------------- 名称 东芝 THNSNJ128GCSY (固态硬盘) 容量 128 GB 磁盘已使用 共 1604 …