Google zxing實現二維碼掃描完美解決方案
最近因專案需求,需要在App中整合二維碼掃描的功能。網上找了很多資料,最後決定使用Google的zxing來實現。實現的過程遇到了很多的坑,也是因為這些坑在網上沒有具體的解決方案,今天就把我的實現過程分享給大家。
我會分為兩步來和大家分享:
(1)專案中如何整合zxing
(2)如何修改取景框的樣式
(3)總結填坑
1.專案中整合zxing
在專案中整合zxing,網上有很多的教程也說的比較詳細了,zxing中的內容很多,涵蓋了很多的掃碼功能(不僅僅侷限於掃描二維碼...)。步驟很簡單,只需要我們將幾個核心的類包,拷貝到你的專案中,然後新增zxing.jar即可。沒有zxing.jar的童靴點選下載。
以上就是幾個我們需要用到的核心類。
<!--scan code --> <color name="viewfinder_frame">#ff000000</color> <color name="viewfinder_laser">#ffff0000</color> <color name="viewfinder_mask">#60000000</color> <color name="result_view">#b0000000</color> <color name="possible_result_points">#00000000</color>然後在color.xml中新增以上顏色值。
<!-- zxing --> <item type="id" name="auto_focus"/> <item type="id" name="decode"/> <item type="id" name="decode_failed"/> <item type="id" name="decode_succeeded"/> <item type="id" name="encode_failed"/> <item type="id" name="encode_succeeded"/> <item type="id" name="launch_product_query"/> <item type="id" name="quit"/> <item type="id" name="restart_preview"/> <item type="id" name="return_scan_result"/> <item type="id" name="search_book_contents_failed"/> <item type="id" name="search_book_contents_succeeded"/>
在ids.xml中新增以上id屬性值。
<!--qrcode--> <string name="str_scan_title">掃一掃</string> <string name="str_open_light">開啟閃光燈</string> <string name="str_close_light">關閉閃光燈</string> <string name="str_scan_hint">取景框對準二維碼, 即可自動掃描</string>在string.xml中新增顯示的提示字元。可自己隨意修改。
在zxing中,掃描的介面即Activity已經幫我們寫好了。在activity包下:
所以,我們啟動掃描二維碼的頁面就有了以下程式碼:
很簡單,就是啟動該Activity。細心的童靴此處注意到了我們使用的是startActivityForResult。沒過,因為當我們掃描完畢後需要得到最終的掃描結果,ok。順理成章的我們需要重寫onActivityResult方法來獲取結果。
有童靴看到上面的程式碼可能會有疑問了,你怎麼知道要根據 "result"這個key來取值呢?ok,我們來看CaptureActivity這類,全域性搜尋該類finish的地方,發現如下程式碼:
/**
* Handler scan result
* @param result
* @param barcode
* 獲取結果
*/
public void handleDecode(Result result, Bitmap barcode) {
inactivityTimer.onActivity();
playBeepSoundAndVibrate();
String resultString = result.getText();
// FIXME
if (resultString.equals("")) {
Toast.makeText(CaptureActivity.this, "掃描失敗!", Toast.LENGTH_SHORT)
.show();
} else {
Intent resultIntent = new Intent();
Bundle bundle = new Bundle();
bundle.putString("result", resultString);
resultIntent.putExtras(bundle);
this.setResult(RESULT_OK, resultIntent);
}
CaptureActivity.this.finish();
}
從上面程式碼中,我們發現,CaptureActivity是在handleDecode的方法中去傳回值並且finish的。相信你已經看到了,沒錯,在put的地方,key就是我們之前所說的result。ok,解決。
此時,編譯啟動,你就可以看到一個簡單的掃描介面了。
2.如何修取景框的樣式
啟動後,你是不是玩的很爽。感慨Google改變了我們的生活,讓任何事情變得可能。哈哈,扯淡兩句 。此時,有些童靴會說,這取景框(掃描框)跟我的App的主題不太符合呀!確實,Google自帶效果肯定沒有那麼多樣式。那麼就需要我們自己來定義,製作出更加精美和符合自己App主題的效果。定義該效果需要用到下面這個類:
沒錯,就是ViewfinderView。開啟這個類:
public final class ViewfinderView extends View
可以看到該類繼承自View。所以,顧名思義,我們繪製肯定是在onDraw方法中了。ok,直接定位到onDraw方法,剩下的就是你自己發揮想象力,去定製啦!(比如:四個角,掃描線,等等。。)
3.填坑
本篇文章在開始的時候,我就說了坑坑坑!所以,單憑以上2個部分是滿足不了大家的,那麼,我們下面來看幾個問題:
(1)你是否遇到了,取景框太小,以至於離二維碼很遠才可以掃到?
(2)取景框對準二維碼,二維碼拉伸變形了,根本掃不出結果來!
好,針對以上問題,我們來逐一解決!
首先來看第一個問題,Google考慮到這個問題,所以zxing中提供了修改取景框大小的地方:
在camera包下的CameraManager類中,開啟該類,我們看到:
private static final int MIN_FRAME_WIDTH = 240;
private static final int MIN_FRAME_HEIGHT = 240;
private static final int MAX_FRAME_WIDTH = 480;
private static final int MAX_FRAME_HEIGHT = 360;
沒錯,這幾個值就是更改取景框大小的常量。
此時,你改變值發現效果也不是很多,那下面這種方案將完美解決你的問題:
找到該類中的getFrameingRect方法:
將原本計算height和width的程式碼註釋,新增以下程式碼:
// int width = screenResolution.x * 3 / 4;
// if (width < MIN_FRAME_WIDTH) {
// width = MIN_FRAME_WIDTH;
// } else if (width > MAX_FRAME_WIDTH) {
// width = MAX_FRAME_WIDTH;
// }
// int height = screenResolution.y * 3 / 4;
// if (height < MIN_FRAME_HEIGHT) {
// height = MIN_FRAME_HEIGHT;
// } else if (height > MAX_FRAME_HEIGHT) {
// height = MAX_FRAME_HEIGHT;
// }
DisplayMetrics dm = context.getResources().getDisplayMetrics();
int width = (int)(dm.widthPixels * 0.6);
int height = (int)(width * 0.9);
int leftOffset = (screenResolution.x - width) / 2;
int topOffset = (screenResolution.y - height) / 2;
ok,執行程式,完美解決。並且加快的掃描的速度(掃描速度取決於取景框的大小)!
填了第一個坑,我們來填第二個:
針對於掃描時,二維碼拉伸變形的問題,是因為zxing預設是針對橫屏掃描的,所以,我們只需要改變x,y的計算,即橫縱軸即可。此時,我們需要找到CameraConfigurationManager類:
找到findBestPreviewSizeValue方法:
將newDiff的變數計算程式碼改成如下:
int newDiff=Math.abs(newY - screenResolution.x) + Math.abs(newX - screenResolution.y);
即調換位置即可。
ok,到此為止,關於zxing的整合使用就已經完美解決了。有問題的童靴歡迎給我留言,我將盡快回復!
注 :最近有朋友說近距離掃描二維碼掃描不出,需要遠一點才可以。那麼解決這個問題的方案如下:
找到CameraConfigurationManager類的setDesiredCameraParameters(Camera camera)方法,將其中的程式碼註釋,然後新增如下程式碼:
Camera.Parameters parameters = camera.getParameters(); List<Camera.Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes(); int position =0; if(supportedPreviewSizes.size()>2){ position=supportedPreviewSizes.size()/2+1;//supportedPreviewSizes.get(); }else { position=supportedPreviewSizes.size()/2; } int width = supportedPreviewSizes.get(position).width; int height = supportedPreviewSizes.get(position).height; Log.d(TAG, "Setting preview size: " + cameraResolution); camera.setDisplayOrientation(90); cameraResolution.x=width; cameraResolution.y=height; parameters.setPreviewSize(width,height); setFlash(parameters); setZoom(parameters); camera.setParameters(parameters);
原始碼地址:點選開啟連結
相關文章
- zxing第三方框架實現二維碼掃描以及生成框架
- 基於ZXing Android實現生成二維碼圖片和相機掃描二維碼圖片即時解碼的功能Android
- Android 基於zxing的二維碼掃描功能的簡單實現及優化Android優化
- 智慧公安二維碼報警系統研發解決方案-隨時隨地掃描二維碼
- iOS 掃描二維碼/條形碼iOS
- 掃描二維碼登入思路
- 基於ZXingAndroid實現生成二維碼圖片和相機掃描二維碼圖片即時解碼的功能Android
- Java 中使用 google.zxing 快捷生成二維碼(附工具類原始碼)JavaGo原始碼
- Swift4如何掃描二維碼瞭解一下Swift
- Fotify掃描結果Open Redirection解決方案
- Vue 微信端掃描二維碼,蘋果端只能儲存圖片解決方法Vue蘋果
- XQRCode 一個非常方便實用的二維碼掃描、解析、生成庫
- Winform窗體圓角以及描邊完美解決方案ORM
- 【MISC】一道假的二維碼題目學習zxing庫[python解讀二維碼]Python
- PHP、Python、JavaScript 識別二維碼和生成二維碼解決方案PHPPythonJavaScript
- Android----二維碼掃描、生成、相簿識別(16號)Android
- 全棧工程師之路-React Native之掃描二維碼全棧工程師React Native
- 簡單易用的二維碼掃描工具:QR Capture for MacAPTMac
- 使用HTML5實現掃描PC二維碼且觸發WAP端上傳資源功能HTML
- ZXing原始碼解析二:掌握解碼步驟原始碼
- PHP掃描圖片轉點陣 二維碼轉點陣PHP
- 一對一直播系統開發如何在頁面內實現掃描二維碼功能
- C#中輕鬆實現二維碼和條形碼識別:OpenCvSharp和ZXing詳細教程C#OpenCV
- Go 實現埠掃描器Go
- 掃二維碼連wifiWiFi
- 微信小程式掃描普通二維碼開啟小程式的方法微信小程式
- sonar(二)掃描配置
- GO語言 實現埠掃描Go
- spring boot高效能實現二維碼掃碼登入(中)——Redis版Spring BootRedis
- PC客戶端Winform掃描微信二維碼登入網站Navite客戶端ORM網站Vite
- 條碼列印軟體是否可以製作只能掃描一次的二維碼?
- win10系統掃描器提示掃描不到掃描器如何解決Win10
- Win10系統下掃描器程式無法掃描的解決方法Win10
- @ComponentScan註解的實現,Spring掃描包的過程Spring
- 智慧公安-二維碼一鍵報警系統解決方案
- 利用微信臨時引數二維碼實現掃碼登入網站網站
- 使用 ABAP 程式碼製作手機能夠掃描的二維碼(QRCode)試讀版
- java實現二維碼生成Java
- 安全科普:Waf實現掃描器識別 徹底抵擋駭客掃描