1. 程式人生 > >讓你的APP輕鬆加上掃描二維碼功能

讓你的APP輕鬆加上掃描二維碼功能

在這個二維碼橫行的年代,如果一個APP連掃描二維碼的功能都沒有是會被恥笑的。今天小老虎教小白們如何為自己的APP新增掃描二維碼功能和生成二維碼,並做到外部掃描跳轉網頁,內部掃描跳轉具體Activity。

1.準備好ZXING包

ZXing是一個開放原始碼的,用Java實現的多種格式的1D/2D條碼影象處理庫,它包含了聯絡到其他語言的埠。Zxing可以實現使用手機的內建的攝像頭完成條形碼的掃描及解碼。Zxing庫的主要部分支援以下幾個功能:核心程式碼的使用、適用於J2SE客戶端的版本、適用於Android客戶端的版本(即BarcodeScanner)、Android的整合(通過Intent支援和BarcodeScanner的整合)等。
本人用的是AndroidStudio,所以只要簡單地遠端依賴下載就OK了,也可以選擇和eclipse一樣用匯入第三方類庫。導包不會的話請自行百度一下,這裡就不一一科普了。

2.生成二維碼

1.僅供APP內部使用的二維碼
只供內部使用的話只要簡單的內容去區分不同使用者和不同內容就好,舉個栗子:
比如說我要內部掃描新增好友,我就用一個“user”和userID來形成二維碼就好了,我們用zxing提供的EncodingHandler.createQRCode方法生成一張二維碼(返回的是bitmap),第一個引數是要形成二維碼的字串,第二個引數是二維碼的長度(它的鞭長= = )。

Bitmap qrCodeBitmap = EncodingHandler.createQRCode("http://qrcode/user/"+info.userID, 450);

2.可供微信,QQ等APP掃描跳轉網頁,也可以進行內部跳轉
這個直接用你要跳轉的網頁的url生成二維碼就OK,這樣外部掃描就直接跳到那個網頁了,那內部呢?我們下面會說到!

3.掃描二維碼和內部進行頁面跳轉

1.掃描二維碼
這裡的掃描直接跳到zxing包下的CaptureActivity,裡面的handleDecode方法會有一個引數rawResult,這個就是掃描所獲取的資訊,只要呼叫rawResult.getText就可以得到掃描所得的字串。這裡我做了一些處理,把得到的字串用setResult發出去,一會再說怎麼處理,先貼一波程式碼

 @Override
    public
void handleDecode(Result rawResult, Bundle bundle) { super.handleDecode(rawResult, bundle); String resultString = rawResult.getText(); KLog.d("scann result: " + resultString); if (resultString.equals("")) { Toast.makeText(CaptureActivity.this, "掃描失敗", Toast.LENGTH_SHORT).show(); } else{ Intent resultIntent = new Intent(); Bundle data = new Bundle(); data.putString("result", resultString); resultIntent.putExtras(data); this.setResult(RESULT_OK, resultIntent); } CaptureActivity.this.finish(); }

2.判斷並跳轉
我們在MainActivity重寫onActivityResult方法,在這裡進行處理跳轉。
剛才我們生成app內部二維碼最後是“/+id”,那麼我們先把最後一個“/”後面的id拿到手,像這樣:

  //解析是否掃描使用者的二維碼
            id = Long.valueOf(scanResult.substring(scanResult.lastIndexOf('/') + 1));

然後我們再用URI的 Uri.parse把伺服器返回的url轉成uri,再獲取是否含有特定欄位,有的話再獲取其id,無論是跳轉外部還是跳轉內部,只要先判斷字串是否含有key就OK了,下面是方法的完整程式碼

 private void handleScanResult(String scanResult) {
        if (StringUtils.isEmpty(scanResult)) {
            return;
        }

        long id = 0;
        try {
            //解析是否掃描使用者的二維碼
            id = Long.valueOf(scanResult.substring(scanResult.lastIndexOf('/') + 1));
        } catch (NumberFormatException formatException) {
            try {
                //解析是否跳轉網頁二維碼
                Uri url = Uri.parse(scanResult);
                if ("club_detail".equals(url.getQueryParameter("qrcode_type"))) {
                    String clubId = url.getQueryParameter("clubId");
                    id = Long.parseLong(clubId);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        if (id == 0) {
            return;
        }
 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case MainMeTabFragment.KEY_REQUEST_CODE:
                    Bundle bundle = data.getExtras();
                    String scanResult = bundle.getString("result");
                    //處理二維碼
                    handleScanResult(scanResult);
                default:
                    break;
            }
        } 

這次的內容就到此結束了,如果想要這部分完整程式碼的請在評論留下郵箱,我重新寫一份完整的Demo發給有需要的朋友 o(∩_∩)o