Android開發——Android中的二維碼生成與掃描
0. 前言
今天這篇文章主要描述二維碼的生成與掃描,使用目前流行的Zxing,為什麼要講二維碼,因為二維碼太普遍了,隨便一個Android APP都會有二維碼掃描。本篇旨在幫助有需求的同學快速完成二維碼生成和掃描的功能。
本篇轉載自:http://blog.csdn.net/hai_qing_xu_kong/article/details/51260428
1. Zxing的使用
從github上下載專案後,可以看到整體程式碼結構如下:
我們只需將Zxing包下的所有程式碼copy一份到我們的專案中去,除了這些還需要zxing的jar包,最後相應的資原始檔,包括values檔案下的ids檔案、raw檔案中的資原始檔(可以替換)、
2. 生成二維碼的實現
等上面工作全部準備完畢後,就可以建立我們的二維碼了。如何生成二維碼?
需要EncodingUtils這個二維碼生成工具類。通過呼叫工具類中的createQRCode()方法來生成二維碼。該方法引數介紹如下:
/* * content:二維碼內容 * widthPix:二維碼寬度 * heightPix:二維碼高度 * logoBm:二維碼中間的logo對應的Bitmap */ public static Bitmap createQRCode(String content, int widthPix, int heightPix, Bitmap logoBm)
下面完成的是生成的一個百度地址的二維碼,中間LOGO是Android小機器人。並儲存圖片到本地,方便後續測試二維碼的本地讀取功能。
/** * 建立、展示二維碼並將bitmap儲存在本地 */ 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 (Exception 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/"))); }
看到如下效果:
3. 讀取二維碼的實現
3.1 攝像頭掃描的方式
二維碼掃描需要藉助於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);
}
@Override
protected 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);
}
}
3.2 本地圖片掃描的方式
掃描本地圖片需要我們在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);
}
開啟系統圖片庫後選擇圖片,這時需要重寫onActivityResult()方法用於返回圖片資訊。
@Override
protected 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() {
@Override
public void run() {
Result result = scanningImage(photo_path);
if (result != null) {
handleDecode(result, new Bundle());
}
}
}).start();
break;
}
}
}
獲取圖片路徑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();
}
獲取到圖片路徑後需要將其二維碼資訊包裝成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;
}
根據路徑獲取Bitmap,最後通過QRCodeReader 中的decode方法解析成Result物件並返回,最終傳遞給handleDecode方法。執行程式效果如下,掃描出來的是之前定義的百度地址。
最後不要忘了申明許可權和CaptureActivity。
<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"/>
<activity android:name="com.example.zxingtest.zxing.activity.CaptureActivity"/>
相關推薦
Android開發——Android中的二維碼生成與掃描
0. 前言今天這篇文章主要描述二維碼的生成與掃描,使用目前流行的Zxing,為什麼要講二維碼,因為二維碼太普遍了,隨便一個Android APP都會有二維碼掃描。本篇旨在幫助有需求的同學快速完成二維碼生成和掃描的功能。本篇轉載自:http://blog.csdn.net/ha
Android使用zxing-android-embedded(由zxing開發)實現二維碼生成和掃描
前言: 目前二維碼(條形碼)的使用非常廣泛,所以啊,就想去實現以下嘛,最簡單的方法就是選擇開源庫了。 在網上一查開源庫還是很多的,介紹使用最多的就是zxing,所以這裡也就是用zxing了。但是由於zxing開源庫太大了,有很多不是Android要用的,所以
iOS第三方二維碼生成與掃描
匯入第三方框架libqrencode(生成二維碼)和ZBarSDK(二維碼掃描) 匯入標頭檔案 #import "QRCodeGenerator.h" #import "ZBarSDK.h" 建立兩個按鈕點選事件 點選按鈕一實現生成二維碼 - (I
Android用Zxing掃二維碼/生成二維碼功能
新年已過,一切恢復真正常,新的一年給自己幾句指引: 光努力還不行,方向很重要。 總是想著最壞的結果,就會讓人失去改變的勇氣。 你當然有權利選擇自己的人生--但只有在你真正強大後,逆行的阻力才會降到最小。 never say never. 下面開始記錄二維碼使用過程
Android 二維碼生成,掃描,近距離識別優化,從相簿選擇二維碼識別
做了一個二維碼掃描圖片,主要是掃描不出來,看到一篇部落格,其中的第二種方法可以掃描到,在此做筆記,以備後用,前面的進入相簿,返回,到獲取圖片路徑方法都一樣; (1):二維碼生成的方法順便貼上: private Bitmap createQRImage(String url, final
玩轉Android之二維碼生成與識別
二維碼,我們也稱作QRCode,QR表示quick response即快速響應,在很多App中我們都能見到二維碼的身影,最常見的莫過於微信了。那麼今天我們就來看看怎麼樣在我們自己的App中整合二維碼的掃描與生成功能。OK,廢話不多說,我們就開始做吧。二維碼的使用我主要想分為兩
在android上實現二維碼生成和掃描
先在androidstudio上匯入libzing的Module,然後再app上把那個libzing新增上去,這樣我們的app就關聯了那個libzing庫了 然後我們就只在app這個工程下寫程式碼就行了。activity_main.xml佈局如下
Java二維碼生成與解碼工具Zxing使用
trace character sta 解碼 iter() font 生成 char type 1 package com.csii.zxing.test; 2 3 import java.awt.image.BufferedImage; 4 import j
Java二維碼生成與解碼
添加 1.3 pin part 字符集 bit reader -- inpu 基於google zxing 的Java二維碼生成與解碼 一、添加Maven依賴(解碼時需要上傳二維碼圖片,所以需要依賴文件上傳包) <!-- google二維碼工具 --&g
微信帶場景引數的二維碼生成與使用
應用場景:公眾號推廣時,使用者通過掃碼關注公眾號,需要統計使用者是通過誰的二維碼進行關注。 思路:在使用者掃碼關注公眾號時,二維碼帶上推廣者的id,在關注公眾號後,獲取到該推廣者的id。 目前有2種類型的二維碼: 1、臨時二維碼,是有過期時間的,最長可以設
二維碼生成與讀取
一、通過Zxing生成與讀取: 生成二維碼: int width=300; int height=300; String format="png"; String conte
你不可錯過的二維碼生成與解析-java後臺與前端js都有
1.二維碼分類 二維條碼也有許多不同的碼制,就碼制的編碼原理而言,通常分為三種類型。 線性堆疊式二維碼 編碼原理: 建立在一維條碼基礎之上,按需要堆積成兩行或多行。 圖示: 矩陣式二維碼 最常用編碼,原理: 在一個矩形空間通過黑白畫素在矩陣中的不同分佈進行編碼。在
二維碼生成、掃描、圖片識別(Zxing)
這樣的例子雖然已經很多了,不過我在網上瀏覽了一圈,也沒找到幾個相簿二維碼圖片識別例子,好的演算法識別率才高。這裡有一個好點的演算法,演算法不是我寫的,只是作為整理記錄,給眾多安卓開發者一個方便。demo的UI有點low,不過功能卻是實實在在,有需要的朋友可以自定義一些UI介
微信帶場景參數的二維碼生成與使用功能實現?
mar 進入 分享 mage term 永久 擔心 type color 參數二維碼原理介紹:公眾號目前有2種類型的二維碼1、臨時二維碼,30天有效期2、永久二維碼,沒有失效時間 渠道二維碼生成(參數二維碼生成) 1、登錄微號幫 2、登錄後進入管理中心首頁選擇->功能
Android開發實現二維碼生成
要根據內容來實現二維碼的生成,這裡需要用到一個第三方的jar包(Google的開源jar包zxing.jar) 下面直接貼上我寫好的最最最簡單的demo public Bitmap setCode(String contents,int width,int height){
Android二維碼生成
roi fse black ima deb ecif character put isp 最新在學習adnroid,遇到二維碼的生成與掃描在此做個整理 貼下二維碼生成的工具類 /** * 二維碼生成工具類 */ public class
Android 二維碼 生成和識別(附Demo原始碼)
今天講一下目前移動領域很常用的技術——二維碼。現在大街小巷、各大網站都有二維碼的蹤跡,不管是IOS、Android、WP都有相關支援的軟體。之前我就想了解二維碼是如何工作,最近因為工作需要使用相關技術,所以做了初步瞭解。今天主要是講解如何使用ZXing庫,生成和識別二維碼。這篇文章實用性為主,理
Android 使用Zxing實現二維碼的生成,掃描
在專案中要使用到二維碼的相關內容,百度(原諒我還在用)之後得知一半都是使用Google的開源庫 Zxing,但是網上多半的使用教程都是比較早的,這裡給出我總結的一些基礎程式碼和使用規則: 首先要一定要先去官網看看: 1. 如何匯入 如果是使用andro
android 音訊播放 以及 二維碼模組中音訊播放和震動(vibrate)的實現
參考:《第一行程式碼》第8章 ######################################################################## 在Android中播放音訊檔案一般都是使用MediaPlayer類來實現,它對多種格式的音訊檔
Android 長按識別圖中二維碼 zxing
#基於 Zxing, 初學Android 程式碼質量不高 //長按,通過zxing讀取圖片,判斷是否有二維碼 bigImage.setOnLongClickListener(new View.OnLongClickListener() { @Overrid