文档章节

android实现二维码,并将二维码保存至SD卡

ht896632
 ht896632
发布于 2016/03/02 14:07
字数 831
阅读 29
收藏 0

利用开源zxing(http://code.google.com/p/zxing/)项目生成二维码

1.下载zxing的核心包,core.jar,一般在网上没有直接提供此jar文件的下载,后面我将会上传,在项目根目录下建立libs文件夹,将下载的jar文件放在libs目录下,注意,文件夹的名字一定要是libs,否则会报错。

2.实现二维码的生成,业务类

public class QRCodeService {
	// 图片大小,注意图片不要设置太大,否则会影响二维码的识别
	private static final int IMAGE_WIDTH = 30;

	/**
	 * 生成普通二维码方法
	 * 
	 * @param 传入二维码的内容
	 * @return Bitmap 插入到二维码中间的位图对象,可以传入Null,传入NULL后,生成的二维码中间不带图片
	 */
	public Bitmap cretaeBitmap(String str, Bitmap mBitmap) throws Exception {
		Map<EncodeHintType, Object> hints = new EnumMap<EncodeHintType, Object>(
				EncodeHintType.class);
		hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
		hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

		// 生成二维矩阵,编码时指定大小,不要生成了图片以后再进行缩放,这样会模糊导致识别失败
		BitMatrix matrix = new MultiFormatWriter().encode(str,
				BarcodeFormat.QR_CODE, 300, 300, hints);
		int width = matrix.getWidth();
		int height = matrix.getHeight();
		// 二维矩阵转为一维像素数组,也就是一直横着排了
		int halfW = width / 2;
		int halfH = height / 2;
		int[] pixels = new int[width * height];
		for (int y = 0; y < height; y++) {
			for (int x = 0; x < width; x++) {
				// 如果mBitmap不为空,则添加中间小图片
				if (mBitmap != null && x > halfW - IMAGE_WIDTH
						&& x < halfW + IMAGE_WIDTH && y > halfH - IMAGE_WIDTH
						&& y < halfH + IMAGE_WIDTH) {
					pixels[y * width + x] = mBitmap.getPixel(x - halfW
							+ IMAGE_WIDTH, y - halfH + IMAGE_WIDTH);
				} else {
					if (matrix.get(x, y)) {
						pixels[y * width + x] = 0xff314785;// 生成二维码填充的颜色。黑色
					}
				}
			}
		}
		Bitmap bitmap = Bitmap.createBitmap(width, height,
				Bitmap.Config.ARGB_8888);
		// 通过像素数组生成bitmap位图
		bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
		return bitmap;
	}

	/**
	 * 生成中间带图片的二维码
	 * 
	 * @param image
	 *            设置需要放在二维码中间的图片
	 * @content 传入二维码的内容
	 * @resources Resources获得对象
	 */
	public Bitmap createImageViewQRBitmap(int image, String content,
			Resources resources) throws Exception {
		// 构造需要插入的位图对象
		Bitmap mBitmap = ((BitmapDrawable) resources.getDrawable(image))
				.getBitmap();
		// 进行缩放图片
		Matrix m = new Matrix();
		float sx = (float) 2 * IMAGE_WIDTH / mBitmap.getWidth();
		float sy = (float) 2 * IMAGE_WIDTH / mBitmap.getHeight();
		m.setScale(sx, sy);
		// 重新构造位图对象
		mBitmap = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(),
				mBitmap.getHeight(), m, true);
		mBitmap = cretaeBitmap(content, mBitmap);
		return mBitmap;
	}
}
3.将生成的二维码保存在SD卡上

/**
 * 将生成的二维码保存在SD卡
 */
public class QRToSDcardSaveService {

	/**
	 * 将位图对象转换为字节数组
	 * @param bm
	 * @return
	 */
	private byte[] Bitmap2Bytes(Bitmap bitmap) {
		ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
		bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
		return outputStream.toByteArray();
	}
	/**
	 * 保存二维码至SD卡
	 * @param filename
	 * @param bitmap
	 */
	public void saveToSDCard(String filename, Bitmap bitmap) throws Exception {
		// 获取SD卡的路径:Environment.getExternalStorageDirectory()
		File file = new File(Environment.getExternalStorageDirectory(),
				filename);
		FileOutputStream outStream = new FileOutputStream(file);
		outStream.write(Bitmap2Bytes(bitmap));
		outStream.close();
	}
}
4.调用

public class MyCardActivity extends Activity {
	private QRCodeService service;
	private QRToSDcardSaveService dcardSaveService;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ImageView imageView=(ImageView)this.findViewById(R.id.card);//用来显示二维码的视图
         service=new QRCodeService();//生成二维码的业务类
         dcardSaveService=new QRToSDcardSaveService();//保存二维码至SD卡的业务类
        try {
        	//生成二维码
        	Bitmap b=service.createImageViewQRBitmap(R.drawable.ic_launcher, "要存入的信息",getResources());
        	imageView.setImageBitmap(b);//将生成的二维码显示在视图控件上
        	dcardSaveService.saveToSDCard("ggg1.png", b);//将生成的二维码保存在SD卡上
		} catch (Exception e) {
			e.printStackTrace();
			Toast.makeText(this, R.string.error, 1).show();
		}
    }
}
注意:将二维码保存在SD卡上需要写入权限,在项目清单文件中增加

<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
源码下载地址: android实现二维码源码下载


© 著作权归作者所有

共有 人打赏支持
ht896632
粉丝 37
博文 53
码字总数 31361
作品 0
闵行
高级程序员
私信 提问
开源中国安卓客户端更新,支持语音动弹

这是 OSCHINA 官方开发的 Android 客户端软件,采用原生 API 开发,非 HTML 模式。 开源中国安卓客户端 v1.7.6.4 版更新资讯: OSChina.NET for Android v1.7.6.4 更新日志: 1、语音动弹发布...

火蚁
2014/02/11
4.3K
54
zxing生成解析二维码以及二维码生成解析的一个Android应用程序

二维码技术不是什么新技术了,但是这几天工作用到,然后才现学习现使用,使用的是Google的ZXing,使用起来很简单, 我练习的两种方式,一种的简单的javase工程,一种是Android客户端生成解析...

Mysoft
2015/11/13
0
0
[前端][微信浏览器/canvas]长按二维码图片无法扫描问题的解决方法

最近开发H5,用户浏览的环境主要是在微信下。 H5的最后一页是用canvas的toDataUrl生成了一个base64的图片,然后放到img标签里放在最顶上,让用户可以长按图片保存和扫描二维码。 但是实际测试...

江湖游医黄半仙
2018/04/24
0
0
[Unity3D]自制UnityForAndroid二维码扫描插件

一周左右终于将二维码生成和扫描功能给实现了,终于能舒缓一口气了,从一开始的疑惑为啥不同的扫码客户端为啥扫出来的效果不同?通用的扫描器扫出来就是一个下载APK,自制的扫描器扫出来是想...

丁小未
2014/05/01
0
0
关于微信的那点帖。。。。。。(各种实例)

照惯例发帖先吐槽一下:最近看到大家发防微信功能特别的多,所以就汇总了一下,看看大家还有什么其他方面的汇总需求,回复我噢,均可满足。。。。。 (ps:有些帖子由于主观、客观还有神马原因...

程序袁_绪龙
2015/04/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
7
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
2
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
3
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部