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

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

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

前言:

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

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

这篇文章讲述:

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

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

一、快速集成zxing二维码

1、下载库文件 :http://xiazai.jb51.net/201611/yuanma/ZXingBarCode_jb51.zip ,

下载完成后可以看到:

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

  ①、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 里面有两个按钮,分别跳转 生成二维码界面和 扫描二维码界面
然后分别开始写两个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();
  }

效果图:

②、扫描二维码

这个就更简单了,只需要打开一个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>

效果图:

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

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”取消按钮

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;

然后在看下扫描界面效果图:

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);

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

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

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

原文链接:http://www.cnblogs.com/xqxacm/p/6078729.html

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

您可能感兴趣的文章:

  • 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带多选框等状态的自定义控件的注意事项

转载于:https://www.cnblogs.com/liupengfei005257/p/7448708.html

(转载)Android项目实战(二十八):使用Zxing实现二维码及优化实例相关推荐

  1. MFC Windows 程序设计[二十八]之字体样式(附源码)

    MFC Windows 程序设计[二十八]之字体样式 程序之美 前言 主体 运行效果 核心代码 逻辑分析 结束语 程序之美 前言 MFC是微软公司提供的一个类库(class libraries),以C ...

  2. Android项目实战(十六):QQ空间实现(一)—— 展示说说中的评论内容并有相应点击事件...

    大家都玩QQ空间客户端,对于每一个说说,我们都可以评论,那么,对于某一条评论: 白雪公主 回复 小矮人 : 你们好啊~ 我们来分析一下: 1.QQ空间允许我们 点击 回复人和被回复人的名字就可以进入对 ...

  3. Android项目实战(十五):自定义不可滑动的ListView和GridView

    不可滑动的ListView (RecyclweView类似) public class NoScrollListView extends ListView {public NoScrollListVi ...

  4. ZYNQ7000 学习(二十八)C语言二维数组映射到显示器的原理分析以及实现实例 学

    C语言二维数组映射到显示器的原理分析以及实现实例 学习内容 本课将 在上一课的基础上 修改一下 AXI_LITE_SLAVE外设,不再使用寄存 器而直接对 VGA显存里的数据进行进行写操作,达到以数组 ...

  5. HEVC学习(二十八) —— 量化之二

    Void TComTrQuant::transformNxN( TComDataCU* pcCU, Pel* pcResidual, //!< 残差 UInt uiStride, TCoeff* ...

  6. android圆角对话框,Android项目实战(三十二):圆角对话框Dialog

    原文: Android项目实战(三十二):圆角对话框Dialog 前言:html 项目中多处用到对话框,用系统对话框太难看,就本身写一个自定义对话框.android 对话框包括:一.圆角程序员 二.a ...

  7. FreeSql (二十八)事务

    FreeSql实现了四种数据库事务的使用方法,脏读等事务相关方法暂时未提供.主要原因系这些方法各大数据库.甚至引擎的事务级别五花八门较难统一. 事务用于处理数据的一致性,处于同一个事务中的操作是一个U ...

  8. Android项目实战(三十八):2017最新 将AndroidLibrary提交到JCenter仓库(图文教程)...

    Android项目实战(三十八):2017最新 将AndroidLibrary提交到JCenter仓库(图文教程) 原文:Android项目实战(三十八):2017最新 将AndroidLibrary ...

  9. (转载)Android项目实战(二十七):数据交互(信息编辑)填写总结

    Android项目实战(二十七):数据交互(信息编辑)填写总结 前言: 项目中必定用到的数据填写需求.比如修改用户名的文字编辑对话框,修改生日的日期选择对话框等等.现总结一下,方便以后使用. 注: 先 ...

最新文章

  1. UICollectionView之网络图片解析
  2. snort完整安装(snort-2.8.3.1)
  3. Creative Cloud启动不了
  4. MySQL数据库优化技巧
  5. mysql upgrade 失败_`mysql_upgrade`失败,没有给出真正的理由
  6. 利用连接对象增删改数据 jdbc 20210409235645323
  7. JAVA 的面向对象设计的特点-书后感-01-21天学通JAVA-深入分析
  8. mysql 以周为单位记录数据_mysql 按月/按周汇总统计函数 DATE_FORMAT() 函数
  9. git上传到github
  10. 【grpc】[Python] A file with this name is already in the pool
  11. python工资这么高为什么不学-推崇Python这么多人,为什么他们找不到工作!
  12. Cannot use a leading .. to exit above the top directory
  13. 快捷指令获取url内容_快捷指令,钢铁侠里的“贾维斯”
  14. 《人月神话》7(The Mythical Man-Month)为什么巴比伦塔会失败?
  15. swift 函数类型+高阶函数
  16. 柠檬班python自动化百度云_柠字取名2019-尚名网
  17. openstack的部署与云主机实例
  18. 【网络安全】重放攻击(Replay Attacks)
  19. ESP32 Ubuntu开发环境搭建
  20. python3 get函数,python3请求的GET方法

热门文章

  1. 常用CSS元素div ul dl dt ol的简单解释
  2. 自从用完 Gradle 后,有点嫌弃 Maven 了!速度贼快!
  3. 为啥开发的文档能力是核心竞争力之一
  4. Struts2 为什么被淘汰?自己作死!
  5. 腾讯面试官:如何停止一个正在运行的线程?我一脸蒙蔽。。。
  6. docker 安装zookeeper集群
  7. Spring Cloud Gateway(限流)
  8. 大家好,我是区块链本人。今天,我要给你们介绍我的家族
  9. SpringBoot+Spring Security验证密码MD5加密
  10. 操作系统:进程的三种状态