1. 程式人生 > >Android開發——Android中的二維碼生成與掃描

Android開發——Android中的二維碼生成與掃描

0. 前言

今天這篇文章主要描述二維碼的生成與掃描,使用目前流行的Zxing,為什麼要講二維碼,因為二維碼太普遍了,隨便一個Android APP都會有二維碼掃描。本篇旨在幫助有需求的同學快速完成二維碼生成和掃描的功能。

本篇轉載自:http://blog.csdn.net/hai_qing_xu_kong/article/details/51260428

1.    Zxing的使用

github上下載專案後,可以看到整體程式碼結構如下:

這裡寫圖片描述

我們只需將Zxing包下的所有程式碼copy一份到我們的專案中去,除了這些還需要zxingjar包,最後相應的資原始檔,包括values檔案下的ids檔案、raw檔案中的資原始檔(可以替換)、

layout檔案下的activity_capture.xml(可以進行相應的訂製) 和圖片資源。

2.  生成二維碼的實現

等上面工作全部準備完畢後,就可以建立我們的二維碼了。如何生成二維碼?

需要EncodingUtils這個二維碼生成工具類。通過呼叫工具類中的createQRCode()方法來生成二維碼。該方法引數介紹如下:

/*
* content:二維碼內容
* widthPix:二維碼寬度
* heightPix:二維碼高度
* logoBm:二維碼中間的logo對應的Bitmap
*/
public static Bitmap createQRCode(String content, int widthPix, int heightPix, Bitmap logoBm)

下面完成的是生成的一個百度地址的二維碼,中間LOGOAndroid小機器人。並儲存圖片到本地,方便後續測試二維碼的本地讀取功能。

/**
     * 建立、展示二維碼並將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();
        } 

        // 把檔案插入到系統圖庫
        try {
            MediaStore.Images.Media.insertImage(this.getContentResolver(),file.getAbsolutePath(), fileName, null);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // 通知相簿更新
        sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,
                Uri.parse("file://" + "/sdcard/namecard/")));
}

看到如下效果:

這裡寫圖片描述

3.  讀取二維碼的實現

3.1  攝像頭掃描的方式

二維碼掃描需要藉助於CaptureActivity這個類,開啟CaptureActivity介面並進行掃描,掃描完畢後回撥onActivityResult()方法,從onActivityResult()中得到掃描後的結果。效果就不演示的,因為使用的是模擬器。詳細程式碼如下:

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

掃描本地圖片需要我們在CaptureActivity中進行相應的修改,為此我在掃描介面底部增加了一個按鈕,用來選擇本地圖片。layout程式碼這裡就不展示,我們直接看點選後的事件處理。

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

開啟系統圖片庫後選擇圖片,這時需要重寫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,呼叫scanningImage()方法進行掃描Zxing原始碼中,掃描到的結果都是存放在Result結果集中。獲取到Result後,就進行結果的回傳,閱讀CaptureActivity原始碼可以得知最後Result結果集會傳遞給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物件,因此需要解析圖片:

 /**
     * 掃描二維碼圖片的方法
     * 
     * @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"); // 設定二維碼內容的編碼

        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);
        /**
         * 第三個引數是圖片的畫素
         */
        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;
    }

根據路徑獲取Bitmap,最後通過QRCodeReader 中的decode方法解析成Result物件並返回,最終傳遞給handleDecode方法。執行程式效果如下,掃描出來的是之前定義的百度地址。

這裡寫圖片描述

最後不要忘了申明許可權和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開發——Android生成掃描

0. 前言今天這篇文章主要描述二維碼的生成與掃描,使用目前流行的Zxing,為什麼要講二維碼,因為二維碼太普遍了,隨便一個Android APP都會有二維碼掃描。本篇旨在幫助有需求的同學快速完成二維碼生成和掃描的功能。本篇轉載自:http://blog.csdn.net/ha

Android使用zxing-android-embedded(由zxing開發)實現生成掃描

前言: 目前二維碼(條形碼)的使用非常廣泛,所以啊,就想去實現以下嘛,最簡單的方法就是選擇開源庫了。 在網上一查開源庫還是很多的,介紹使用最多的就是zxing,所以這裡也就是用zxing了。但是由於zxing開源庫太大了,有很多不是Android要用的,所以

iOS第三方生成掃描

匯入第三方框架libqrencode(生成二維碼)和ZBarSDK(二維碼掃描) 匯入標頭檔案 #import "QRCodeGenerator.h" #import "ZBarSDK.h" 建立兩個按鈕點選事件 點選按鈕一實現生成二維碼 - (I

Android用Zxing掃/生成功能

新年已過,一切恢復真正常,新的一年給自己幾句指引: 光努力還不行,方向很重要。 總是想著最壞的結果,就會讓人失去改變的勇氣。 你當然有權利選擇自己的人生--但只有在你真正強大後,逆行的阻力才會降到最小。 never say never. 下面開始記錄二維碼使用過程

Android 生成掃描,近距離識別優化,從相簿選擇識別

