Android利用ZXing扫描二维码的实例代码解析,使用Zxing实现二维码及优化实例

相关阅读:

Android项目实战(二十八):使用Zxing实现二维码及优化实例

作者:听着music睡 字体:[增加 减小] 类型:转载
时间:2016-11-21 我要评论

这篇文章主要介绍了Android项目实战(二十八):使用Zxing实现二维码及优化实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

前言:

多年之前接触过zxing实现二维码,没想到今日项目中再此使用竟然使用的还是zxing,百度之,竟是如此牛的玩意。

当然,项目中我们也许只会用到二维码的扫描和生成两个功能,所以不必下载完整的jar包,使用简化版的即可,下文可见。

这篇文章讲述:

1、如果快速在项目中集成zxing,实现扫描和生成二维码功能                 

2、根据项目需求去修改源码实现我们的要求并进行优化

一、快速集成zxing二维码

1、下载库文件
: ,

下载完成后可以看到:冠亚体育手机网站 1

我们从这些文件中拷贝需要的到自己的项目中,下面开始:

  ①、res 目录下 : raw文件夹 整个复制到个人项目相对位置

  ②、res –>
values目录下:ids.xml文件中的内容全部复制到个人项目相对位置,个人项目没有则直接复制文件到相对位置

  ③、res –>
values目录下:colors.xml文件中的内容全部复制到个人项目的相对位置

  ④、res –> layout目录下:camera.xml
布局文件复制到个人项目相对位置

  ⑤、res –> drawable_mdpi
目录下:navbar.9.png图片复制到个人项目相对位置,这张图片是标题栏背景图片,这里建议先改成navbar.png
不要使用.9图片

  ⑥、libs目录下:zxing.jar文件复制到个人项目相对位置,并且右键点击as
library

  ⑦、src –> com目录下:zxing 文件夹复制到个人项目相对位置
,会报错,修改R的目录结构即可

  ⑧、AndroidManifest.xml文件中 添加
(二维码扫描activity,这个需要后面自己去修改,用于实现自己的要求)

?

1
<activity android:name="com.zxing.activity.CaptureActivity"/>

⑨、AndroidManifest.xml文件中 添加权限  

?

1
2
3
4
5
<uses-permission android:name="android.permission.CAMERA" />
  <uses-permission android:name="android.permission.VIBRATE" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

2、准备工作完成了,下面开始写demo

现在需求是一个主界面MainActivity.java 里面有两个按钮,分别跳转
生成二维码界面和
扫描二维码界面冠亚体育手机网站 2
然后分别开始写两个activity功能的实现:

①、 生成二维码

先写布局文件  ,一个图片 , 一个开始生成按钮 ,
一个输入框(二维码需要根据文本信息生成,没有文本信息无法生成)
activity_create.xml

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context="com.maiji.zxingdemo.CreateActivity">
 
 
  <ImageView
    android:id="@+id/create_img"
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:scaleType="fitXY"
    android:layout_gravity="center_horizontal"
    />
 
  <Button
    android:id="@+id/create_btn"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:text="开始生成二维码"
    />
 
  <EditText
    android:id="@+id/create_edit"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
</LinearLayout>

activity代码: 代码比较简单 ,不在此解释了

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
private ImageView create_img;
  private Button create_btn;
  private EditText create_edit;
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_create);
 
    initView();
    initEvent();
 
  }
 
  private void initEvent() {
    create_btn.setOnClickListener(this);
  }
 
  private void initView() {
    create_img = (ImageView) findViewById(R.id.create_img);
    create_btn = (Button) findViewById(R.id.create_btn);
    create_edit = (EditText) findViewById(R.id.create_edit);
  }
 
  @Override
  public void onClick(View v) {
    switch (v.getId()){
      case R.id.create_btn:
        String content = "" ;
        if (create_edit.getText().toString().equals("")){
          Toast.makeText(this,"请输入二维码信息",Toast.LENGTH_SHORT).show();
          return;
        }
        content = create_edit.getText().toString();
        try {
          //生成二维码图片,第一个参数是二维码的内容,第二个参数是正方形图片的边长,单位是像素
          Bitmap qrcodeBitmap = EncodingHandler.createQRCode(content, 800);
          if (qrcodeBitmap!=null) {
            create_img.setImageBitmap(qrcodeBitmap);
          }else{
            Toast.makeText(this,"生成二维码失败",Toast.LENGTH_SHORT).show();
          }
        } catch (Exception e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        break;
    }
  }
 
  public byte[] Bitmap2Bytes(Bitmap bm) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
    return baos.toByteArray();
  }

