基于Zxing的二维码生成和二维码扫描
最近又在倒腾二维码,发现网上的教程都不够用,所以把之前整合的二维码Demo有拿出来重新添加些功能,这里也算是重新学习吧!
当然对于二维码,相信大家都很熟悉了。这里就不多说。本项目是基于Zxing的开源项目开发的。
这里用的Demo是之前网上搜的教程。时间久了,也就忘了,大家网上应该可以搜到,当然如果不想那么麻烦,可以下载我的这个Demo,用的时候直接用就行了。这里我新添加了一些功能。
好吧不说废话了,进入主题:
首先写好布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@android:color/white"android:orientation="vertical" ><Buttonandroid:id="@+id/bt_bigin_scan"android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:text="开始扫描" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="二维码信息:"android:textColor="@android:color/black"android:textSize="18sp" /><EditTextandroid:id="@+id/scan_result"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="@android:color/black"android:textSize="18sp" /><Buttonandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:onClick="checkResult"android:text="进入网页" /><Buttonandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_marginTop="30dp"android:onClick="Create2QR"android:text="生成二维码" /><ImageViewandroid:id="@+id/iv_qr_image"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"/></LinearLayout>
主Activity:
package com.androidzhang.zxingframe;import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;import com.google.zxing.WriterException;
import com.zxing.activity.CaptureActivity;public class ZxingFrame extends Activity {private EditText resultTextView;private Button scanBarCodeButton;private ImageView iv_qr_image;protected int mScreenWidth ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_zxing_frame);resultTextView = (EditText) this.findViewById(R.id.scan_result);scanBarCodeButton = (Button) this.findViewById(R.id.bt_bigin_scan);iv_qr_image = (ImageView)findViewById(R.id.iv_qr_image);DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);mScreenWidth = dm.widthPixels;scanBarCodeButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 调用ZXIng开源项目源码 扫描二维码Intent openCameraIntent = new Intent(ZxingFrame.this,CaptureActivity.class);startActivityForResult(openCameraIntent, 0);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);// 取得返回信息if (resultCode == RESULT_OK) {Bundle bundle = data.getExtras();String scanResult = bundle.getString("result");resultTextView.setText(scanResult);}}//调用浏览器打开,功能尚未完善、、、public void checkResult(View v){String result = resultTextView.getText().toString();
// Intent intent = new Intent(ZxingFrame.this,
// CheckResult.class);
// intent.putExtra("result", result);
// startActivity(intent);Intent i= new Intent(); i.setAction("android.intent.action.VIEW"); Uri content_url = Uri.parse(result); i.setData(content_url); i.setClassName("com.android.browser","com.android.browser.BrowserActivity"); startActivity(i);
}//生成二维码public void Create2QR(View v){String uri = resultTextView.getText().toString();
// Bitmap bitmap = BitmapUtil.create2DCoderBitmap(uri, mScreenWidth/2, mScreenWidth/2);Bitmap bitmap;try {bitmap = BitmapUtil.createQRCode(uri, mScreenWidth);if(bitmap != null){iv_qr_image.setImageBitmap(bitmap);}} catch (WriterException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
上面每个函数都注释的很清楚了。
接着就是处理了:都在CaptureActivity
这里扫描二维码需要用到的结果:
/*** Handler scan result* * @param result* @param barcode* 获取结果*/public void handleDecode(Result result, Bitmap barcode) {inactivityTimer.onActivity();playBeepSoundAndVibrate();String resultString = result.getText();// FIXMEif (resultString.equals("")) {Toast.makeText(CaptureActivity.this, "扫描失败!", Toast.LENGTH_SHORT).show();} else {// System.out.println("Result:"+resultString);Intent resultIntent = new Intent();Bundle bundle = new Bundle();bundle.putString("result", resultString);resultIntent.putExtras(bundle);this.setResult(RESULT_OK, resultIntent);}CaptureActivity.this.finish();}
其中添加的是否打开闪光灯:
// 是否开启闪光灯public void IfOpenLight(View v) {ifOpenLight++;switch (ifOpenLight % 2) {case 0:// 关闭CameraManager.get().closeLight();break;case 1:// 打开CameraManager.get().openLight(); // 开闪光灯break;default:break;}}
接着就是从相册中获取带有二维码的照片,然后解析二维码:(这个功能还不够强大,对于只有二维码的图片能解析成功,如果图片含有其他干扰就不一定能解析出来了。希望有大神能够指点指点。。。)
/** 获取带二维码的相片进行扫描*/public void pickPictureFromAblum(View v) {// 打开手机中的相册Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); // "android.intent.action.GET_CONTENT"innerIntent.setType("image/*");Intent wrapperIntent = Intent.createChooser(innerIntent, "选择二维码图片");this.startActivityForResult(wrapperIntent, 1);}String photo_path;ProgressDialog mProgress;Bitmap scanBitmap;/** (non-Javadoc)* * @see android.app.Activity#onActivityResult(int, int,* android.content.Intent) 对相册获取的结果进行分析*/@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {// TODO Auto-generated method stubif (resultCode == RESULT_OK) {switch (requestCode) {case 1:// 获取选中图片的路径Cursor cursor = getContentResolver().query(data.getData(),null, null, null, null);if (cursor.moveToFirst()) {photo_path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));Log.i("路径", photo_path);}cursor.close();mProgress = new ProgressDialog(CaptureActivity.this);mProgress.setMessage("正在扫描...");mProgress.setCancelable(false);mProgress.show();new Thread(new Runnable() {@Overridepublic void run() {Result result = scanningImage(photo_path);if (result != null) {Message m = mHandler.obtainMessage();m.what = 1;m.obj = result.getText();mHandler.sendMessage(m);} else {Message m = mHandler.obtainMessage();m.what = 2;m.obj = "Scan failed!";mHandler.sendMessage(m);}}}).start();break;default:break;}}super.onActivityResult(requestCode, resultCode, data);}final Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubswitch (msg.what) {case 1:mProgress.dismiss();String resultString = msg.obj.toString();if (resultString.equals("")) {Toast.makeText(CaptureActivity.this, "扫描失败!",Toast.LENGTH_SHORT).show();} else {// System.out.println("Result:"+resultString);Intent resultIntent = new Intent();Bundle bundle = new Bundle();bundle.putString("result", resultString);resultIntent.putExtras(bundle);CaptureActivity.this.setResult(RESULT_OK, resultIntent);}CaptureActivity.this.finish();break;case 2:mProgress.dismiss();Toast.makeText(CaptureActivity.this, "解析错误!", Toast.LENGTH_LONG).show();break;default:break;}super.handleMessage(msg);}};/*** 扫描二维码图片的方法* * 目前识别度不高,有待改进* * @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) 100);if (sampleSize <= 0)sampleSize = 1;options.inSampleSize = sampleSize;scanBitmap = BitmapFactory.decodeFile(path, options);RGBLuminanceSource source = new RGBLuminanceSource(scanBitmap);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;}
剩下一个主要的功能就是生成二维码:
package com.androidzhang.zxingframe;import java.util.Hashtable;import android.graphics.Bitmap;
import android.util.Log;import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;public class BitmapUtil {/*** 生成一个二维码图像* * @param url* 传入的字符串,通常是一个URL* @param QR_WIDTH* 宽度(像素值px)* @param QR_HEIGHT* 高度(像素值px)* @return*/public static final Bitmap create2DCoderBitmap(String url, int QR_WIDTH,int QR_HEIGHT) {try {// 判断URL合法性if (url == null || "".equals(url) || url.length() < 1) {return null;}Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();hints.put(EncodeHintType.CHARACTER_SET, "utf-8");// 图像数据转换,使用了矩阵转换BitMatrix bitMatrix = new QRCodeWriter().encode(url,BarcodeFormat.QR_CODE, QR_WIDTH, QR_HEIGHT, hints);int[] pixels = new int[QR_WIDTH * QR_HEIGHT];// 下面这里按照二维码的算法,逐个生成二维码的图片,// 两个for循环是图片横列扫描的结果for (int y = 0; y < QR_HEIGHT; y++) {for (int x = 0; x < QR_WIDTH; x++) {if (bitMatrix.get(x, y)) {pixels[y * QR_WIDTH + x] = 0xff000000;} else {pixels[y * QR_WIDTH + x] = 0xffffffff;}}}// 生成二维码图片的格式,使用ARGB_8888Bitmap bitmap = Bitmap.createBitmap(QR_WIDTH, QR_HEIGHT,Bitmap.Config.ARGB_8888);bitmap.setPixels(pixels, 0, QR_WIDTH, 0, 0, QR_WIDTH, QR_HEIGHT);// 显示到一个ImageView上面// sweepIV.setImageBitmap(bitmap);return bitmap;} catch (WriterException e) {Log.i("log", "生成二维码错误" + e.getMessage());return null;}}private static final int BLACK = 0xff000000;/*** 生成一个二维码图像* * @param url* 传入的字符串,通常是一个URL* @param widthAndHeight* 图像的宽高* @return*/public static Bitmap createQRCode(String str, int widthAndHeight)throws WriterException {Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();hints.put(EncodeHintType.CHARACTER_SET, "utf-8");BitMatrix matrix = new MultiFormatWriter().encode(str,BarcodeFormat.QR_CODE, widthAndHeight, widthAndHeight);int width = matrix.getWidth();int height = matrix.getHeight();int[] pixels = new int[width * height];for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {if (matrix.get(x, y)) {pixels[y * width + x] = BLACK;}}}Bitmap bitmap = Bitmap.createBitmap(width, height,Bitmap.Config.ARGB_8888);bitmap.setPixels(pixels, 0, width, 0, 0, width, height);return bitmap;}
}
这里写了两种方法,都能用。
这里功能基本上够用了,剩下的自己再琢磨琢磨吧!
还是那句话: 演示图:
源代码下载地址:
http://download.csdn.net/detail/xiaorenwu1206/7785619
希望有高手指点其中的不足啊!小白谢过。。。
基于Zxing的二维码生成和二维码扫描相关推荐
- 基于GAN的动漫头像生成系统(源码&教程)
1.研究背景 我们都喜欢动漫角色,并试图创造我们的定制角色.然而,要掌握绘画技巧需要巨大的努力,之后我们首先有能力设计自己的角色.为了弥补这一差距,动画角色的自动生成提供了一个机会,在没有专业技能的情 ...
- iOS 花式二维码生成和二维码识别
iOS 原生的二维码识别非常之棒,反正比 ZXing 和 ZBar 效果都好些,所以以后打算尽量用原生的二维码识别,然后最近把原生的二维码生成也顺便做了一遍,并且在原有基础上加了一些样式参数,封了一个 ...
- 二维码生成器二维码生成插件开发qrious源码
初心-杨瑞超个人博客诚邀您加入qq群(IT-程序猿-技术交流群): 757345416丨(IT-程序猿-技术交流2群): 936929828 现在的互联网时代,二维码处处可见,这次我们研究下二维码生成 ...
- 一个炫酷的二维码生成项目附源码
前阵子打算换一个炫酷的公众号二维码,无奈市面上很多的二维码修改器都不尽人意. 草料二维码也挺炫酷的,但是也没有满意的效果. 于是又去万能的github逛了一下,终于找到了一款开源的二维码修改器. 这个 ...
- java+vue的二维码生成,二维码上传服务器,二维码的压缩包下载
一. vue页面生成二维码 <template><div class="app-container">//在页面放着二维码的div<div id=&q ...
- html,vue, react,angular 前端实现二维码生成 ,二维码解析
本文的背景 近期,由于项目开发的需求,需要前端实现图片二维码的解析. 由于需求的需要,这边调研了一下,发现很多人都有着类似的需求,网上给的解决方案也很多,但是感觉还是有些..... 又想到之前做过前端 ...
- 二维码生成[易语言源码]
点击阅读原文 通过调用QRCodeWin32.dll库来实现二维码的编码,点阵建议0.1 二维码用来和app交互很不错. 链接: http://pan.baidu.com/s/1jHADGpC 密码: ...
- python二维高斯分布生成_python 多维高斯分布数据生成方式
我就废话不多说了,直接上代码吧! import numpy as np import matplotlib.pyplot as plt def gen_clusters(): mean1 = [0,0 ...
- 二维码生成(根据不同要求)
当时自己尝试从阿里云上弄,但是实在是不好弄.总结了一个工具类,只要调用工具类就行.这个是可以根据不同要求生产不同的二维码. 输入参数这样输入: 代码如下: QRCodeController packa ...
最新文章
- Computer Network Homework3’ s hard question
- 分布式锁之Redis6+Lua脚本实现原生分布式锁
- 怎么用python做战斗机_关于python文件操作
- js室内地图开发_GIS开发_OpenLayers
- Scratch:海龟绘图(九)
- [BZOJ4540][HNOI2016]序列(莫队)
- Unity精品Demo收集
- 俄罗斯方块c语言游戏代码大全,C语言实现俄罗斯方块小游戏
- fw325r虚拟服务器,fw325r管理页面
- 提取Blast2go blast结果中的一部分
- vue 会议室日历预约组件
- GNS3路由器设备间ping不通的排查方法
- 穿越(pass through)
- app逆向--美图秀秀sig参数
- ClickHouse在趣头条中的实战PPT
- 七、Fiddler工具 — Statistics(统计)面板
- 0xC0000005: 读取位置 0x00000001 时发生访问冲突
- 通过ua区分QQ内置浏览器与QQ浏览器
- 计算机一级等级考试模拟试题,全国计算机一级等级考试模拟试题.docx
- 老陈---谈Delphi中SSL协议的应用