1. 程式人生 > >Android 基於google Zxing實現對手機中的二維碼進行掃描

Android 基於google Zxing實現對手機中的二維碼進行掃描

我之前寫了一篇關於google Zxing掃描二維碼的文章,效果是仿微信的效果,有興趣的朋友可以去看看基於google Zxing實現二維碼、條形碼掃描,仿微信二維碼掃描效果,有時候我們有這樣子的需求,需要掃描手機中有二維碼的的圖片,所以今天實現的就是對手機中的二維碼圖片進行掃描,我這裡是直接在原來的工程上面加的這個功能,下面就簡單介紹下這個小功能的實現,首先我在介面上加了一個ImageButton,圖片還是用的微信的圖片,下面是掃描介面的title

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/mmtitle_bg_alpha" >

    <Button
        android:id="@+id/button_back"
        android:layout_width="75.0dip"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:background="@drawable/mm_title_back_btn"
        android:text="返回"
        android:textColor="@android:color/white" />

    <TextView
        android:id="@+id/textview_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:gravity="center_vertical"
        android:text="二維碼掃描"
        android:textColor="@android:color/white"
        android:textSize="18sp" />

    <ImageButton
        android:id="@+id/button_function"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_marginRight="2dip"
        android:background="@drawable/mm_title_right_btn"
        android:minWidth="70dip"
        android:src="@drawable/mm_title_btn_menu_normal" />

</RelativeLayout>
在掃描介面MipcaActivityCapture對ImageButton對其點選監聽,點選ImageButton從手機中選擇圖片
//開啟手機中的相簿
			Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); //"android.intent.action.GET_CONTENT"
	        innerIntent.setType("image/*");
	        Intent wrapperIntent = Intent.createChooser(innerIntent, "選擇二維碼圖片");
	        this.startActivityForResult(wrapperIntent, REQUEST_CODE);

在這裡使用了startActivityForResult來跳轉介面,當我們選中含有二維碼的圖片的時候會回撥MipcaActivityCapture的onActivityResult方法,我們需要在onActivityResult方法裡面解析圖片中的二維碼
@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if(resultCode == RESULT_OK){
			switch(requestCode){
			case REQUEST_CODE:
				//獲取選中圖片的路徑
				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();
				
				mProgress = new ProgressDialog(MipcaActivityCapture.this);
				mProgress.setMessage("正在掃描...");
				mProgress.setCancelable(false);
				mProgress.show();
				
				new Thread(new Runnable() {
					@Override
					public void run() {
						Result result = scanningImage(photo_path);
						if (result != null) {
							Message m = mHandler.obtainMessage();
							m.what = PARSE_BARCODE_SUC;
							m.obj = result.getText();
							mHandler.sendMessage(m);
						} else {
							Message m = mHandler.obtainMessage();
							m.what = PARSE_BARCODE_FAIL;
							m.obj = "Scan failed!";
							mHandler.sendMessage(m);
						}
						
					}
				}).start();
				
				break;
			
			}
		}
	}
我們先通過圖片的Uri獲取圖片的路徑,然後根據圖片的路徑掃描出圖片裡面的二維碼內容,這將解碼圖片放在了一個子執行緒中,主要是防止因為解析太久而出現ARN的情況