效果图:
冠亚体育手机网站 3

②、扫描二维码

这个就更简单了,只需要打开一个zxing提供的activity
然后获取到扫描得到的字符串即可

看ScanActivity(扫描Activity)的关键代码

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private TextView zxing_content;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_scan);
  zxing_content = (TextView) findViewById(R.id.zxing_content);
  Intent startScan = new Intent(this,CaptureActivity.class);
  startActivityForResult(startScan, 0); //实际打开了一个zxing提供给我们的扫描activity,当然我们后面会对这个activity进行一些优化修改
 
}
 
/**
 * 扫一扫,成功后返回值进行判断
 */
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  if (resultCode == -1) {
    String result = data.getExtras().getString("result");
    zxing_content.setText(result); //显示扫描二维码得到的数据
  }
}

布局文件:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  tools:context="com.maiji.zxingdemo.ScanActivity">
 
  <TextView
    android:id="@+id/zxing_content"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:textSize="30sp"
    />
</RelativeLayout>

效果图:
冠亚体育手机网站 4

二、修改源码,实现项目的需求

1、修改扫描二维码的界面

对应的是 zxing–>activity–>CaptureActivity.java   ,布局文件为
camera.xml

所以修改界面只需要在 camera.xml文件中修改即可。

无非就是把原来的“CANCEL”取消按钮去掉,把顶部的标题栏换一下。

布局里面有一个 <SurfaceView>控件
用于显示相机拍出的画面预览,这里可以根据需求改是全界面显示还是显示局部

<com.zxing.view.ViewfinderView>控件,即扫描框,默认的是宽高比1:1.5,实际需要修改宽高,在下面介绍

2、修改扫描框的宽高

第1步操作做完之后会发现,我们没法修改扫描框的宽高。

修改扫描框宽高很简单,找到 zxing–>camera–>CameraManager.java
文件

这里较为顶部的代码中看到:

?

1
2
3
4
private static final int MIN_FRAME_WIDTH = 240;
private static final int MIN_FRAME_HEIGHT = 240;
private static final int MAX_FRAME_WIDTH = 480;
private static final int MAX_FRAME_HEIGHT = 480;

这四个属性的值即扫描框的宽高,然后可以根据需求直接修改,当然这个值在不同分辨率的设备上宽高不一致
, 有需要的话可以进行一下单位转换

?

1
2
3
4
public static int Dp2Px( Context context,float dp) {
 final float scale = context.getResources().getDisplayMetrics().density;
 return (int) (dp * scale + 0.5f);
}

 效果图:
我修改了扫描框的最小最大宽高分别一致,并且载camera.xml布局中删去了“CANCEL”取消按钮冠亚体育手机网站 5

 3、给扫描框添加文字提示

看一下微信的扫描界面,会发现扫描框下面有一段文字提示。
那么我们这里没有,需要添加

找到zxing–>view–>Viewfinderview.java

这里是自定义扫描框的类

找到代码:

?

1
2
3
canvas.drawRect(frame.left + 2, middle - 1, frame.right - 1, middle + 2, paint);
 
  Collection<ResultPoint> currentPossible = possibleResultPoints;

在这两行代码之间我们画上文字提示

?

