Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android基於google Zxing實現對手機中圖片上的二維碼進行掃描

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

編輯:Android開發實例

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

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  3.     android:layout_width="fill_parent" 
  4.     android:layout_height="wrap_content" 
  5.     android:background="@drawable/mmtitle_bg_alpha" > 
  6.  
  7.     <Button 
  8.         android:id="@+id/button_back" 
  9.         android:layout_width="75.0dip" 
  10.         android:layout_height="wrap_content" 
  11.         android:layout_alignParentLeft="true" 
  12.         android:background="@drawable/mm_title_back_btn" 
  13.         android:text="返回" 
  14.         android:textColor="@android:color/white" /> 
  15.  
  16.     <TextView 
  17.         android:id="@+id/textview_title" 
  18.         android:layout_width="wrap_content" 
  19.         android:layout_height="wrap_content" 
  20.         android:layout_centerHorizontal="true" 
  21.         android:layout_centerVertical="true" 
  22.         android:gravity="center_vertical" 
  23.         android:text="二維碼掃描" 
  24.         android:textColor="@android:color/white" 
  25.         android:textSize="18sp" /> 
  26.  
  27.     <ImageButton 
  28.         android:id="@+id/button_function" 
  29.         android:layout_width="wrap_content" 
  30.         android:layout_height="wrap_content" 
  31.         android:layout_alignParentRight="true" 
  32.         android:layout_marginRight="2dip" 
  33.         android:background="@drawable/mm_title_right_btn" 
  34.         android:minWidth="70dip" 
  35.         android:src="@drawable/mm_title_btn_menu_normal" /> 
  36.  
  37. </RelativeLayout> 

在掃描界面MipcaActivityCapture對ImageButton對其點擊監聽,點擊ImageButton從手機中選擇圖片

  1. //打開手機中的相冊  
  2.             Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); //"android.intent.action.GET_CONTENT"  
  3.             innerIntent.setType("image/*");  
  4.             Intent wrapperIntent = Intent.createChooser(innerIntent, "選擇二維碼圖片");  
  5.             this.startActivityForResult(wrapperIntent, REQUEST_CODE); 

在這裡使用了startActivityForResult來跳轉界面,當我們選中含有二維碼的圖片的時候會回調MipcaActivityCapture的onActivityResult方法,我們需要在onActivityResult方法裡面解析圖片中的二維碼

  1. @Override 
  2.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.         super.onActivityResult(requestCode, resultCode, data);  
  4.         if(resultCode == RESULT_OK){  
  5.             switch(requestCode){  
  6.             case REQUEST_CODE:  
  7.                 //獲取選中圖片的路徑  
  8.                 Cursor cursor = getContentResolver().query(data.getData(), null, null, null, null);  
  9.                 if (cursor.moveToFirst()) {  
  10.                     photo_path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));  
  11.                 }  
  12.                 cursor.close();  
  13.                   
  14.                 mProgress = new ProgressDialog(MipcaActivityCapture.this);  
  15.                 mProgress.setMessage("正在掃描...");  
  16.                 mProgress.setCancelable(false);  
  17.                 mProgress.show();  
  18.                   
  19.                 new Thread(new Runnable() {  
  20.                     @Override 
  21.                     public void run() {  
  22.                         Result result = scanningImage(photo_path);  
  23.                         if (result != null) {  
  24.                             Message m = mHandler.obtainMessage();  
  25.                             m.what = PARSE_BARCODE_SUC;  
  26.                             m.obj = result.getText();  
  27.                             mHandler.sendMessage(m);  
  28.                         } else {  
  29.                             Message m = mHandler.obtainMessage();  
  30.                             m.what = PARSE_BARCODE_FAIL;  
  31.                             m.obj = "Scan failed!";  
  32.                             mHandler.sendMessage(m);  
  33.                         }  
  34.                           
  35.                     }  
  36.                 }).start();  
  37.                   
  38.                 break;  
  39.               
  40.             }  
  41.         }  
  42.     } 

我們先通過圖片的Uri獲取圖片的路徑,然後根據圖片的路徑掃描出圖片裡面的二維碼內容,這將解碼圖片放在了一個子線程中,主要是防止因為解析太久而出現ARN的情況

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

  1. /**  
  2.  * 掃描二維碼圖片的方法  
  3.  * @param path  
  4.  * @return  
  5.  */ 
  6. public Result scanningImage(String path) {  
  7.     if(TextUtils.isEmpty(path)){  
  8.         return null;  
  9.     }  
  10.     Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>();  
  11.     hints.put(DecodeHintType.CHARACTER_SET, "UTF8"); //設置二維碼內容的編碼  
  12.  
  13.     BitmapFactory.Options options = new BitmapFactory.Options();  
  14.     options.inJustDecodeBounds = true; // 先獲取原大小  
  15.     scanBitmap = BitmapFactory.decodeFile(path, options);  
  16.     options.inJustDecodeBounds = false; // 獲取新的大小  
  17.     int sampleSize = (int) (options.outHeight / (float) 200);  
  18.     if (sampleSize <= 0)  
  19.         sampleSize = 1;  
  20.     options.inSampleSize = sampleSize;  
  21.     scanBitmap = BitmapFactory.decodeFile(path, options);  
  22.     RGBLuminanceSource source = new RGBLuminanceSource(scanBitmap);  
  23.     BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));  
  24.     QRCodeReader reader = new QRCodeReader();  
  25.     try {  
  26.         return reader.decode(bitmap1, hints);  
  27.  
  28.     } catch (NotFoundException e) {  
  29.         e.printStackTrace();  
  30.     } catch (ChecksumException e) {  
  31.         e.printStackTrace();  
  32.     } catch (FormatException e) {  
  33.         e.printStackTrace();  
  34.     }  
  35.     return null;  

Result是封裝了解碼的條碼圖像內的結果,我們只需要通過Result的getText()方法就能取出裡面的二維碼內容,這樣子我們就搞定了掃描手機中的二維碼圖片的小功能,接下來我們運行下項目,看看效果

 

 

源碼下載

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

轉自:http://blog. csdn. net/ xiaanming/article/details/14450809

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved