![【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android 中怎么實(shí)現(xiàn)點(diǎn)擊生成二維碼功能_第1頁(yè)](http://file4.renrendoc.com/view/814b944dba3d37ec7a31323efa6125c0/814b944dba3d37ec7a31323efa6125c01.gif)
![【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android 中怎么實(shí)現(xiàn)點(diǎn)擊生成二維碼功能_第2頁(yè)](http://file4.renrendoc.com/view/814b944dba3d37ec7a31323efa6125c0/814b944dba3d37ec7a31323efa6125c02.gif)
![【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android 中怎么實(shí)現(xiàn)點(diǎn)擊生成二維碼功能_第3頁(yè)](http://file4.renrendoc.com/view/814b944dba3d37ec7a31323efa6125c0/814b944dba3d37ec7a31323efa6125c03.gif)
![【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android 中怎么實(shí)現(xiàn)點(diǎn)擊生成二維碼功能_第4頁(yè)](http://file4.renrendoc.com/view/814b944dba3d37ec7a31323efa6125c0/814b944dba3d37ec7a31323efa6125c04.gif)
![【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android 中怎么實(shí)現(xiàn)點(diǎn)擊生成二維碼功能_第5頁(yè)](http://file4.renrendoc.com/view/814b944dba3d37ec7a31323efa6125c0/814b944dba3d37ec7a31323efa6125c05.gif)
下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】Android中怎么實(shí)現(xiàn)點(diǎn)擊生成二維碼功能
這期內(nèi)容當(dāng)中在下將會(huì)給大家?guī)?lái)有關(guān)Android中怎么實(shí)現(xiàn)點(diǎn)擊生成二維碼功能,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。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;
}
//配置參數(shù)
Map<EncodeHintType,
Object>
hints
=
new
HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET,
"utf-8");
//容錯(cuò)級(jí)別
hints.put(EncodeHintType.ERROR_CORRECTION,
ErrorCorrectionLevel.H);
//設(shè)置空白邊距的寬度
//
hints.put(EncodeHintType.MARGIN,
2);
//default
is
4
//
圖像數(shù)據(jù)轉(zhuǎn)換,使用了矩陣轉(zhuǎn)換
BitMatrix
bitMatrix
=
new
QRCodeWriter().encode(content,
BarcodeFormat.QR_CODE,
widthPix,
heightPix,
hints);
int[]
pixels
=
new
int[widthPix
*
heightPix];
//
下面這里按照二維碼的算法,逐個(gè)生成二維碼的圖片,
//
兩個(gè)for循環(huán)是圖片橫列掃描的結(jié)果
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保存到文件中再進(jìn)行讀取。直接返回的bitmap是沒(méi)有任何壓縮的,內(nèi)存消耗巨大!
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);
//內(nèi)容
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";
//二維碼圖片較大時(shí),生成圖片、保存文件的時(shí)間可能較長(zhǎng),因此放在新線程中
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();
}
});
}
//文件存儲(chǔ)根目錄
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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 1《白鷺》說(shuō)課稿-2024-2025學(xué)年統(tǒng)編版語(yǔ)文五年級(jí)上冊(cè)
- 2025技術(shù)咨詢合同書
- 2025大連市住宅小區(qū)物業(yè)管理委托合同
- 2024年五年級(jí)品社下冊(cè)《同是炎黃子孫》說(shuō)課稿 山東版001
- 5《玲玲的畫》說(shuō)課稿-2024-2025學(xué)年語(yǔ)文二年級(jí)上冊(cè)統(tǒng)編版
- 2023二年級(jí)數(shù)學(xué)下冊(cè) 6 有余數(shù)的除法第5課時(shí) 解決問(wèn)題(1)說(shuō)課稿 新人教版
- 27我的伯父魯迅先生(說(shuō)課稿)-2024-2025學(xué)年六年級(jí)上冊(cè)語(yǔ)文統(tǒng)編版001
- 2024-2025學(xué)年高中地理下學(xué)期第4周說(shuō)課稿(世界的自然資源)
- 2023三年級(jí)數(shù)學(xué)上冊(cè) 一 動(dòng)物趣聞-克、千克、噸的認(rèn)識(shí) 信息窗2噸的認(rèn)識(shí)說(shuō)課稿 青島版六三制
- 蕪湖廠房推拉棚施工方案
- 運(yùn)動(dòng)技能學(xué)習(xí)與控制課件第五章運(yùn)動(dòng)中的中樞控制
- 財(cái)務(wù)部規(guī)范化管理 流程圖
- 蘇教版2023年小學(xué)四年級(jí)數(shù)學(xué)下冊(cè)教學(xué)計(jì)劃+教學(xué)進(jìn)度表
- 小學(xué)作文指導(dǎo)《難忘的一件事》課件
- 斷絕關(guān)系協(xié)議書范文參考(5篇)
- 量子力學(xué)課件1-2章-波函數(shù)-定態(tài)薛定諤方程
- 最新變態(tài)心理學(xué)課件
- 工程洽商記錄表格
- 【自考練習(xí)題】石家莊學(xué)院概率論與數(shù)理統(tǒng)計(jì)真題匯總(附答案解析)
- 農(nóng)村集體“三資”管理流程圖
- 高中英語(yǔ) 牛津譯林版必修第三冊(cè) Unit 2詞匯全解
評(píng)論
0/150
提交評(píng)論