做了一個二維碼掃描圖片,主要是掃描不出來,看到一篇部落格,其中的第二種方法可以掃描到,在此做筆記,以備後用,前面的進入相簿,返回,到獲取圖片路徑方法都一樣; (1):二維碼生成的方法順便貼上: private Bitmap createQRImage(String url, final

玩轉Android生成識別

二維碼,我們也稱作QRCode,QR表示quick response即快速響應,在很多App中我們都能見到二維碼的身影,最常見的莫過於微信了。那麼今天我們就來看看怎麼樣在我們自己的App中整合二維碼的掃描與生成功能。OK,廢話不多說,我們就開始做吧。二維碼的使用我主要想分為兩

android上實現生成掃描

先在androidstudio上匯入libzing的Module,然後再app上把那個libzing新增上去,這樣我們的app就關聯了那個libzing庫了 然後我們就只在app這個工程下寫程式碼就行了。activity_main.xml佈局如下

Java生成解碼工具Zxing使用

trace character sta 解碼 iter() font 生成 char type 1 package com.csii.zxing.test; 2 3 import java.awt.image.BufferedImage; 4 import j

Java生成解碼

添加 1.3 pin part 字符集 bit reader -- inpu 基於google zxing 的Java二維碼生成與解碼 一、添加Maven依賴(解碼時需要上傳二維碼圖片,所以需要依賴文件上傳包) <!-- google二維碼工具 --&g

微信帶場景引數的生成使用

應用場景:公眾號推廣時,使用者通過掃碼關注公眾號,需要統計使用者是通過誰的二維碼進行關注。 思路:在使用者掃碼關注公眾號時,二維碼帶上推廣者的id,在關注公眾號後,獲取到該推廣者的id。 目前有2種類型的二維碼: 1、臨時二維碼,是有過期時間的,最長可以設

生成讀取

一、通過Zxing生成與讀取: 生成二維碼: int width=300; int height=300; String format="png"; String conte

你不可錯過的生成解析-java後臺前端js都有

1.二維碼分類   二維條碼也有許多不同的碼制,就碼制的編碼原理而言,通常分為三種類型。 線性堆疊式二維碼 編碼原理: 建立在一維條碼基礎之上,按需要堆積成兩行或多行。 圖示: 矩陣式二維碼 最常用編碼,原理: 在一個矩形空間通過黑白畫素在矩陣中的不同分佈進行編碼。在

生成掃描、圖片識別(Zxing)

這樣的例子雖然已經很多了,不過我在網上瀏覽了一圈,也沒找到幾個相簿二維碼圖片識別例子,好的演算法識別率才高。這裡有一個好點的演算法,演算法不是我寫的,只是作為整理記錄,給眾多安卓開發者一個方便。demo的UI有點low,不過功能卻是實實在在,有需要的朋友可以自定義一些UI介

微信帶場景參數的生成使用功能實現?

mar 進入 分享 mage term 永久 擔心 type color 參數二維碼原理介紹:公眾號目前有2種類型的二維碼1、臨時二維碼,30天有效期2、永久二維碼,沒有失效時間 渠道二維碼生成(參數二維碼生成) 1、登錄微號幫 2、登錄後進入管理中心首頁選擇->功能

Android開發實現生成

要根據內容來實現二維碼的生成,這裡需要用到一個第三方的jar包(Google的開源jar包zxing.jar) 下面直接貼上我寫好的最最最簡單的demo public Bitmap setCode(String contents,int width,int height){

Android生成

roi fse black ima deb ecif character put isp   最新在學習adnroid,遇到二維碼的生成與掃描在此做個整理   貼下二維碼生成的工具類      /**    * 二維碼生成工具類   */   public class

Android 生成和識別(附Demo原始碼)

  今天講一下目前移動領域很常用的技術——二維碼。現在大街小巷、各大網站都有二維碼的蹤跡,不管是IOS、Android、WP都有相關支援的軟體。之前我就想了解二維碼是如何工作,最近因為工作需要使用相關技術,所以做了初步瞭解。今天主要是講解如何使用ZXing庫,生成和識別二維碼。這篇文章實用性為主,理

Android 使用Zxing實現生成掃描

在專案中要使用到二維碼的相關內容,百度(原諒我還在用)之後得知一半都是使用Google的開源庫 Zxing,但是網上多半的使用教程都是比較早的,這裡給出我總結的一些基礎程式碼和使用規則: 首先要一定要先去官網看看: 1. 如何匯入 如果是使用andro

android 音訊播放 以及 模組音訊播放和震動(vibrate)的實現

參考:《第一行程式碼》第8章 ######################################################################## 在Android中播放音訊檔案一般都是使用MediaPlayer類來實現,它對多種格式的音訊檔

Android 長按識別圖 zxing

#基於 Zxing, 初學Android 程式碼質量不高 //長按,通過zxing讀取圖片,判斷是否有二維碼 bigImage.setOnLongClickListener(new View.OnLongClickListener() { @Overrid