1
2
3
4
5
6
7
8
9
10
canvas.drawRect(frame.left + 2, middle - 1, frame.right - 1, middle + 2, paint);
    TextPaint textPaint = new TextPaint();
   textPaint.setARGB(0xFF, 0xFF, 0xFF,0xFF);  //字体颜色
   textPaint.setTextSize(32);  //字体大小
   textPaint.setAntiAlias(true); //设置抗锯齿,否则字迹会很模糊
   StaticLayout layout = new StaticLayout("将二维码放入框内,即可自动扫描",textPaint,
       frame.right-frame.left, Layout.Alignment.ALIGN_NORMAL,1.0F,0.0F,true);
   canvas.translate(frame.left+5, (float) (frame.bottom + (float)30)); //绘制起始位置
   layout.draw(canvas);
   Collection<ResultPoint> currentPossible = possibleResultPoints;

然后在看下扫描界面效果图:
冠亚体育手机网站 6

4、解决扫描界面相机预览拉伸变形问题

实现了上面几步的优化,仔细的同学可能会发现,如果我们给SurfaceView设置全屏显示(可以看到的相机画面很多),会发现相机拍摄出来的预览图有些拉伸变形

原因:zxing横屏变竖屏之后,Camera的代码还是采用的横屏代码设置的参数

优化方法:找到 zxing–>camera–> CameraConfigurationManager.java

?

1
2
3
4
5
6
7
8
9
initFromCameraParameters方法中,在 Log.d(TAG, "Screen resolution: " + screenResolution);这句之后增加
Point screenResolutionForCamera = new Point();
screenResolutionForCamera.x = screenResolution.x;
screenResolutionForCamera.y = screenResolution.y;
     
if (screenResolution.x < screenResolution.y) {
screenResolutionForCamera.x = screenResolution.y;
screenResolutionForCamera.y = screenResolution.x;
 }

再将cameraResolution = getCameraResolution(parameters,
screenResolution);更改为

?

1
cameraResolution = getCameraResolution(parameters, screenResolutionForCamera);

完成之后,在进行扫描操作,这时候相机拍出来的预览界面就正常显示,不再有拉伸变形问题。

至此便给项目引入了一个可以使用的二维码模块功能了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

原文链接:

如对本文有疑问,请提交到交流社区,广大热心网友会为你解答!!  点击进入社区

Android开发框架之自定义ZXing二维码扫描界面并解决取景框拉伸问题

您可能感兴趣的文章:

  • Android上使用ZXing识别条形码与二维码的方法
  • Android开发框架之自定义ZXing二维码扫描界面并解决取景框拉伸问题
  • Android基于google
    Zxing实现各类二维码扫描效果
  • Android基于google
    Zxing实现二维码的生成
  • Android利用ZXing扫描二维码的实例代码解析
  • Android基于zxing的二维码(网格)扫描
    仿支付宝网格扫描
  • Android中使用ZXing生成二维码(支持添加Logo图案)
  • Android 基于google
    Zxing实现二维码、条形码扫描,仿微信二维码扫描效果(推荐)
  • Android-Zxing实现二维码的扫描与生成
  • Android实现基于ZXing快速集成二维码扫描功能

 

Tags:zxing 二维码

此项目源码地址:请点击这里

相关文章

  • 2016-09-09手把手教你用ViewPager自定义实现Banner轮播
  • 2017-02-02Android之侧滑菜单DrawerLayout的使用介绍
  • 2016-09-09Android
    Volley图片加载功能详解
  • 2016-12-12冠亚体育手机网站,详解Android6.0运行时权限管理
  • 2016-11-11Android AsyncTask
    后监听异步加载完毕的动作详解
  • 2016-02-02以一个着色游戏展开讲解Android中区域图像填色的方法
  • 2013-05-05android中知道图片name时获取图片的简单方法
  • 2016-12-12Android
    开发仿简书登录框可删除内容或显示密码框的内容
  • 2017-06-06亲自动手编写Android通用刷新控件
  • 2013-01-01Adapter实现ListView带多选框等状态的自定义控件的注意事项

