在開發(fā)中需要將信息轉(zhuǎn)換為二維碼存儲并要求帶有公司的logo,我們知道Google的Zxing開源項(xiàng)目就很好的幫助我們實(shí)現(xiàn)條形碼、二維碼的生成和解析,但帶有l(wèi)ogo的官網(wǎng)并沒有提供demo,下面就通過實(shí)例看看如何實(shí)現(xiàn)以及Zxing的使用。
二、案例介紹
1、案例運(yùn)行效果
2、案例準(zhǔn)備工作
在項(xiàng)目中加入jar,只需加入core.jar
Zxing項(xiàng)目地址:https://github.com/zxing/zxing/
三、Zxing主要組件
1、BarcodeFormat
定義了不同的二進(jìn)制編碼方式,取值如下
EAN_13條形碼,共計(jì)13位代碼,比較常見,如商品上的包裝上的都是這種條形碼
CODE_QR二維碼(矩陣碼),比條形碼存在更多信息,當(dāng)下比較流行
CODE_128條形碼 可表示可表示從 ASCII 0 到ASCII 127 共128個字符,用于企業(yè)管理,生產(chǎn)流程控制
CODE_39條形碼,編制簡單只接受如下43個字符
2、MultiFormatWriter
主要包含一個 encode方法,可實(shí)現(xiàn)產(chǎn)生編碼(條形、二維碼)
BitMatrix encode(String contents, BarcodeFormat format, int width, int height,Hashtable hints)方法
參數(shù):
contents:要編碼的內(nèi)容
format:編碼格式(條形、二維)
width,height:生成碼的大小
hints:包含EncodeHintType(編碼提示類型)信息的集合,主要設(shè)置字符編碼,比如支持漢字的utf-8,如下:
Hashtable hst = new Hashtable;
hst.put(EncodeHintType.CHARACTER_SET, ;UTF-8″);
返回值:BitMatrix 二維矩陣點(diǎn)
3、BitMatrix
BitMatrix :表現(xiàn)為一個二維矩陣,x表示列的位置,y表示行的位置,循序從左上角開始,一列一列排列(先x后y)
主要方法:
getWidth:返回矩陣的寬度
getHeight:返回矩陣的高度
boolean get(x,y) :非常重要的方法,實(shí)現(xiàn)根據(jù)給定的x,y判斷該位置是否有黑塊
在產(chǎn)生二維碼的應(yīng)用中就是通過這個方法進(jìn)行判斷,然后把有黑塊的點(diǎn)記錄下來,使用Bitmap的setPixels方法生成圖形,詳解案例的createCode方法中的代碼
四、完整代碼
public class MainActivity extends Activity {
private EditText etCompany;
private EditText etPhone;
private EditText etEmail;
private EditText etWeb;
private Bitmap logo;
private static final int IMAGE_HALFWIDTH = 40;//寬度值,影響中間圖片大小
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//獲得資源圖片,可改成獲取本地圖片或拍照獲取圖片
logo=BitmapFactory.decodeResource(super.getResources,R.drawable.y014);
etCompany =(EditText) findViewById(R.id.etCompany);
etPhone=(EditText) findViewById(R.id.etPhone);
etEmail =(EditText) findViewById(R.id.etEmail);
etWeb =(EditText) findViewById(R.id.etWeb);
findViewById(R.id.but).setOnClickListener(new OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String company=etCompany.getText.toString.trim ;
String phone =etPhone .getText.toString.trim ;
String email = etEmail.getText.toString.trim ;
String web = etWeb.getText.toString.trim ;
//二維碼中包含的文本信息
String contents= "BEGIN:VCARD/nVERSION:3.0/nORG:"+company+"/nTEL:"+phone+"/nURL:"+web+"/nEMAIL:"+email+"/nEND:VCARD";
try {
//調(diào)用方法createCode生成二維碼
Bitmap bm=createCode(contents,logo,BarcodeFormat.QR_CODE);
ImageView img=(ImageView)findViewById(R.id.imgCode) ;
//將二維碼在界面中顯示
img.setImageBitmap(bm);
} catch (WriterException e) {
// TODO Auto-generated catch block
e.printStackTrace;
}
}
});
}
/**
* 生成二維碼
* @param string 二維碼中包含的文本信息
* @param mBitmap logo圖片
* @param format 編碼格式
* @return Bitmap 位圖
* @throws WriterException
*/
public Bitmap createCode(String string,Bitmap mBitmap, BarcodeFormat format)
throws WriterException {
Matrix m = new Matrix;
float sx = (float) 2 * IMAGE_HALFWIDTH / mBitmap.getWidth;
float sy = (float) 2 * IMAGE_HALFWIDTH
/ mBitmap.getHeight;
m.setScale(sx, sy);//設(shè)置縮放信息
//將logo圖片按martix設(shè)置的信息縮放
mBitmap = Bitmap.createBitmap(mBitmap, 0, 0,
mBitmap.getWidth, mBitmap.getHeight, m, false);
MultiFormatWriter writer = new MultiFormatWriter;
Hashtable hst = new Hashtable;
hst.put(EncodeHintType.CHARACTER_SET, "UTF-8");//設(shè)置字符編碼
BitMatrix matrix = writer.encode(string, format, 400, 400, hst);//生成二維碼矩陣信息
int width = matrix.getWidth;//矩陣高度
int height = matrix.getHeight;//矩陣寬度
int halfW = width / 2;
int halfH = height / 2;
int[] pixels = new int[width * height];//定義數(shù)組長度為矩陣高度*矩陣寬度,用于記錄矩陣中像素信息
for (int y = 0; y height; y++) {//從行開始迭代矩陣
for (int x = 0; x width; x++) {//迭代列
if (x halfW - IMAGE_HALFWIDTH && x halfW + IMAGE_HALFWIDTH
&& y halfH - IMAGE_HALFWIDTH
&& y halfH + IMAGE_HALFWIDTH) {//該位置用于存放圖片信息
//記錄圖片每個像素信息
pixels[y * width + x] = mBitmap.getPixel(x - halfW
+ IMAGE_HALFWIDTH, y - halfH + IMAGE_HALFWIDTH); } else {
if (matrix.get(x, y)) {//如果有黑塊點(diǎn),記錄信息
pixels[y * width + x] = 0xff000000;//記錄黑塊信息
}
}
}
}
Bitmap bitmap = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);
// 通過像素?cái)?shù)組生成bitmap
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
}
}
找到桌面上的設(shè)置按鈕或下滑通知欄右上方的設(shè)置按鈕。進(jìn)入設(shè)......
閱讀soul的聊天記錄刪除后是無法恢復(fù)的,由于soul的聊天記錄都會保......
閱讀花唄收款二維碼可以商家服務(wù)頁面選項(xiàng)中找到,但是先需要開通......
閱讀微信刪除的賬單是不可以恢復(fù)的,當(dāng)刪除賬單的時候,會提示刪......
閱讀顯示tim移動在線是手機(jī)上使用了TIM版本的QQ登錄的賬號,所以會......
閱讀安卓5.0什么時候推送?大家可以通過下文來了解android安卓5.0推送時間的消息,安卓Android5.0將在什么時候能夠推送到手機(jī)上呢?大家可以通過下文來了解詳細(xì)內(nèi)容哦。 雖然Android 5.0要花較長...
次閱讀
支付寶境外流量包好用嗎?可能很多用戶對于支付寶中的境外流量包還不清楚,那么支付寶境外流量包在香港好用嗎?下文小樂哥給大家介紹一下!...
次閱讀
問: 安卓手機(jī) 充電很慢怎么辦? 答:首先要檢查的就是數(shù)據(jù)線的問題,有些數(shù)據(jù)線用的久了接口會出現(xiàn)問題,安卓系統(tǒng)手機(jī)的數(shù)據(jù)線基本都是通用的,換一根其他的數(shù)據(jù)線試試,如果不...
次閱讀
安卓6.0彩蛋是什么?安卓6.0彩蛋怎么獲得?谷歌在每一代安卓系統(tǒng)里面都會隱藏一個小彩蛋,呼出方式就是在狂點(diǎn)幾下系統(tǒng)版本號,然后就會出現(xiàn)一代號形象為主題的畫面。而這次的安卓...
次閱讀
大量Android 5.0用戶稱自己設(shè)備的耗電速度過快。原版Lollipop當(dāng)中的確存在Wi-Fi引發(fā)的耗電問題,但谷歌已經(jīng)在Android 5.0.1當(dāng)中進(jìn)行了修復(fù)。Android 5.0本該提升設(shè)備的續(xù)航,因此如果你的設(shè)備...
次閱讀
1)首先,進(jìn)入手機(jī)設(shè)置,然后在設(shè)置菜單里找到并點(diǎn)擊進(jìn)入日期與時間。 2)在這里,你可以看見自動確定日期和時間和自動確定市區(qū),把這兩個選項(xiàng)都打上勾,以后系統(tǒng)在有網(wǎng)的情況下...
次閱讀
安卓手機(jī)如何查看已連接的Wifi密碼?...
次閱讀
1)進(jìn)入設(shè)置界面點(diǎn)擊【手勢體感】,再點(diǎn)擊【亮屏手勢】。(如下圖) 2)在亮屏手勢界面開啟【三指截屏】右邊開關(guān)即可。(如下圖)...
次閱讀
中國移動和手機(jī)多少錢?中國移動和品牌新款手機(jī)亮相工信部,型號為M823,還不知道該機(jī)售價的朋友,可以來看看中國移動和手機(jī)價格介紹了解下! 中國移動和手機(jī)配有5.5英寸屏幕;分辨...
次閱讀
1)打開【手機(jī)支付寶】,進(jìn)入首頁點(diǎn)擊左上角的【頭像】進(jìn)入個人資料。(如下圖) 2)點(diǎn)擊【設(shè)置】一項(xiàng),跳轉(zhuǎn)后再選擇【隱私】。(如下圖) 3)點(diǎn)擊【不讓他(她)看我的真實(shí)姓名】,接著點(diǎn)...
次閱讀
1)進(jìn)入三星A7的相機(jī)界面,點(diǎn)擊【模式】,選擇【動畫GIF】。(如下圖) 2)點(diǎn)擊【確定】,長按【拍攝按鈕】。(如下圖) 3)連續(xù)拍攝20張照片,拍完后查看效果,滿意就點(diǎn)擊右上角【保存】即...
次閱讀
首先我們需要下載騰訊手機(jī)管家并安裝到手機(jī)上。 安裝好騰訊手機(jī)管家后,我們打開騰訊手機(jī)管家并選擇隱私保護(hù)。 在隱私保護(hù)中我們可以看到立即開啟,點(diǎn)選此按鈕。 然后就是設(shè)置...
次閱讀
1)1、進(jìn)入三星S5的【設(shè)定】,點(diǎn)擊【通話】;(如下圖) 2)勾選【通話通知彈出窗口】后有來電就會以懸浮窗口的形式顯示了;(如下圖) 3)點(diǎn)擊懸浮窗口右上角的【放大標(biāo)志】可以恢復(fù)正常的...
次閱讀
1)為了不使流量白白浪費(fèi),我們先拉下下拉菜單,點(diǎn)擊相關(guān)按鍵,關(guān)閉數(shù)據(jù)連接。 2)接著我們在提示下載的通知位置長按,如圖,出現(xiàn)【應(yīng)用程序信息】按鍵點(diǎn)擊。 3)點(diǎn)擊【應(yīng)用程序信...
次閱讀
首先下載第三方的recovery,如果你已經(jīng)刷入可以忽略。 然后放到c:/adb目錄中,如果沒有需要自己建立 下載Supersu 2.0,然后將下載的Supersu 2.0文件放入到Nexus5根目錄中 刷入recovery,將手機(jī)...
次閱讀