野人学Android第二弹——利用Zxing实现二维码效果的步骤讲解

原创 2015年11月18日 16:00:44

如今,不管是微信还是淘宝,越来越多的app会加入二维码扫描的功能,那么二维码的生成和解析怎么实现呢?我首先想到的是,这么流行的功能,一定有第三方类,果不其然,在百度之后,发现google已经将二维码的功能封装成zxing类,并且已经相当成熟。自然而然,只要将这个类添加到我的app项目中,就ok了。

思路很简单,但是现实很骨感。刚开始接触zxing的时候,无从下手,百度了很多博客,有些细节没有讲全,有些讲的含糊,我花了好几天才将zxing运行成功。现在回过头来,将这些知识细细咀嚼后,整理成通俗易懂的步骤,让刚学Android的童鞋,能快速地享受zxing带来的效果。

第一步,下载zxing代码包

本来想在官方上下载的,但是下载出现了错误,下载不了,那么我就将我这里的zxing核心包上传吧。下载地址

第二步,导入core.jar核心包


将zxing.jar核心包复制到libs文件夹下,系统会自动将zxing.jar导入到Android Private Libraries中,就这么简单。在刚开始接触zxing的时候,各种博客的说法不一致,导致我花了很多的时间来研究这个。将核心包导入到这里,是为了下一步埋下伏笔。

第三步,导入关键class文件


网络上很多的教程中,都将zxing的class类分门别类,但是在实际的开发中,二维码作为app的一个功能,未免有点多余。综合考虑,我还是将关键的代码放在一个包内,这样给app的其他功能腾出了空间。这些关键的代码主要实现的是二维码的扫描,至于二维码的生成则不包括在内。PS:关键代码可以点击这个链接

第四步,排错


导入上面的核心包和关键代码文件之后,你会发现有很多的错误。最主要的错误就是包名引用错误的问题。除了一个一个修改,别无法他法。将这些错误修改后,还存在一个问题,就是找不到相应的文件。正如上面的图片所示,这些文件需要添加到res文件夹下。

beep.ogg是一个音频文件,是当你扫描成功之后的音频效果,这个你可以自己定义。

ids.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--
 Copyright (C) 2008 ZXing authors

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->
<resources>

    <item name="decode" type="id"/>
    <item name="decode_failed" type="id"/>
    <item name="decode_succeeded" type="id"/>
    <item name="quit" type="id"/>
    <item name="restart_preview" type="id"/>
    <item name="return_scan_result" type="id"/>

</resources>

除此之外,在layout文件夹下还需要添加activity_capture.xml。

activity_capture.xml

<?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:background="@android:color/transparent"
    android:orientation="vertical" >

    <SurfaceView
        android:id="@+id/capture_preview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <RelativeLayout
        android:id="@+id/capture_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <ImageView
            android:id="@+id/capture_mask_top"
            android:layout_width="match_parent"
            android:layout_height="120dp"
            android:layout_alignParentTop="true"
            android:background="@drawable/shadow" />

        <RelativeLayout
            android:id="@+id/capture_crop_view"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:layout_below="@id/capture_mask_top"
            android:layout_centerHorizontal="true"
            android:background="@drawable/qr_code_bg" >

            <ImageView
                android:id="@+id/capture_scan_line"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_marginBottom="5dp"
                android:layout_marginTop="5dp"
                android:src="@drawable/scan_line" />
        </RelativeLayout>

        <ImageView
            android:id="@+id/capture_mask_bottom"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_below="@id/capture_crop_view"
            android:background="@drawable/shadow" />

        <ImageView
            android:id="@+id/capture_mask_left"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_above="@id/capture_mask_bottom"
            android:layout_alignParentLeft="true"
            android:layout_below="@id/capture_mask_top"
            android:layout_toLeftOf="@id/capture_crop_view"
            android:background="@drawable/shadow" />

        <ImageView
            android:id="@+id/capture_mask_right"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_above="@id/capture_mask_bottom"
            android:layout_alignParentRight="true"
            android:layout_below="@id/capture_mask_top"
            android:layout_toRightOf="@id/capture_crop_view"
            android:background="@drawable/shadow" />
    </RelativeLayout>

</RelativeLayout>


第五步,权限配置

二维码扫描这个功能的实现,涉及到了很多的权限。我本来想直接告诉答案的,但是想想还是算了。如果你不知道该配置哪些权限,那就先去测试下程序,看看日志中会报什么错误,然后一步步添加就可以了。

第六步,Activity中的使用

