原來寫過掃碼與生成二維碼的功能,今天分享給大家。我是用zxing這個開源項目來實現掃碼功能的。
效果圖:
簡介
zxing是一個開放源碼的,用java實現的多種格式的1D/2D條碼圖像處理庫,它包含了聯繫到其他語言的接口。
zxing可以實現使用手機的內置的攝像頭完成條形碼和二維碼的掃描與解碼。
zxing可以實現條形碼和二維碼的編碼與解碼。
zxing項目地址:
https://github.com/zxing/zxing
一.掃描二維碼並顯示
集成
1.下載項目,在項目的build.gradle中添加依賴 com.google.zxing:core:3.3.0或者直接看我的DEMO複製我項目裡的jar包
2.將整個包 com.google.zxing(包含路徑)複製到自己的項目下。
3.複製res下的資源文件,注意不要覆蓋掉了自己項目裡的內容。可以將內容複製到對應的文件裡邊。
(1).raw下的beep.ogg。音頻文件CaptureActivity中使用,若不想用則可以自行修改CaptureActivity。
(2).value下的ids.xml文件,value下的string文件內容,value下的color未見內容。
(3).對應的布局文件複製一下。
添加權限
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
調用
1.點擊進入掃碼頁,設置一下請求碼,為了回顯掃碼結果
Intent intentScanBardCode1 = new Intent();intentScanBardCode1.setClass(ScanCodeActivity.this,MipcaActivityCapture.class);startActivityForResult(intentScanBardCode1, 1000);
2.掃描回顯結果
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case 1000: if (resultCode==RESULT_OK){ Bundle bundle = data.getExtras(); // 顯示掃描到的內容 edit_show.setText(bundle.getString("result")); } break; }}
3.掃描類主要用到了surfaceview,ViewfinderView,CameraManager 類以及,drawTextInfo,handleDecode方法。
最主要的是----在handleDecode方法中對掃碼成功後的動作進行處理。
SurfaceView是視圖(View)的繼承類,這個視圖裡內嵌了一個專門用於繪製的Surface。surfaceview我會詳細寫一篇文章來解讀它。
ViewfinderView ZXing掃碼窗口的繪製。
CameraManager getFramingRect()方法,定義了掃描的區域,可以自己修改。
drawTextInfo是修改文本繪製的位置。
還有其他的核心類就不一一解讀了,可以直接看它的源碼。
注意:調整掃碼框大小,要在CameraManager這個類getFramingRect()方法裡進行修改,例如向上移動,獲得topOffset的高度這改成:(screenResolution.y - (height+height/2)) / 2。
二.生成二維碼
生成二維碼兩種方式
1.直接用zxing
Bitmap mBitmap = EncodingHandler.createQRCode("www.baidu.com", 300);//300表示寬高
2.可以自己寫一個QRCodeUtil
/** * 二維碼生成工具類 * * */public class QRCodeUtil { /** * 生成二維碼Bitmap * * @param content 內容 * @param widthPix 圖片寬度 * @param heightPix 圖片高度 * @param logoBm 二維碼中心的Logo圖標(可以為null) * @return 生成二維碼及保存文件是否成功 */ public static Bitmap createQRImage(String content, int widthPix, int heightPix, Bitmap logoBm) { try { //配置參數 Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>(); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); //容錯級別 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); //設置空白邊距的寬度 hints.put(EncodeHintType.MARGIN, 1); //default is 4 // 圖像數據轉換,使用了矩陣轉換 BitMatrix bitMatrix = new QRCodeWriter().encode(content, BarcodeFormat.QR_CODE, widthPix, heightPix); int[] pixels = new int[widthPix * heightPix]; // 下面這裡按照二維碼的算法,逐個生成二維碼的圖片, // 兩個for循環是圖片橫列掃描的結果 for (int y = 0; y < heightPix; y++) { for (int x = 0; x < widthPix; x++) { if (bitMatrix.get(x, y)) { pixels[y * widthPix + x] = 0xff000000; } else { pixels[y * widthPix + x] = 0xffffffff; } } } // 生成二維碼圖片的格式,使用ARGB_8888 Bitmap bitmap = Bitmap.createBitmap(widthPix, heightPix, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixels, 0, widthPix, 0, 0, widthPix, heightPix); if (logoBm != null) { bitmap = addLogo(bitmap, logoBm); } //必須使用compress方法將bitmap保存到文件中再進行讀取。直接返回的bitmap是沒有任何壓縮的,內存消耗巨大! return bitmap; } catch (Exception e) { // LogUtil.logConsole(e.getMessage()); } return null; } /** * 在二維碼中間添加Logo圖案 */ private static Bitmap addLogo(Bitmap src, Bitmap logo) { if (src == null) { return null; } if (logo == null) { return src; } //獲取圖片的寬高 int srcWidth = src.getWidth(); int srcHeight = src.getHeight(); int logoWidth = logo.getWidth(); int logoHeight = logo.getHeight(); if (srcWidth == 0 || srcHeight == 0) { return null; } if (logoWidth == 0 || logoHeight == 0) { return src; } //logo大小為二維碼整體大小的2/5 float scaleFactor = srcWidth * 1.0f / 5 / logoWidth; Bitmap bitmap = Bitmap.createBitmap(srcWidth, srcHeight, Bitmap.Config.ARGB_8888); try { Canvas canvas = new Canvas(bitmap); canvas.drawBitmap(src, 0, 0, null); canvas.scale(scaleFactor, scaleFactor, srcWidth / 2, srcHeight / 2); canvas.drawBitmap(logo, (srcWidth - logoWidth) / 2, (srcHeight - logoHeight) / 2, null); canvas.save(Canvas.ALL_SAVE_FLAG); canvas.restore(); } catch (Exception e) { bitmap = null; e.getStackTrace(); } return bitmap; }}
然後用法如下:
Bitmap bitmapsh = QRCodeUtil.createQRImage(URL, 280, 280, null);BitmapDrawable bdsh=new BitmapDrawable(bitmapsh);((ImageView)findViewById(R.id.iv_scan)).setImageDrawable(bdsh);
當然也可以生成中間帶圖標的二維碼,這裡我就不寫出來了 ,相信大家都開看懂。
我得DEMO下載地址:
http://download.csdn.net/my
如果沒有的話,直接加我微信聯繫我。
時間倉促,如有錯誤,望見諒!