Android中的二维码生成与扫描功能

0. 前言

今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,为什么要讲二维码,因为二维码太普遍了,随便一个Android APP都会有二维码扫描。本篇旨在帮助有需求的同学快速完成二维码生成和扫描的功能。

1.    Zxing的使用

github上下载项目后,可以看到整体代码结构如下:

我们只需将Zxing包下的所有代码copy一份到我们的项目中去,除了这些还需要zxing的jar包,最后相应的资源文件,包括values文件下的ids文件、raw文件中的资源文件(可以替换)、layout文件下的activity_capture.xml(可以进行相应的订制) 和图片资源。

2.    生成二维码的实现

等上面工作全部准备完毕后,就可以创建我们的二维码了。如何生成二维码?

需要EncodingUtils这个二维码生成工具类。通过调用工具类中的createQRCode()方法来生成二维码。该方法参数介绍如下:

/*
* content:二维码内容
* widthPix:二维码宽度
* heightPix:二维码高度
* logoBm:二维码中间的logo对应的Bitmap
*/
public static Bitmap createQRCode(String content, int widthPix, int heightPix, Bitmap logoBm)

下面完成的是生成的一个百度地址的二维码,中间LOGO是Android小机器人。并保存图片到本地,方便后续测试二维码的本地读取功能。

/**
 * 创建、展示二维码并将bitmap保存在本地
 */
 private void create() {
 int width = DensityUtil.dip2px(this, 200);
 Bitmap bitmap = EncodingUtils.createQRCode("http://www.baidu.com",
  width, width, BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher));
 iv_zxing.setImageBitmap(bitmap);
 saveBitmap(bitmap);
 }
 /**
 * 将Bitmap保存在本地
 *
 * @param bitmap
 */
 public void saveBitmap(Bitmap bitmap) {
 // 首先保存图片
 File appDir = new File(Environment.getExternalStorageDirectory(),"zxing_image");
 if (!appDir.exists()) {
  appDir.mkdir();
 }
 String fileName = "zxing_image" + ".jpg";
 File file = new File(appDir, fileName);
 try {
  FileOutputStream fos = new FileOutputStream(file);
  bitmap.compress(CompressFormat.JPEG, 100, fos);
  fos.flush();
  fos.close();
 } catch (Exception e) {
  e.printStackTrace();
 }
 // 把文件插入到系统图库
 try {
  MediaStore.Images.Media.insertImage(this.getContentResolver(),file.getAbsolutePath(), fileName, null);
 } catch (FileNotFoundException e) {
  e.printStackTrace();
 }
 // 通知图库更新
 sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
  Uri.parse("file://" + "/sdcard/namecard/")));
} 

看到如下效果:

3.    读取二维码的实现

3.1  摄像头扫描的方式

二维码扫描需要借助于CaptureActivity这个类,打开CaptureActivity界面并进行扫描,扫描完毕后回调onActivityResult()方法,从onActivityResult()中得到扫描后的结果。效果就不演示的,因为使用的是模拟器。详细代码如下:

 /**
 * 打开二维码扫描
 */
private void open() {
 config();
 startActivityForResult(new Intent(MainActivity.this,CaptureActivity.class), 0);
}
/**
 * 提高屏幕亮度
 */
private void config() {
 WindowManager.LayoutParams lp = getWindow().getAttributes();
 lp.screenBrightness = 1.0f;
 getWindow().setAttributes(lp);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 super.onActivityResult(requestCode, resultCode, data);
 if (resultCode == RESULT_OK) {
 Bundle bundle = data.getExtras();
 String result = bundle.getString("result");
 tv_result.setText(result);
 } 

3.2  本地图片扫描的方式

扫描本地图片需要我们在CaptureActivity中进行相应的修改,为此我在扫描界面底部增加了一个按钮,用来选择本地图片。layout代码这里就不展示,我们直接看点击后的事件处理。

/**
* 打开本地图片
*/
private void openLocalImage() {
 // 打开手机中的相册
 Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT);
 innerIntent.setType("image/*");
 Intent wrapperIntent = Intent.createChooser(innerIntent, "选择二维码图片");
 this.startActivityForResult(wrapperIntent, 0x01);
}

