Android中的二维码生成与扫描
转载请标明出处:
http://blog.csdn.net/hai_qing_xu_kong/article/details/51260428
本文出自:【顾林海的博客】
前言
月底离开公司,准备月底休息一段时间,之前每天忙于工作,甚至连一些感兴趣的东西都没有研究过,趁着这段时间可以好好享受一下,今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,底部会给出整个项目的gitHub地址,为什么要讲二维码,因为二维码太普遍了,随便一个APP都会有二维码扫描。
Zxing使用
从底部gitHub项目下载地址下载项目完后,可以看到整体代码结构如下:
我们只需将zxing包下的所有代码copy一份到我们的项目中去,除了这写代码以外,还需要zxing的jar包,也从项目中直接copy一份
全部copy完之后,还需要相应的资源文件
1、values文件下的ids文件
2、raw文件中的资源文件(可以替换)
3、layout文件下的activity_capture.xml(可以进行相应的订制)
4、图片资源
生成二维码
等上面工作全部准备完毕后,就可以创建我们的二维码了,如何生成二维码?这时需要EncodingUtils这个二维码生成工具类。通过调用工具类中的createQRCode方法来生成二维码。
public static Bitmap createQRCode(String content, int widthPix, int heightPix, Bitmap logoBm)
- 1
createQRCode方法参数如下:
content:二维码内容
widthPix:二维码宽度
heightPix:二维码高度
logoBm:二维码中间的logo
/*** 创建二维码并将图片保存在本地*/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 (FileNotFoundException e) {e.printStackTrace();} catch (IOException 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/")));}
- 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
这里生成的二维码内容是一个百度的地址,中间LOGO是默认的安卓小机器人。
运行程序可以看到如下效果:
二维码扫描
二维码扫描需要借助于我们的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);}@Overrideprotected 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);}}
- 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
效果就不演示的,因为使用的是模拟器。
扫描本地图片
扫描本地图片需要我们在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);}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
打开系统图片库后选择图片,这时需要重写onActivityResult方法用于返回图片信息。
@Overrideprotected 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() {@Overridepublic void run() {Result result = scanningImage(photo_path);if (result != null) {handleDecode(result, new Bundle());}}}).start();break;}}}
- 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
获取图片路径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();}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
获取到图片路径后需要将其二维码信息包装成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;}
- 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
根据路径获取Bitmap,最后通过QRCodeReader 中的decode方法解析成Result对象并返回,最终传递给handleDecode方法。
运行程序效果如下:
最后扫描出来的是之前定义的百度地址。
权限与Activity
当二维码的生成与扫描完成后,别忘了权限:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.zxingtest"android:versionCode="1"android:versionName="1.0" ><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"/><uses-sdk
android:minSdkVersion="15"android:targetSdkVersion="17" /><application
android:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activity
android:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name="com.example.zxingtest.zxing.activity.CaptureActivity"></activity></application></manifest>
- 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
以下是完整的github项目地址
github项目源码地址:点击【项目源码】
(function () {(function () {('pre.prettyprint code').each(function () { var lines = (this).text().split(′\n′).length;var(this).text().split('\n').length;var numbering = $('
- ').addClass('pre-numbering').hide(); (this).addClass(′has−numbering′).parent().append((this).addClass('has-numbering').parent().append(numbering); for (i = 1; i
Android中的二维码生成与扫描相关推荐
- Android开发——Android中的二维码生成与扫描
0. 前言 今天这篇文章主要描述二维码的生成与扫描,使用目前流行的Zxing,为什么要讲二维码,因为二维码太普遍了,随便一个Android APP都会有二维码扫描.本篇旨在帮助有需求的同学快速完成二维 ...
- android 中的二维码生成与去除白边
现在二维码应用越来越广泛,把一个url转换为二维码图片,让后去扫描,应用太多了.现在 zxing:core 包也用的相当广泛,android studio 使用也很方便,在 gradle 中加入配置, ...
- 二维码生成、扫描、图片识别(Zxing)
这样的例子虽然已经很多了,不过我在网上浏览了一圈,也没找到几个图库二维码图片识别例子,好的算法识别率才高.这里有一个好点的算法,算法不是我写的,只是作为整理记录,给众多安卓开发者一个方便.demo的U ...
- 微信公众平台----带参数二维码生成和扫描事件
原文:微信公众平台----带参数二维码生成和扫描事件 摘要: 账号管理----生成带参数的二维码 消息管理----接收消息----接收事件推送 为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众 ...
- 苹果原生二维码生成与扫描及生成的二维码不清楚的解决方案
苹果原生二维码生成与扫描及生成的二维码不清楚的解决方案 参考文章: (1)苹果原生二维码生成与扫描及生成的二维码不清楚的解决方案 (2)https://www.cnblogs.com/CoderEYL ...
- Android之二维码生成与扫描
转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/51260428 本文出自:[顾林海的博客] ##前言 月底离开公司,准备 ...
- 转【微信小程序 四】二维码生成/扫描二维码
原文:https://blog.csdn.net/xbw12138/article/details/75213274 前端 二维码生成 二维码要求:每分钟刷新一次,模拟了个鸡肋,添加了个按分钟显示 ...
- iOS开发二维码生成和扫描
准备工作 导入<CoreImage/CoreImage.h>,生成二维码用 导入<AVFoundation/AVFoundation.h>,读取二维码用 设置代理协议AVCap ...
- iOS - 二维码生成、扫描及页面跳转
主要内容的介绍 普通二维码生成 彩色二维码生成 带有小图标二维码生成 扫描二维码的自定义 是否开启闪光灯 从相册中获取二维码 扫描成功之后提示音 扫描成功之后的界面之间的跳转 扫描二维码界面采取了微信 ...
最新文章
- python画指数函数图像_解决python中的幂函数、指数函数问题
- 自然语言处理顶会COLING 2020最佳论文等三项大奖出炉 | AI日报
- 性能优化之数据库优化
- 机器视觉-halcon学习笔记1
- 在驱动和应用程序间共享内存
- algorithm -- 选择排序
- 什么是机器阅读理解?跟自然语言处理有什么关系?
- python定义变量名的时候、需要注意问题_第39p,Python模块的名称空间问题,应该讲完了吧...
- git commit -m 'comment' 遇到 'npm' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
- sort colors 三色排序
- JBoss Tools 4.5.3.Final安装及下载
- Oracle EBS 接收事务处理类型 rcv_transactions transaction_type
- FPGA series # 基于SDx的fft函数加速
- 视频会议行业应用软件分析
- 上海在职研究生计算机专业考什么,中国人民大学计算机专业在职研究生考试考什么?...
- html中图片放css还是,图片到底是写在html还是写在css呢
- .net2.0注册到IIS ,重新注册IIS ,iis注册
- 新网站如何提交链接让百度更快速的收录
- STM32外部晶振8M更改为25M
- 大航海时代2阿兰攻略(SFC日版)