冠亚体育手机网站 7

看一下zxing的项目结构,我这里直接拿过来用的

冠亚体育手机网站 8 

看一下扫码的activity:

package com.fanyafeng.barcode.activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.fanyafeng.barcode.R;
import com.fanyafeng.barcode.BaseActivity;
import com.fanyafeng.barcode.util.ImageUtil;
import com.fanyafeng.barcode.zxing.activity.CaptureActivity;
import com.fanyafeng.barcode.zxing.activity.CodeUtils;
//需要搭配baseactivity,这里默认为baseactivity,并且默认Baseactivity为包名的根目录
public class ScanCodeActivity extends BaseActivity {
  /**
   * 扫描跳转Activity RequestCode
   */
  public static final int REQUEST_CODE = 111;
  /**
   * 选择系统图片Request Code
   */
  public static final int REQUEST_IMAGE = 112;
  /**
   * 请求CAMERA权限码
   */
  public static final int REQUEST_CAMERA_PERM = 101;
  private TextView tvResult;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_scan_code);
//这里默认使用的是toolbar的左上角标题,如果需要使用的标题为中心的采用下方注释的代码,将此注释掉即可
    title = getString(R.string.title_activity_scan_code);
    initView();
    initData();
  }
  //初始化UI空间
  private void initView() {
    tvResult = (TextView) findViewById(R.id.tvResult);
  }
  //初始化数据
  private void initData() {
  }
  @Override
  public void onClick(View v) {
    super.onClick(v);
    switch (v.getId()) {
      case R.id.btnScan:
        Intent intent = new Intent(getApplication(), CaptureActivity.class);
        startActivityForResult(intent, REQUEST_CODE);
//        本地扫描,识别相册中的二维码
//        Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
//        intent.addCategory(Intent.CATEGORY_OPENABLE);
//        intent.setType("image/*");
//        startActivityForResult(intent, REQUEST_IMAGE);
        break;
    }
  }
  @Override
  protected void onActivityResult(final int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    /**
     * 处理二维码扫描结果
     */
    if (requestCode == REQUEST_CODE) {
      //处理扫描结果(在界面上显示)
      if (null != data) {
        Bundle bundle = data.getExtras();
        if (bundle == null) {
          return;
        }
        if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_SUCCESS) {
          String result = bundle.getString(CodeUtils.RESULT_STRING);
          Toast.makeText(this, "解析结果:" + result, Toast.LENGTH_LONG).show();
          tvResult.setText(result);
        } else if (bundle.getInt(CodeUtils.RESULT_TYPE) == CodeUtils.RESULT_FAILED) {
          Toast.makeText(ScanCodeActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
        }
      }
    }
    /**
     * 选择系统图片并解析
     */
    else if (requestCode == REQUEST_IMAGE) {
      if (data != null) {
        Uri uri = data.getData();
        try {
          CodeUtils.analyzeBitmap(ImageUtil.getImageAbsolutePath(this, uri), new CodeUtils.AnalyzeCallback() {
            @Override
            public void onAnalyzeSuccess(Bitmap mBitmap, String result) {
              Toast.makeText(ScanCodeActivity.this, "解析结果:" + result, Toast.LENGTH_LONG).show();
              tvResult.setText(result);
            }
            @Override
            public void onAnalyzeFailed() {
              Toast.makeText(ScanCodeActivity.this, "解析二维码失败", Toast.LENGTH_LONG).show();
            }
          });
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    } else if (requestCode == REQUEST_CAMERA_PERM) {
      Toast.makeText(this, "从设置页面返回...", Toast.LENGTH_SHORT).show();
    }
  }
}

注释中有本地二维码的识别

以上所述是小编给大家介绍的Android利用ZXing扫描二维码的实例代码解析,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

您可能感兴趣的文章:

  • Android实现二维码扫描和生成的简单方法
  • Android-Zxing实现二维码的扫描与生成
  • Android
    ZxingPlus精简的二维码框架示例代码

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注