打开系统图片库后选择图片,这时需要重写onActivityResult()方法用于返回图片信息。

@Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 super.onActivityResult(requestCode, resultCode, data);
 if (resultCode == RESULT_OK) {
  switch (requestCode) {
  case 0x01:
  // 获取选中图片的路径
  Cursor cursor = getContentResolver().query(data.getData(),null, null, null, null);
  if (cursor.moveToFirst()) {
   photo_path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
  }
  cursor.close();
  new Thread(new Runnable() {
   @Override
   public void run() {
   Result result = scanningImage(photo_path);
   if (result != null) {
    handleDecode(result, new Bundle());
   }
   }
  }).start();
  break;
  }
 }
} 

获取图片路径photo_path后,调用scanningImage()方法进行扫描,Zxing源码中,扫描到的结果都是存放在Result结果集中。获取到Result后,就进行结果的回传,阅读CaptureActivity源码可以得知最后Result结果集会传递给handleDecode()方法。

/**
 * A valid barcode has been found, so give an indication of success and show
 * the results.
 *
 * @param rawResult
 *  The contents of the barcode.
 * @param bundle
 *  The extras
 */
 public void handleDecode(Result rawResult, Bundle bundle) {
 inactivityTimer.onActivity();
 beepManager.playBeepSoundAndVibrate();
 Intent resultIntent = new Intent();
 bundle.putInt("width", mCropRect.width());
 bundle.putInt("height", mCropRect.height());
 bundle.putString("result", rawResult.getText());
 resultIntent.putExtras(bundle);
 this.setResult(RESULT_OK, resultIntent);
 CaptureActivity.this.finish();
}

获取到图片路径后需要将其二维码信息包装成Result对象,因此需要解析图片:

/**
 * 扫描二维码图片的方法
 *
 * @param path
 * @return
 */
 public Result scanningImage(String path) {
 if (TextUtils.isEmpty(path)) {
  return null;
 }
 Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>();
 hints.put(DecodeHintType.CHARACTER_SET, "UTF8"); // 设置二维码内容的编码
 BitmapFactory.Options options = new BitmapFactory.Options();
 options.inJustDecodeBounds = true; // 先获取原大小
 scanBitmap = BitmapFactory.decodeFile(path, options);
 options.inJustDecodeBounds = false; // 获取新的大小
 int sampleSize = (int) (options.outHeight / (float) 200);
 if (sampleSize <= 0)
  sampleSize = 1;
 options.inSampleSize = sampleSize;
 scanBitmap = BitmapFactory.decodeFile(path, options);
 int width = scanBitmap.getWidth();
 int height = scanBitmap.getHeight();
 int[] pixels = new int[width * height];
 scanBitmap.getPixels(pixels, 0, width, 0, 0, width, height);
 /**
 * 第三个参数是图片的像素
 */
 RGBLuminanceSource source = new RGBLuminanceSource(width, height,
  pixels);
 BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
 QRCodeReader reader = new QRCodeReader();
 try {
  return reader.decode(bitmap1, hints);
 } catch (NotFoundException e) {
  e.printStackTrace();
 } catch (ChecksumException e) {
  e.printStackTrace();
 } catch (FormatException e) {
  e.printStackTrace();
 }
 return null;
 } 

根据路径获取Bitmap,最后通过QRCodeReader 中的decode方法解析成Result对象并返回,最终传递给handleDecode方法。运行程序效果如下,扫描出来的是之前定义的百度地址。

最后不要忘了申明权限和CaptureActivity。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<activity android:name="com.example.zxingtest.zxing.activity.CaptureActivity"/> 

大家可以参考下这篇文章:Android实现二维码扫描和生成的简单方法

