使用Zxing實(shí)現(xiàn)二維碼的生成,掃描

轉(zhuǎn)載自CSDN

Android

這里給出總結(jié)的一些基礎(chǔ)代碼和使用規(guī)則:

首先要一定要先去官網(wǎng)看看:
github-Zxing官方庫的地址
github-zxing-android-embedded 一個(gè)非常好用的android工具

1. 如何導(dǎo)入

如果是使用android studio, 那么在gradle文件里添加以下:

compile 'com.google.zxing:core:3.2.1'

或者

compile group: 'com.google.zxing', name: 'core', version: '3.2.1'

給大家一個(gè)網(wǎng)址 在這個(gè)里面可以搜索到可以用的Maven庫

導(dǎo)入 ZXing Android Embedded

repositories {
    jcenter()
}

dependencies {
    compile 'com.journeyapps:zxing-android-embedded:3.3.0'
    compile 'com.android.support:appcompat-v7:23.1.0'   // Version 23+ is required || 要求版本23以上
}

android {
    buildToolsVersion '23.0.2' // Older versions may give compile errors || 更早的版本可能會報(bào)錯
}

如何生成一個(gè)二維碼?

以下這個(gè)方法蝴猪,傳入一個(gè)字符串若厚,生成一個(gè)二維碼的Bitmap,可以用于顯示

Bitmap encodeAsBitmap(String str){
        Bitmap bitmap = null;
        BitMatrix result = null;
        MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
        try {
            result = multiFormatWriter.encode(str, BarcodeFormat.QR_CODE, 200, 200);
            // 使用 ZXing Android Embedded 要寫的代碼
            BarcodeEncoder barcodeEncoder = new BarcodeEncoder();
            bitmap = barcodeEncoder.createBitmap(result);
        } catch (WriterException e){
            e.printStackTrace();
        } catch (IllegalArgumentException iae){ // ?
            return null;
        }

        // 如果不使用 ZXing Android Embedded 的話贾惦,要寫的代碼

//        int w = result.getWidth();
//        int h = result.getHeight();
//        int[] pixels = new int[w * h];
//        for (int y = 0; y < h; y++) {
//            int offset = y * w;
//            for (int x = 0; x < w; x++) {
//                pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
//            }
//        }
//        bitmap = Bitmap.createBitmap(w,h,Bitmap.Config.ARGB_8888);
//        bitmap.setPixels(pixels,0,100,0,0,w,h);

        return bitmap;
    }

是不是使用ZXing Android Embedded的好處就很明顯了?之后的掃描和生成功能敦捧,就不分開討論了


如何掃描须板?

使用掃描的時(shí)候,是用到系統(tǒng)的服務(wù)的兢卵,是從當(dāng)前的 MainActivity 跳轉(zhuǎn)到 CustomScanActivity

掃描的樣式是完全 可以 自定義的

以下是相關(guān)代碼:

MainActivity中:

// 你也可以使用簡單的掃描功能习瑰,但是一般掃描的樣式和行為都是可以自定義的,這里就寫關(guān)于自定義的代碼了
// 你可以把這個(gè)方法作為一個(gè)點(diǎn)擊事件
public void customScan(){
        new IntentIntegrator(this)
        .setOrientationLocked(false)
        .setCaptureActivity(CustomScanActivity.class) // 設(shè)置自定義的activity是CustomActivity
        .initiateScan(); // 初始化掃描
    }
@Override
// 通過 onActivityResult的方法獲取 掃描回來的 值
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        IntentResult intentResult = IntentIntegrator.parseActivityResult(requestCode,resultCode,data);
        if(intentResult != null) {
            if(intentResult.getContents() == null) {
                Toast.makeText(this,"內(nèi)容為空",Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(this,"掃描成功",Toast.LENGTH_LONG).show();
                // ScanResult 為 獲取到的字符串
                String ScanResult = intentResult.getContents();
            }
        } else {
            super.onActivityResult(requestCode,resultCode,data);
        }
    }

CustomScanActivity 添加了 打開閃光燈button秽荤,和兩個(gè)做樣子的button

對應(yīng)的 layout 文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.zhaojun.zxingtest.CustomScanActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="SwitchLight"
        android:id="@+id/btn_switch"
        android:layout_alignParentBottom="true"
        android:layout_alignParentStart="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hint_1"
        android:id="@+id/btn_hint1"
        android:layout_alignTop="@+id/btn_switch"
        android:layout_centerHorizontal="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="hint_2"
        android:id="@+id/btn_hint2"
        android:layout_alignTop="@+id/btn_hint1"
        android:layout_alignParentEnd="true" />

<!-- 我這里只是在大局下修改了一些樣式甜奄,不過其實(shí) 掃描框中的 各種激光條,邊框都可以改變窃款,有興趣的同學(xué)可以自己去搜一下 -->
<!-- 這個(gè)控件就是掃描的窗口了 -->
    <com.journeyapps.barcodescanner.DecoratedBarcodeView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/dbv_custom"
        app:zxing_framing_rect_width="200dp"
        app:zxing_framing_rect_height="50dp"

        app:zxing_preview_scaling_strategy="fitXY"
        app:zxing_use_texture_view="true"
        android:layout_above="@+id/btn_switch"
        android:layout_alignEnd="@+id/btn_hint2">
    </com.journeyapps.barcodescanner.DecoratedBarcodeView>