接下來看scanningImage(String path) 方法,zxing.jar中提供了對二維碼進行解析的類QRCodeReader.java,使用decode(BinaryBitmap image, Map<DecodeHintType, ?> hints)方法就能解析出圖片裡面的二維碼資訊,下面是通過圖片的路徑解析出裡面的二維碼內容

	/**
	 * 掃描二維碼圖片的方法
	 * @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);
		RGBLuminanceSource source = new RGBLuminanceSource(scanBitmap);
		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;
	}
Result是封裝瞭解碼的條碼影象內的結果,我們只需要通過Result的getText()方法就能取出裡面的二維碼內容,這樣子我們就搞定了掃描手機中的二維碼圖片的小功能,接下來我們執行下專案,看看效果


有疑問的朋友可以在下面留言,我會為大家解答,原始碼裡是在之前的效果裡面新新增的功能,有興趣的朋友可以下載原始碼看看

很多朋友下了demo發現出現Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lcom/google/zxing/BarcodeFormat;這個錯誤,是因為剛開始的時候我放了兩個JAR包進去,刪除一個就行了,大家自行修改

相關推薦

Android 基於google Zxing實現手機進行掃描

我之前寫了一篇關於google Zxing掃描二維碼的文章,效果是仿微信的效果,有興趣的朋友可以去看看基於google Zxing實現二維碼、條形碼掃描,仿微信二維碼掃描效果,有時候我們有這樣子的需求,需要掃描手機中有二維碼的的圖片,所以今天實現的就是對手機中的二維碼圖片進行

Android 基於google Zxing實現 條形碼掃描,仿微信掃描效果

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android 基於google Zxing實現、條形碼掃描,仿微信掃描效果(現在正做個掃描App、收藏)

瞭解二維碼這個東西還是從微信中,當時微信推出二維碼掃描功能,自己感覺挺新穎的,從一張圖片中掃一下竟然能直接加好友,不可思議啊,那時候還不瞭解二維碼,呵呵,然後做專案的時候,老闆說要加上二維碼掃描功能,然後自己的屁顛屁顛的去百度,google啥的,發現很多朋友都

高仿仿微信介面掃描效果 之 Android 基於google Zxing實現、條形碼掃描

    絕大多數android開發者都是使用google Zxing來實現二維碼、條形碼掃描,但官方和網上很多demo的掃描介面讓人不忍直視,今天我也做了一個,介面和執行效都是高仿微信最新版的掃描效果,執行效果圖如下: 主要是修改了ViewfindView類,我就不多解

Android 開發功能實現(四)------基於Zxing實現編碼功能(生成,一等)

Android 二維碼開發功能實現(四)------基於Zxing實現編碼功能(生成二維碼,一維碼等) 前言 關於Google的開源庫Zxing,前面也寫了幾遍文章進行介紹.我們先簡單的回顧一下! Android 二維碼的掃碼功能實現(一) 這篇文章主要介紹了,Zxi

超簡單整合Android Zxing實現掃一掃

2017-10-20更新 最新版本的請看http://blog.csdn.net/yuzhiqiang_1993/article/details/78292004,優化了掃描速度,修復了一些bug,增加了閃光燈,解析二維碼圖片,生成二維碼等功能,簡化了整合步驟。

iOS使用ZBar實現掃描以及實現識別相簿圖片功能

使用zbar呼叫相機掃碼程式碼: //開啟相機 - (void) init_camera { self.navigationController.navigationBarHidden=YES;     [commonaddNavigationAddToView:

Android 長按識別圖 zxing

#基於 Zxing, 初學Android 程式碼質量不高 //長按,通過zxing讀取圖片,判斷是否有二維碼 bigImage.setOnLongClickListener(new View.OnLongClickListener() { @Overrid

掃描和生成(zxing-android-embedded)的基礎使用

簡述:這個部落格主要記載zxing-android-embedded的簡單使用,如何替換相機的佈局,如何去掉生成二維碼的空白等等一系列問題. zxing-android-embedded的使用   1.首先新增依賴 implementation 'com.android.support:

使用依賴(ZXing)簡單的實現掃描和生成

一個簡單的佈局 第一步:新增依賴 //二維碼依賴 implementation 'cn.yipianfengye.android:zxing-library:2.1' 這時候你要新增進去的話會有一個版本衝突,下面解決V4、V7版本衝突 //解決V4、V7版本衝突

Android USB串列埠攝像頭實現拍照與識別

二維碼現在用的超級多,其實它就是一種編碼,把字串編碼儲存成一個圖片,我們掃描圖片得到字串就解碼成功。 最有名的二維碼解析庫是 google 出品的 Zxing,網上也有很多的封裝庫,有自定義掃描視窗等,更多庫請在這個庫中搜索 二維碼即可   USBUVCCa

1分鐘快速實現高效的掃描,急速識別手機相簿

最近由於專案需求,需要在二維碼掃描時新增識別相簿內二維碼的功能,於是,遇到了許多問題在這裡總結,好為以後不在採坑。 1、二維碼識別速度慢,效率低 2、手機相簿內的二維碼識別速度慢,識別不出來 好了,主要問題就是這些。 下面直接上程式碼, 使用常規方法在掃描手機相簿二

實現手機掃描進行登入

專案結構: 實現流程: pc端: 1:開啟二維碼登入網頁index.html 2:index.html呼叫GetQrCodeServlet 3:GetQrCodeServlet幹2件事   a:生成隨機的uuid,是一個唯一標識,該標識貫穿整個流

基於zxing(網格)掃描

前言:對於二維碼掃描我們使用的是開源框架Zxing或者Zbar,這裡使用基於zxing的二維碼掃描,類似支付寶網格掃描, 二維碼原理介紹: 二維碼是用某種特定的幾何圖形按一定的規律在平面上分佈的黑白相間的圖形記錄資料符號資訊的,在程式碼編制上巧妙的利用構成計算機內部邏輯基礎的0/1位元流的概念,

混合APP實現合成帶引數的圖片並分享到微信

專案中遇到個需求,要把帶個人蔘數的二維碼的分享圖分享到微信,讓兩個使用者繫結。 這是分享之前的樣式,要用canvas把它做成一整張圖片,如果不是APP中是在微信會H5中可以進入頁面就製作,覆蓋在原圖上讓使用者長按圖片下載。 分享之前使用者可以自由搭配分享樣式,這是分享在微信中的樣子。

java實現手機登陸

實現流程: pc端: 1:開啟二維碼登入網頁index.html 2:index.html呼叫GetQrCodeServlet 3:GetQrCodeServlet幹2件事   a:生成隨機的uuid,是一個唯一標識,該標識貫穿整個流程   b:生成

C#利用Zxing.net生成條形碼和實現列印的功能

    開篇:zxing.net是.net平臺下編解條形碼和二維碼的工具。 Step1:使用VS2010新建一個窗體程式專案: Step2:新增三個類:分別是BarCodeClass.cs、DocementBase.cs、imageDocument.cs。(下

Halcon解析函數解碼率和時長的優化方法

實現 creat module erl 包括 isp display 驅動 其中 Halcon中條碼解析函數包容多種條碼類型且簡單強大。現有的‘Data Matrix ECC 200’、‘QR Code’和‘PDF417’等廣泛使用的條碼均能解析。簡單是通過默認參數

Java利用zxing創建和讀取

eve override AI 讀取 技術 gin margin version exc 一、maven依賴 <dependencies> <dependency> <groupId>junit&

Java實現帶logo的

你好 rpi type isp asi 照片 resp 繪制圖片 exc Java實現帶logo的二維碼 二維碼應用到生活的各個方面,會用代碼實現二維碼,我想一定是一項加分的技能。好了,我們來一起實現一下吧。 我們實現的二維碼是基於QR Code的標準的,QR Code是由