欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android中的二維碼生成與掃描功能

 更新時(shí)間:2017年01月13日 16:16:04   作者:SEU_Calvin  
二維碼在我們身邊真的非常普遍,今天小編給大家分享二維碼生成與掃描功能,依然使用目前比較流行的zxing方法,具體實(shí)現(xiàn)思路大家通過(guò)本文一起學(xué)習(xí)吧

0. 前言

今天這篇文章主要描述二維碼的生成與掃描,使用目前流行的Zxing,為什么要講二維碼,因?yàn)槎S碼太普遍了,隨便一個(gè)Android APP都會(huì)有二維碼掃描。本篇旨在幫助有需求的同學(xué)快速完成二維碼生成和掃描的功能。

1.    Zxing的使用

github上下載項(xiàng)目后,可以看到整體代碼結(jié)構(gòu)如下:

這里寫圖片描述

我們只需將Zxing包下的所有代碼copy一份到我們的項(xiàng)目中去,除了這些還需要zxing的jar包,最后相應(yīng)的資源文件,包括values文件下的ids文件、raw文件中的資源文件(可以替換)、layout文件下的activity_capture.xml(可以進(jìn)行相應(yīng)的訂制) 和圖片資源。 

2.    生成二維碼的實(shí)現(xiàn)

等上面工作全部準(zhǔn)備完畢后,就可以創(chuàng)建我們的二維碼了。如何生成二維碼?

需要EncodingUtils這個(gè)二維碼生成工具類。通過(guò)調(diào)用工具類中的createQRCode()方法來(lái)生成二維碼。該方法參數(shù)介紹如下:

/* 
* content:二維碼內(nèi)容 
* widthPix:二維碼寬度 
* heightPix:二維碼高度 
* logoBm:二維碼中間的logo對(duì)應(yīng)的Bitmap 
*/ 
public static Bitmap createQRCode(String content, int widthPix, int heightPix, Bitmap logoBm)

下面完成的是生成的一個(gè)百度地址的二維碼,中間LOGO是Android小機(jī)器人。并保存圖片到本地,方便后續(xù)測(cè)試二維碼的本地讀取功能。

/** 
 * 創(chuàng)建、展示二維碼并將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(); 
 } 
 // 把文件插入到系統(tǒng)圖庫(kù) 
 try { 
  MediaStore.Images.Media.insertImage(this.getContentResolver(),file.getAbsolutePath(), fileName, null); 
 } catch (FileNotFoundException e) { 
  e.printStackTrace(); 
 } 
 // 通知圖庫(kù)更新 
 sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, 
  Uri.parse("file://" + "/sdcard/namecard/"))); 
} 

看到如下效果:

這里寫圖片描述

3.    讀取二維碼的實(shí)現(xiàn)

3.1  攝像頭掃描的方式

二維碼掃描需要借助于CaptureActivity這個(gè)類,打開CaptureActivity界面并進(jìn)行掃描,掃描完畢后回調(diào)onActivityResult()方法,從onActivityResult()中得到掃描后的結(jié)果。效果就不演示的,因?yàn)槭褂玫氖悄M器。詳細(xì)代碼如下:

 /** 
 * 打開二維碼掃描 
 */ 
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  本地圖片掃描的方式

掃描本地圖片需要我們?cè)贑aptureActivity中進(jìn)行相應(yīng)的修改,為此我在掃描界面底部增加了一個(gè)按鈕,用來(lái)選擇本地圖片。layout代碼這里就不展示,我們直接看點(diǎn)擊后的事件處理。

/** 
* 打開本地圖片 
*/ 
private void openLocalImage() { 
 // 打開手機(jī)中的相冊(cè) 
 Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); 
 innerIntent.setType("image/*"); 
 Intent wrapperIntent = Intent.createChooser(innerIntent, "選擇二維碼圖片"); 
 this.startActivityForResult(wrapperIntent, 0x01); 
} 

打開系統(tǒng)圖片庫(kù)后選擇圖片,這時(shí)需要重寫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后,調(diào)用scanningImage()方法進(jìn)行掃描,Zxing源碼中,掃描到的結(jié)果都是存放在Result結(jié)果集中。獲取到Result后,就進(jìn)行結(jié)果的回傳,閱讀CaptureActivity源碼可以得知最后Result結(jié)果集會(huì)傳遞給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對(duì)象,因此需要解析圖片:

/** 
 * 掃描二維碼圖片的方法 
 * 
 * @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"); // 設(shè)置二維碼內(nèi)容的編碼 
 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); 
 /** 
 * 第三個(gè)參數(shù)是圖片的像素 
 */ 
 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; 
 } 

根據(jù)路徑獲取Bitmap,最后通過(guò)QRCodeReader 中的decode方法解析成Result對(duì)象并返回,最終傳遞給handleDecode方法。運(yùn)行程序效果如下,掃描出來(lái)的是之前定義的百度地址。

這里寫圖片描述

最后不要忘了申明權(quán)限和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實(shí)現(xiàn)二維碼掃描和生成的簡(jiǎn)單方法

以上所述是小編給大家介紹的Android中的二維碼生成與掃描功能,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

  • Android 關(guān)于ExpandableListView去掉里頭分割線的方法

    Android 關(guān)于ExpandableListView去掉里頭分割線的方法

    下面小編就為大家?guī)?lái)一篇Android 關(guān)于ExpandableListView去掉里頭分割線的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • Flutter實(shí)現(xiàn)牛頓擺動(dòng)畫效果的示例代碼

    Flutter實(shí)現(xiàn)牛頓擺動(dòng)畫效果的示例代碼

    牛頓擺大家應(yīng)該都不陌生,也叫碰碰球、永動(dòng)球(理論情況下),那么今天我們用Flutter實(shí)現(xiàn)這么一個(gè)理論中的永動(dòng)球,可以作為加載Loading使用,需要的可以參考一下
    2022-04-04
  • Android 在其他線程中更新UI線程的解決方法

    Android 在其他線程中更新UI線程的解決方法

    本篇文章是對(duì)Android中在其他線程中更新UI線程的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • Android上下文菜單用法實(shí)例分析

    Android上下文菜單用法實(shí)例分析

    這篇文章主要介紹了Android上下文菜單用法,以完整實(shí)例形式分析了Android上下文菜單的定義、布局及功能實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • 詳解Android 圖片的三級(jí)緩存及圖片壓縮

    詳解Android 圖片的三級(jí)緩存及圖片壓縮

    本篇文章主要介紹了Android 圖片的三級(jí)緩存 及 圖片壓縮,這里整理了詳細(xì)的代碼,有需要的小伙伴可以參考下。
    2016-12-12
  • Android通過(guò)自定義Activity實(shí)現(xiàn)懸浮的Dialog詳解

    Android通過(guò)自定義Activity實(shí)現(xiàn)懸浮的Dialog詳解

    這篇文章主要給大家介紹了關(guān)于Android通過(guò)自定義Activity實(shí)現(xiàn)懸浮的Dialog的相關(guān)資料,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,感興趣的朋友們下面來(lái)一起看看吧。
    2017-05-05
  • 解決webview 第二次調(diào)用loadUrl頁(yè)面不刷新的問題

    解決webview 第二次調(diào)用loadUrl頁(yè)面不刷新的問題

    這篇文章主要介紹了解決webview 第二次調(diào)用loadUrl頁(yè)面不刷新的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • Android?資源加載使用偽代碼示例分析

    Android?資源加載使用偽代碼示例分析

    這篇文章主要為大家介紹了Android?資源加載使用偽代碼示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 最新評(píng)論