</RelativeLayout>

java文件 其中有使用 ButterKnife

public class CustomScanActivity extends AppCompatActivity implements DecoratedBarcodeView.TorchListener{ // 實(shí)現(xiàn)相關(guān)接口
    // 添加一個(gè)按鈕用來控制閃光燈课兄,同時(shí)添加兩個(gè)按鈕表示其他功能,先用Toast表示

    @BindView(R.id.btn_switch) Button swichLight;
    @BindView(R.id.btn_hint1) Button hint1Show;
    @BindView(R.id.btn_hint2) Button hint2Show;
    @BindView(R.id.dbv_custom) DecoratedBarcodeView mDBV;

    private CaptureManager captureManager;
    private boolean isLightOn = false;

    @Override
    protected void onPause() {
        super.onPause();
        captureManager.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        captureManager.onResume();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        captureManager.onDestroy();
    }

    @Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
        super.onSaveInstanceState(outState, outPersistentState);
        captureManager.onSaveInstanceState(outState);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        return mDBV.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_scan);
        ButterKnife.bind(this);

        mDBV.setTorchListener(this);

        // 如果沒有閃光燈功能晨继,就去掉相關(guān)按鈕
        if(!hasFlash()) {
            swichLight.setVisibility(View.GONE);
        }

        //重要代碼烟阐,初始化捕獲
        captureManager = new CaptureManager(this,mDBV);
        captureManager.initializeFromIntent(getIntent(),savedInstanceState);
        captureManager.decode();
    }

    // torch 手電筒
    @Override
    public void onTorchOn() {
        Toast.makeText(this,"torch on",Toast.LENGTH_LONG).show();
        isLightOn = true;
    }

    @Override
    public void onTorchOff() {
        Toast.makeText(this,"torch off",Toast.LENGTH_LONG).show();
        isLightOn = false;
    }

    // 判斷是否有閃光燈功能
    private boolean hasFlash() {
        return getApplicationContext().getPackageManager()
                .hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
    }

    // 點(diǎn)擊切換閃光燈
    @OnClick(R.id.btn_switch)
    public void swichLight(){
        if(isLightOn){
            mDBV.setTorchOff();
        }else{
            mDBV.setTorchOn();
        }
    }
}

核心代碼其實(shí)很少,比較容易掌握

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末紊扬,一起剝皮案震驚了整個(gè)濱河市蜒茄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌餐屎,老刑警劉巖檀葛,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異腹缩,居然都是意外死亡屿聋,警方通過查閱死者的電腦和手機(jī)空扎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來润讥,“玉大人转锈,你說我怎么就攤上這事∠蠖裕” “怎么了黑忱?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長勒魔。 經(jīng)常有香客問我甫煞,道長,這世上最難降的妖魔是什么冠绢? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任抚吠,我火速辦了婚禮,結(jié)果婚禮上弟胀,老公的妹妹穿的比我還像新娘楷力。我一直安慰自己,他們只是感情好孵户,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布萧朝。 她就那樣靜靜地躺著,像睡著了一般夏哭。 火紅的嫁衣襯著肌膚如雪检柬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天竖配,我揣著相機(jī)與錄音何址,去河邊找鬼。 笑死进胯,一個(gè)胖子當(dāng)著我的面吹牛用爪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胁镐,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼偎血,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了希停?” 一聲冷哼從身側(cè)響起烁巫,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宠能,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磁餐,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡违崇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年阿弃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羞延。...
    茶點(diǎn)故事閱讀 38,687評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渣淳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出伴箩,到底是詐尸還是另有隱情入愧,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布嗤谚,位于F島的核電站棺蛛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏巩步。R本人自食惡果不足惜旁赊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望椅野。 院中可真熱鬧终畅,春花似錦、人聲如沸竟闪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炼蛤。三九已至妖爷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鲸湃,已是汗流浹背赠涮。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暗挑,地道東北人笋除。 一個(gè)月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像炸裆,于是被迫代替她去往敵國和親垃它。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,806評論 25 707
  • 摘要 最近烹看,在公司項(xiàng)目上需要加入“二維碼掃描”的功能(Android端)国拇,筆者在網(wǎng)上查閱了一些資料,實(shí)現(xiàn)了這個(gè)功能...
    夢想編織者灬小楠閱讀 40,853評論 76 156
  • 301.同樣是賣項(xiàng)目惯殊,同樣的項(xiàng)目酱吝,標(biāo)價(jià)1元和標(biāo)價(jià)10W都有人買。只是1元收集的數(shù)據(jù)庫土思,全是低端數(shù)據(jù)庫务热,也許還沒賺多...
    自寅說說語錄閱讀 687評論 0 0
  • 合并之后忆嗜,潮水褪去,真正展現(xiàn)公司價(jià)值的時(shí)候到了崎岂。 這種大平臺性的公司捆毫,如果不能同時(shí)提升兩端的效率或體驗(yàn),最終離死不...
    昕明兒閱讀 201評論 0 1
  • Anna艷娜 2018年1月14日復(fù)盤 今日未完成事項(xiàng):運(yùn)動和閱讀 原因自述: 1冲甘,房子整修是我之前就預(yù)知的绩卤,但是...
    Anna艷娜閱讀 217評論 0 0