Android-二維碼掃描與生成二維碼詳解

2021-03-02 秦子帥

原來寫過掃碼與生成二維碼的功能,今天分享給大家。我是用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

如果沒有的話,直接加我微信聯繫我。

時間倉促,如有錯誤,望見諒!

相關焦點

  • 二維碼認識及Android快速接入(有源碼)
    >1.什麼是二維碼?一維碼只能由數字和字母組成,而二維碼能存儲漢字、數字和圖片等信息,因此二維碼的應用領域要廣得多。資料)網站跳轉(跳轉到微博、手機網站、網站)廣告推送(用戶掃碼,直接瀏覽商家推送的視頻、音頻廣告)手機電商(用戶掃碼、手機直接購物下單)防偽溯源(用戶掃碼、即可查看生產地;同時後臺可以獲取最終消費地)優惠促銷(用戶掃碼,下載電子優惠券,抽獎)會員管理(用戶手機上獲取電子會員信息、VIP服務)手機支付(掃描商品二維碼
  • 【二維碼生成器】快速生成個性二維碼
    功能 全能二維碼生成器和二維碼掃描器,生成和掃描一個應用都搞定 生成網站,聯繫人,文本,Wifi,名片,簡訊等各種類型的二維碼 為微博、微信、淘寶、抖音生成專屬又獨特的二維碼名片 自定義二維碼顏色,碼眼,圖案 支持將圖片用作二維碼背景 定期更新精美模板,支持一鍵生成 裝飾掃描識別的二維碼 將生成的二維碼直接添加到圖片或海報 管理您的生成記錄和掃描記錄 將生成的二維碼保存成模板,方便下次直接使用 良好的交互體驗使用方法
  • Python使用QRCode生成二維碼
    qrcode和Image:pip install qrcodepip install Image首先我們來寫一個最簡單的案例,生成一個內容為hello sunxiaoning的二維碼,保存到本地,執行以下腳本,就可以生成一個hello.png的文件,並且自動打開。
  • Java 生成二維碼實戰
    p=5051不知道從什麼時候開始,我們的生活突然之間就充滿了二維碼——看網頁要掃二維碼,加好友要掃二維碼,現在連樓下賣草莓的大爺都支持掃碼支付了。其實在我們介紹二維碼的原理之前,你可能已經猜到了,二維碼就是把信息翻譯成黑白小方塊,然後填到這個大方塊裡。
  • 『22號破戒app』用了很多年的二維碼生成&識別軟體
    ⊙  軟體名稱:二維碼生成軟體;⊙    安裝系統:pc;⊙   軟體用途:信息轉變成二維碼;⊙   軟體細節:功能介紹可以生成四種類型的二維碼,包括:電話簿信息:可輸入姓名、電話號碼、郵件地址以及備註等。電子郵件:可輸入郵件地址、標題以及文本。網頁書籤網站名稱及URL。
  • 二維碼掃描優化
    優化主要包含兩方面:(1)掃描性能(2)交互體驗。掃描性能優化包括:去除zxing額外支持的格式。刪除zxing冗餘代碼。將處理相機幀從串行改為並行。交互體驗優化包括:自動放大。雙擊放大。重力傳感器聚焦。手勢調整焦距。
  • PHP QR Code生成二維碼
    二行代碼解決二維碼生成問題先來說說二維碼是神馬東西        二維條碼/二維碼(2-dimensional bar code)是用某種特定的幾何圖形按一定規律在平面
  • (進階篇)使用PHP生成二維碼
    利用Google API生成二維碼Google提供了較為完善的二維碼生成接口,調用API接口很簡單,以下是調用代碼:$urlToEncode="http://www.learnphp.cn"; generateQRfromGoogle($urlToEncode); /**  * google api 二維碼生成
  • Go語言生成二維碼是如此簡單
    那麼二維碼是如何製作生成的呢?我們如何製作自己的二維碼呢?什麼是二維碼?二維條碼是指在一維條碼的基礎上擴展出另一維具有可讀性的條碼,使用黑白矩形圖案表示二進位數據,被設備掃描後可獲取其中所包含的信息。一維條碼的寬度記載著數據,而其長度沒有記載數據。二維條碼的長度、寬度均記載著數據。二維條碼有一維條碼沒有的「定位點」和「容錯機制」。
  • Excel數據生成可變二維碼操作-條碼列印軟體|二維碼生成器|條形碼...
    Excel數據生成可變二維碼操作二維碼是什麼東西?二維碼怎麼使用。二維碼到底是個什麼東西?很多人還會抓著後腦勺表示:「不知道。」二維碼墓碑。國外已有人使用二維碼墓碑。這種墓碑上除了刻有逝者的姓名,還附有一個二維碼。掃描二維碼,就可以登錄到相關網站了解逝者信息。通過密碼登錄後,逝者的親友還可以更新頁面,在上面添加評論表達對逝者的懷念。二維碼公交服務。想知道你乘坐的公交車離站點還有多遠,或者還有幾分鐘可到終點站,只需用手機掃描二維碼,登錄公交服務網站,便可輕鬆獲知。
  • 教你如何用Android動態生成二維碼
    /** * @ClassName: QRCodeUtil * @Description: 二維碼工具類 * @Author Wangnan * @Date 2017/2/10 */public class QRCodeUtil {    /**     * 創建二維碼位圖     *     * @param
  • 【工具】藝術二維碼在線生成網站
    作者 ciaochaos CPunisher置頂:我們的二維碼生成網站 qrbtf.com有人說,二維碼是線下向線上轉化最重要的入口,無論是對於線下商家、自媒體運營者、策展人還是紙媒編輯,二維碼都是非常重要的一環。而標準二維碼形式單一、對比濃重,常常在一張海報中「拉低審美」。
  • 用什麼掃描adidas二維碼?
    掃描adidas這樣的品牌二維碼的途徑大致有三種:微信掃一掃掃描、淘寶掃描、瀏覽器掃描,接下來將為您詳細介紹這三種方法,希望能對您有所幫助。淘寶掃描1.在手機中找到淘寶並打開2.在首頁上方搜索欄旁邊找到掃描圖標3.點擊掃描圖標4.將攝像頭對準adidas的二維碼,聽到提示後將跳轉到信息界面三.瀏覽器掃描
  • 掃描二維碼就能自動生成2019年朋友圈總結?小心花式「盤點」背後的...
    圖說:自動生成的「2019朋友圈影響力」圖 新民晚報記者徐馳供圖這兩天,一張「2019年我的朋友圈影響力」的截圖,突然在朋友圈裡火了起來。只要長按二維碼,就能夠查看一年的「影響力」?小心,背後可能存在一定的風險。
  • 二維碼製作
    二維碼製作 生活工具 大小: 9.5MB
  • 一款安卓自定義二維碼app--二維碼生成器
    你是不是一直在尋找一款可以方便快捷生成二維碼的應用?黑白二維碼太單調?找設計師設計太貴?
  • PHP將url生成二維碼,掃碼可跳轉
    最近項目開發中需實現一個功能:用戶可通過分享自己二維碼給他人掃碼註冊,註冊成功後成為自己的下級。
  • 掃描二維碼 Scan a QR code
    早上送寶寶上學,需要在校門口用手機掃描一下屏幕上的二維碼才能進門。因為每天都要重複這個動作,正好讓寶寶自己嘗試一下。
  • 《支付寶》激活醫保碼領紅包二維碼圖片生成方法
    參與支付寶激活醫保碼領紅包活動,用戶自己激活醫保碼後,不僅可以領取一次紅包,而且還可以生成二維碼圖片,將圖片分享給自己的朋友,讓他們掃碼激活醫保碼後,自己還能獲得邀請獎勵哦!那麼支付寶激活醫保碼領紅包怎麼生成邀請圖片二維碼呢?下面小編來為大家介紹一下。
  • 使用python-qrcode生成圖形二維碼
    或者更少的錯誤會被更正 7                    # ERRORCORRECTH:大約30%或者更少的錯誤會被更正 8border              # (默認4)四周留白包含的格子數                  9box_size            # (默認10)每個格子的像素數10image_factory       # (默認PIL)選擇生成圖片的形式