




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Android中怎么实现点击生成二维码功能
这期内容当中在下将会给大家带来有关Android中怎么实现点击生成二维码功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。QRCodeUtil:package
com.example.administrator.zxing;
import
android.graphics.Bitmap;
import
android.graphics.Canvas;
import
com.google.zxing.BarcodeFormat;
import
com.google.zxing.EncodeHintType;
import
com.google.zxing.WriterException;
import
mon.BitMatrix;
import
com.google.zxing.qrcode.QRCodeWriter;
import
com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.util.HashMap;
import
java.util.Map;
public
class
QRCodeUtil
{
public
static
boolean
createQRImage(String
content,
int
widthPix,
int
heightPix,
Bitmap
logoBm,
String
filePath)
{
try
{
if
(content
==
null
||
"".equals(content))
{
return
false;
}
//配置参数
Map<EncodeHintType,
Object>
hints
=
new
HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET,
"utf-8");
//容错级别
hints.put(EncodeHintType.ERROR_CORRECTION,
ErrorCorrectionLevel.H);
//设置空白边距的宽度
//
hints.put(EncodeHintType.MARGIN,
2);
//default
is
4
//
图像数据转换,使用了矩阵转换
BitMatrix
bitMatrix
=
new
QRCodeWriter().encode(content,
BarcodeFormat.QR_CODE,
widthPix,
heightPix,
hints);
int[]
pixels
=
new
int[widthPix
*
heightPix];
//
下面这里按照二维码的算法,逐个生成二维码的图片,
//
两个for循环是图片横列扫描的结果
for
(int
y
=
0;
y
<
heightPix;
y++)
{
for
(int
x
=
0;
x
<
widthPix;
x++)
{
if
(bitMatrix.get(x,
y))
{
pixels[y
*
widthPix
+
x]
=
0xff000000;
}
else
{
pixels[y
*
widthPix
+
x]
=
0xffffffff;
}
}
}
//
生成二维码图片的格式,使用ARGB_8888
Bitmap
bitmap
=
Bitmap.createBitmap(widthPix,
heightPix,
Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels,
0,
widthPix,
0,
0,
widthPix,
heightPix);
if
(logoBm
!=
null)
{
bitmap
=
addLogo(bitmap,
logoBm);
}
//必须使用compress方法将bitmap保存到文件中再进行读取。直接返回的bitmap是没有任何压缩的,内存消耗巨大!
return
bitmap
!=
null
&&
press(Bitmap.CompressFormat.JPEG,
100,
new
FileOutputStream(filePath));
}
catch
(WriterException
|
IOException
e)
{
e.printStackTrace();
}
return
false;
}
/**
*
在二维码中间添加Logo图案
*/
private
static
Bitmap
addLogo(Bitmap
src,
Bitmap
logo)
{
if
(src
==
null)
{
return
null;
}
if
(logo
==
null)
{
return
src;
}
//获取图片的宽高
int
srcWidth
=
src.getWidth();
int
srcHeight
=
src.getHeight();
int
logoWidth
=
logo.getWidth();
int
logoHeight
=
logo.getHeight();
if
(srcWidth
==
0
||
srcHeight
==
0)
{
return
null;
}
if
(logoWidth
==
0
||
logoHeight
==
0)
{
return
src;
}
//logo大小为二维码整体大小的1/5
float
scaleFactor
=
srcWidth
*
1.0f
/
5
/
logoWidth;
Bitmap
bitmap
=
Bitmap.createBitmap(srcWidth,
srcHeight,
Bitmap.Config.ARGB_8888);
try
{
Canvas
canvas
=
new
Canvas(bitmap);
canvas.drawBitmap(src,
0,
0,
null);
canvas.scale(scaleFactor,
scaleFactor,
srcWidth
/
2,
srcHeight
/
2);
canvas.drawBitmap(logo,
(srcWidth
-
logoWidth)
/
2,
(srcHeight
-
logoHeight)
/
2,
null);
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
}
catch
(Exception
e)
{
bitmap
=
null;
e.getStackTrace();
}
return
bitmap;
}
}MainActivity:package
com.example.administrator.zxing;
import
android.content.Context;
import
android.graphics.BitmapFactory;
import
android.os.Bundle;
import
android.os.Environment;
import
android.support.v7.app.AppCompatActivity;
import
android.view.View;
import
android.widget.Button;
import
android.widget.CheckBox;
import
android.widget.EditText;
import
android.widget.ImageView;
import
java.io.File;
public
class
MainActivity
extends
AppCompatActivity
{
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//内容
final
EditText
contentET
=
(EditText)
findViewById(R.id.create_qr_content);
//显示二维码图片
final
ImageView
imageView
=
(ImageView)
findViewById(R.id.create_qr_iv);
//是否添加Logo
final
CheckBox
addLogoCB
=
(CheckBox)
findViewById(R.id.create_qr_addLogo);
Button
createQrBtn
=
(Button)
findViewById(R.id.create_qr_btn);
createQrBtn.setOnClickListener(new
View.OnClickListener()
{
@Override
public
void
onClick(View
v)
{
final
String
filePath
=
getFileRoot(MainActivity.this)
+
File.separator
+
"qr_"
+
System.currentTimeMillis()
+
".jpg";
//二维码图片较大时,生成图片、保存文件的时间可能较长,因此放在新线程中
new
Thread(new
Runnable()
{
@Override
public
void
run()
{
boolean
success
=
QRCodeUtil.createQRImage(contentET.getText().toString().trim(),
800,
800,
addLogoCB.isChecked()
?
BitmapFactory.decodeResource(getResources(),
R.mipmap.qr_logo)
:
null,
filePath);
if
(success)
{
runOnUiThread(new
Runnable()
{
@Override
public
void
run()
{
imageView.setImageBitmap(BitmapFactory.decodeFile(filePath));
}
});
}
}
}).start();
}
});
}
//文件存储根目录
private
String
getFileRoot(Context
context)
{
if
(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
File
external
=
context.getExternalFilesDir(null);
if
(external
!=
null)
{
return
external.getAbsolutePath();
}
}
return
context.getFilesDir().getAbsolutePath();
}
}布局:
activity_main:<?xml
version="1.0"
encoding="utf-8"?>
<LinearLayout
xmlns:android="/apk/res/android"
xmlns:app="/apk/res-auto"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.administrator.zxing.MainActivity">
<EditText
android:id="@+id/create_qr_content"
android:layout_width="match_parent"
android:layout_he
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年宁夏高校毕业生“三支一扶”招募考试试题【答案】
- 消费电子和绿色家电更新消费市场调研与分析
- 矿服务站安全述职报告范文
- 消防应急救援实战演练方案
- 湘艺版四年级上册音乐《卓玛》教案
- 2025年血液灌流吸附器项目建议书
- 2025年PA9T合作协议书
- 技术进步与教育法规的互动关系研究
- 提升教育数据安全保障学生隐私权益
- 中职文秘课件
- 公选副科考试试题及答案
- 热控专业考试题库及答案
- 2025年克拉玛依市公安局招聘警务辅助人员考试笔试试题(含答案)
- 中国陶瓷史题目及答案
- 湖北省2025年中考英语真题试卷(含答案)
- 高龄卧床高危静脉血栓栓塞症防治中国专家共识解读 2
- 2025年中远海运集团招聘笔试备考题库(带答案详解)
- 护理查房与病历讨论
- 2025至2030儿童安全椅市场发展趋势分析与未来投资战略咨询研究报告
- 酒精所致精神障碍护理查房
- 2025-2030中国遥控武器站行业现状调研与前景趋势预测报告
评论
0/150
提交评论