先讲一下使用的基本思路:在MainActivity中使用Intent(),将信息传递到CaptureActivity,然后用onActivityResult()接收调回的信息。

private Button bt;
private TextView tv;
private int REQUEST_CODE=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
<span style="white-space:pre">	</span>super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt = (Button) findViewById(R.id.button1);
        tv = (TextView) findViewById(R.id.textView1);
        bt.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Intent intent = new Intent(MainActivity.this,CaptureActivity.class);
				startActivityForResult(intent, REQUEST_CODE);
			}
		});
    }
    @Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		 if (requestCode==REQUEST_CODE){
	            if(resultCode==RESULT_CANCELED)
	                  setTitle("cancle");
	            else if (resultCode==RESULT_OK) {
	                 String temp=null;
	                 Bundle bundle=data.getExtras();
	                 if(bundle!=null){
	                	 temp=bundle.getString("result");
	                	 tv.setText(temp);	 
	                 }
	            }
	        }
	}

写到这里,Zxing应该能正常运行了。如果报错的话,那么耐心地调试下就可以了。如果你觉得不够个性,想自己自定义下,那么网上有很多教程,请自行百度。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android zxing,轻松实现二维码扫描、生成

Android  zxing,轻松实现二维码扫描、生成      现在很多App都集成了扫一扫功能,最常用的微信、QQ、手机助手等。二维码也使得生活变得更加简洁,扫一扫订餐、扫一扫...
  • zhihui1017
  • zhihui1017
  • 2017年04月13日 14:08
  • 3168

Android实战——Zxing实现二维码扫描

教你用Zxing实现二维码扫描 前言: 本篇文章从初学者的角度出发,从一个不知道对二维码扫描怎么下手的工作者,需要一个简单的扫描功能的话,可以阅读该篇文章。作为Google开源框架Zxing,里面...
  • qq_30379689
  • qq_30379689
  • 2016年09月02日 10:17
  • 20713

Android二维码扫描模块可简单集成(基于ZXIng实现)

Android二维码扫描模块可简单集成(基于ZXing实现)
  • M075097
  • M075097
  • 2017年11月14日 20:57
  • 424

Android基于Zxing实现二维码,条形码扫描和生成二维码

由于模拟器原因,所以无法看到二维码扫描功能,这个在真机上测试时完全没有问题,当你扫描一个二维码完成后会自动返回到主页面将结果显示到“扫描内容”模块; 然后下面的就是生成二维码; 这两个功能...
  • Zheng_Jiao
  • Zheng_Jiao
  • 2016年05月26日 14:38
  • 1723

Android zxing 二维码扫描和生成方法(简单版)

前言二维码大家都见识过,这里就不废话了,直接来干货。步骤 导入依赖 compile 'com.google.zxing:core:3.2.1' //zxing核心依赖 com...
  • D_Russell
  • D_Russell
  • 2017年07月31日 14:05
  • 1029

Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,...
  • xiaanming
  • xiaanming
  • 2013年08月21日 23:48
  • 318961

利用开源框架ZXing增加二维码功能(by 星空武哥)

很多时候我们的项目中或用到二维的扫描功能,今天我就交给大家怎么利用开源ZXing,来扫描二维码? 这是个ZXing是精简版的,全版太大了,里面保留的扫描二维码和创建二维码。 http://pan.ba...
  • lsyz0021
  • lsyz0021
  • 2016年04月27日 12:29
  • 1686

基于Zxing的二维码生成和二维码扫描

最近又在倒腾二维码,
  • xiaorenwu1206
  • xiaorenwu1206
  • 2014年08月19日 17:15
  • 25682

android 中使用Zxing实现二维码的解码和二维码的生成

原创博文,转载请标明出处:http://www.cnblogs.com/mythou/p/3280023.html 已测试  --  绝对靠谱   今天讲一下目前移动领域很常用的技术——二维码。...
  • LK1105010206
  • LK1105010206
  • 2015年12月17日 09:04
  • 1320

Android基于google ZXing的简化版BarCodeTest实现二维码的扫描及简单的网页跳转

对于二维码扫描我们使用的是google的开源框架Zxing,我们可以去http://code.google.com/p/zxing/下载源码和Jar包或者可以去https://github.com/z...
  • flyrunlx
  • flyrunlx
  • 2016年05月23日 20:43
  • 1834
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:野人学Android第二弹——利用Zxing实现二维码效果的步骤讲解
举报原因:
原因补充:

(最多只允许输入30个字)