以上所述是小编给大家介绍的Android中的二维码生成与扫描功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android 动态加载二维码视图生成快照的示例

    1.需求背景 需要实现一个动态加载但不显示出来的视图,且该视图上有个动态生成的二维码,最后用其去生成一张快照(也就是图片). (常见这种情况是来源于"图片分享"的功能需求,与普通图片分享不同在于,该快照图片是动态加载不显示的.) 2.需求功能拆解 动态二维码的实现 动态视图生成快照的实现 3.踩坑点提要 获取不到动态视图的bitmap 无法获取最新动态视图的bitmap 4.开发实现 动态加载的视图的布局文件代码: <?xml version="1.0" en

  • Android平台生成二维码并实现扫描 & 识别功能

    1.二维码的前世今生 "二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的:在代码编制上巧妙地利用构成计算机内部逻辑基础的"0"."1"比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集:每个字符占有一定的宽度:具有一定的校验功能

  • Android实现二维码扫描和生成的简单方法

    这里简单介绍一下ZXing库.ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.Zxing可以实现使用手机的内置的摄像头完成条形码的扫描及解码.该项目可实现的条形码编码和解码.目前支持以下格式:UPC-A,UPC-E.EAN-8,EAN-13.39码.93码.ZXing是个很经典的条码/二维码识别的开源类库,以前在功能机上,就有开发者使用J2ME运用ZXing了,不过要支持JSR-234规范(自动对焦)的手机才能发挥其威力. ZXing

  • Android-Zxing实现二维码的扫描与生成

    Zxing: Zxing是一个开放源码,用java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口.可以实现使用手机内置摄像头完成条形码的扫描以及解码. github: https://github.com/zxing/zxing 首先在写项目的时候,我们需要导入一个moduel,主要是从Zxing中提取的主要功能代码.其地址是: http://pan.baidu.com/s/1sk9pGmT 扫描二维码: 在点击扫描二维码的页面: startActivityForResu

  • Android中使用ZXing生成二维码(支持添加Logo图案)

    ZXing是谷歌的一个开源库,可以用来生成二维码.扫描二维码.本文所介绍的是第一部分. 首先上效果图: ZXing相关各种文件官方下载地址:https://github.com/zxing/zxing/releases 或者在这里下载(只有本项目所用的jar包,版本号:3.2.0):链接:http://pan.baidu.com/s/1pLqAR5x 1.生成二维码的工具类 /** * 二维码生成工具类 */ public class QRCodeUtil { /** * 生成二维码Bitmap

  • Android 二维码 生成和识别二维码 附源码下载

    今天讲一下目前移动领域很常用的技术--二维码.现在大街小巷.各大网站都有二维码的踪迹,不管是IOS.Android.WP都有相关支持的软件.之前我就想了解二维码是如何工作,最近因为工作需要使用相关技术,所以做了初步了解.今天主要是讲解如何使用ZXing库,生成和识别二维码.这篇文章实用性为主,理论性不会讲解太多,有兴趣可以自己查看源码. 1.ZXing库介绍 这里简单介绍一下ZXing库.ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口

  • Android Zxing生成二维码经典案例分享

    本文实例为大家解析了Zxing生成二维码的经典案例,供大家参考,具体内容如下 1.首先呢,先编译 compile 'com.google.zxing:core:3.2.1' 2.实战 public class QRCode { private static int IMAGE_HALFWIDTH = 50;//宽度值,影响中间图片大小 /** * 生成二维码,默认大小为500*500 * * @return bitmap */ public static Bitmap createQRCode(

  • Android二维码的生成与扫码-zxing示例代码

    由于GitHub上面的zxing功能太多,有的用不到,我就抽取了重要的出来使用,这个可以生成二维码,扫描二维码和相册中的二维码 Demo效果: 1.在project的build.gradle添加如下代码: allprojects { repositories { maven { url 'https://jitpack.io' } } } 2.在build.gradle添加依赖: dependencies { compile 'com.github.goodboy321:Scan-Zxing:1

  • Android中的二维码生成与扫描功能

    0. 前言 今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,为什么要讲二维码,因为二维码太普遍了,随便一个Android APP都会有二维码扫描.本篇旨在帮助有需求的同学快速完成二维码生成和扫描的功能. 1.    Zxing的使用 从github上下载项目后,可以看到整体代码结构如下: 我们只需将Zxing包下的所有代码copy一份到我们的项目中去,除了这些还需要zxing的jar包,最后相应的资源文件,包括values文件下的ids文件.raw文件中的资源文件(可以替换).

  • iOS第三方框架二维码生成与扫描

    本文实例为大家分享了iOS第三方二维码生成与扫描的具体代码,供大家参考,具体内容如下 导入第三方框架libqrencode(生成二维码)和ZBarSDK(二维码扫描) 导入头文件 #import "QRCodeGenerator.h" #import "ZBarSDK.h" 创建两个按钮点击事件 点击按钮一实现生成二维码 - (IBAction)erWeiMaBtn1:(id)sender { // 设置图片框存放二维码 UIImageView *imgView =

  • Android中二维码的生成方法(普通二维码、中心Logo 二维码、及扫描解析二维码)

    首先声明我们通篇用的都是Google开源框架Zxing,要实现的功能有三个 ,生成普通二维码.生成带有中心图片Logo 的二维码,扫描解析二维码,直接上效果图吧 首先我们需要一个这样的 Zxing 的包类似于这样 接下来需要引入资源 1.drawable 中引入图片 navbar.png 2.layout中引入camera.xml.main.xml.qrcode_capture_page.xml 3.创建raw文件夹并添加beep.ogg 扫描声音 4.合并color.xml,copy ids.

  • Android中google Zxing实现二维码与条形码扫描

    Android中google Zxing实现二维码与条形码扫描 了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google啥的,发现很多朋友都有介绍二维码扫描的功能,然后我就跟着人家的介绍自己搞起了二维码扫描功能,跟着人家的帖子,很快我的项目就加入了扫描二维码的功能,然后自己还很开心. 随着微信的到来,二维码越来越火

  • Android编程实现二维码的生成与解析

    本文实例讲述了Android编程实现二维码的生成与解析.分享给大家供大家参考,具体如下: 直接上代码,代码上面有具体的解析,并且提供jar供下载:二维码Jar包.rar. 根据文本生成对应的二维码: // 生成QR图 private void createImage() { try { // 需要引入core包 QRCodeWriter writer = new QRCodeWriter(); String text = qr_text.getText().toString(); Log.i(T

  • android实现扫描网页二维码进行网页登录功能

    先说一下实现了什么效果,app扫描php写的页面(也可以java网页,都一样的思路和步骤),扫描成功后跳转进入主页,光和你们这么说,肯定有人说了,没图说个jb,这就出来一个问题,很多人写博客,看这标题特别符合自己的问题,然后兴致勃勃的进来了,一看,我去...尼玛全是代码,也不知道是不是我的那种问题和想要的那种效果,心里没谱啊,好了,上图: 别纠结这页面咋这么丑,没写样式,说一下我实现的思路哈,首先在数据库中新建一个表用来存储扫码登录信息(id,username,randomnum),这三个分别是

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

    了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一张图片中扫一下竟然能直接加好友,不可思议啊,那时候还不了解二维码,呵呵,然后做项目的时候,老板说要加上二维码扫描功能,然后自己的屁颠屁颠的去百度,google啥的,发现很多朋友都有介绍二维码扫描的功能,然后我就跟着人家的介绍自己搞起了二维码扫描功能,跟着人家的帖子,很快我的项目就加入了扫描二维码的功能,然后自己还很开心. 随着微信的到来,二维码越来越火爆,随处能看到二维码,比如商城里面,肯德基,餐厅等等,对于二维码

  • Android仿微信二维码和条形码

    本文实例为大家分享了Android仿微信二维码和条形码的具体代码,供大家参考,具体内容如下 package your.QRCode.namespace; import java.io.File; import java.io.FileOutputStream; import java.util.HashMap; import java.util.Map; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHi

  • java实现二维码生成的几个方法(推荐)

    java实现二维码生成的几个方法,具体如下: 1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode/downloads/28391/qrcode.zip 这个是日本人写的,生成的是我们常见的方形的二维码 可以用中文 如:5677777ghjjjjj 2: 使用BarCode4j生成条形码和二维码 BarCode4j网址:http://sourcefor

随机推荐