野人学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高级控件(三)—— 使用Google ZXing实现二维码的扫描和生成相关功能体系

标签: androidgithub二维码控件谷歌 2016-02-17 22:07 2045人阅读 评论(10) 收藏 举报  分类: Android(110)  ...

Android开发之google Zxing实现二维码扫描的代码分析

1.技术简介    在Android中实现二维码的扫描主要是通过第三方框架来实现的,主要框架是google的Zxing。现在就用该框架来实现二维码及条形码的扫描及识别,同时对于手机中存储的图片也进行...
  • IThtt
  • IThtt
  • 2017年08月11日 09:32
  • 595

利用开源ZXing项目实现条形码和二维码扫描识别 —— Android端

前言     首先使用ZXing项目前我们需要对其进行简化,因为开源的ZXing项目中Android实现里面有太多多余的东西了,得对其进行简化,并且原始的ZXing项目扫描框并不美观所以也要对其进行自...

Android 基于google Zxing实现二维码的生成,识别和长按识别的效果

最近项目用到了二维码的生成与识别,之前没有接触这块,然后就上网搜了搜,发现有好多这方面的资源,特别是google Zxing对二维码的封装,实现的已经不错了,可以直接拿过来引用,下载了他们的源码后,只...

Android高级控件(三)—— 使用Google ZXing实现二维码的扫描和生成相关功能体系

Android高级控件(三)—— 使用Google ZXing实现二维码的扫描和生成相关功能体系摘要 现在的二维码可谓是烂大街了,到处都是二维码,什么都是二维码,扫一扫似乎已经流行到习以为常了,今...

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

原帖:http://blog.csdn.net/qq_30379689/article/details/52411489 Zxing实现二维码扫描 前言...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:野人学Android第二弹——利用Zxing实现二维码效果的步骤讲解
举报原因:
原因补充:

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