最近又在倒腾二维码,发现网上的教程都不够用,所以把之前整合的二维码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的二维码生成和二维码扫描相关推荐

  1. 基于GAN的动漫头像生成系统(源码&教程)

    1.研究背景 我们都喜欢动漫角色,并试图创造我们的定制角色.然而,要掌握绘画技巧需要巨大的努力,之后我们首先有能力设计自己的角色.为了弥补这一差距,动画角色的自动生成提供了一个机会,在没有专业技能的情 ...

  2. iOS 花式二维码生成和二维码识别

    iOS 原生的二维码识别非常之棒,反正比 ZXing 和 ZBar 效果都好些,所以以后打算尽量用原生的二维码识别,然后最近把原生的二维码生成也顺便做了一遍,并且在原有基础上加了一些样式参数,封了一个 ...

  3. 二维码生成器二维码生成插件开发qrious源码

    初心-杨瑞超个人博客诚邀您加入qq群(IT-程序猿-技术交流群): 757345416丨(IT-程序猿-技术交流2群): 936929828 现在的互联网时代,二维码处处可见,这次我们研究下二维码生成 ...

  4. 一个炫酷的二维码生成项目附源码

    前阵子打算换一个炫酷的公众号二维码,无奈市面上很多的二维码修改器都不尽人意. 草料二维码也挺炫酷的,但是也没有满意的效果. 于是又去万能的github逛了一下,终于找到了一款开源的二维码修改器. 这个 ...

  5. java+vue的二维码生成,二维码上传服务器,二维码的压缩包下载

    一. vue页面生成二维码 <template><div class="app-container">//在页面放着二维码的div<div id=&q ...

  6. html,vue, react,angular 前端实现二维码生成 ,二维码解析

    本文的背景 近期,由于项目开发的需求,需要前端实现图片二维码的解析. 由于需求的需要,这边调研了一下,发现很多人都有着类似的需求,网上给的解决方案也很多,但是感觉还是有些..... 又想到之前做过前端 ...

  7. 二维码生成[易语言源码]

    点击阅读原文 通过调用QRCodeWin32.dll库来实现二维码的编码,点阵建议0.1 二维码用来和app交互很不错. 链接: http://pan.baidu.com/s/1jHADGpC 密码: ...

  8. python二维高斯分布生成_python 多维高斯分布数据生成方式

    我就废话不多说了,直接上代码吧! import numpy as np import matplotlib.pyplot as plt def gen_clusters(): mean1 = [0,0 ...

  9. 二维码生成(根据不同要求)

    当时自己尝试从阿里云上弄,但是实在是不好弄.总结了一个工具类,只要调用工具类就行.这个是可以根据不同要求生产不同的二维码. 输入参数这样输入: 代码如下: QRCodeController packa ...

最新文章

  1. Computer Network Homework3’ s hard question
  2. 分布式锁之Redis6+Lua脚本实现原生分布式锁
  3. 怎么用python做战斗机_关于python文件操作
  4. js室内地图开发_GIS开发_OpenLayers
  5. Scratch:海龟绘图(九)
  6. [BZOJ4540][HNOI2016]序列(莫队)
  7. Unity精品Demo收集
  8. 俄罗斯方块c语言游戏代码大全,C语言实现俄罗斯方块小游戏
  9. fw325r虚拟服务器,fw325r管理页面
  10. 提取Blast2go blast结果中的一部分
  11. vue 会议室日历预约组件
  12. GNS3路由器设备间ping不通的排查方法
  13. 穿越(pass through)
  14. app逆向--美图秀秀sig参数
  15. ClickHouse在趣头条中的实战PPT
  16. 七、Fiddler工具 — Statistics(统计)面板
  17. 0xC0000005: 读取位置 0x00000001 时发生访问冲突
  18. 通过ua区分QQ内置浏览器与QQ浏览器
  19. 计算机一级等级考试模拟试题,全国计算机一级等级考试模拟试题.docx
  20. 老陈---谈Delphi中SSL协议的应用

热门文章

  1. Ant Design表单的使用
  2. mac ntfs 读写操作
  3. 四季查询器(通过月份查询季度)
  4. CNN卷积神经网络 ILSVRC-2012
  5. android与H5交互调用js方法无效问题
  6. 【Python】抓取基金数据,这简直太爱了
  7. 谷歌地图高清卫星地图下载器 13.20.160
  8. java pkcs7 和 pkcs5_PKCS7 / PKCS5 填充算法
  9. 软件开发php代码规范,php开发规范_PHP代码编写规范
  10. uni-app安卓appNFC读卡