一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Android之條形碼、二維碼掃描框架(非原創(chuàng))

 小仙女本仙人 2022-01-12
    1. 文章大綱

      一、條形碼、二維碼掃描框架介紹
      二、條形碼、二維碼的區(qū)別和組成結(jié)構(gòu)介紹
      三、條形碼、二維碼掃描框架應(yīng)用場景
      四、BGAQRCode-Android框架實戰(zhàn)
      五、項目源碼下載
      六、參考文章

      一、條形碼、二維碼掃描框架介紹

      Android二維碼掃描是一種常見的功能開發(fā),但是技術(shù)選型不當(dāng)會造成初期開發(fā)難度大、后期維護成本高。常見的Android二維碼掃碼解決方案很多,比如ZXing,barcodescanner和BGAQRCode-Android等等。以下給出這三種典型二維碼解決方案的異同和開發(fā)場景。
      (1)ZXing是諸多二維碼掃碼解決方案的核心引用庫,見附錄文章2。很多第三方的二維碼解決方案都是基于ZXing二次定制開發(fā)。但是集成和直接基于ZXing二次定制開發(fā)比較繁瑣和麻煩,除非非常必要,我個人不建議開發(fā)者直接使用ZXing集成開發(fā)。
      (2)由于ZXing的以上原因,很多第三方二維碼掃碼解決方案應(yīng)運而生。其中barcodescanner就是這樣,barcodescanner在github上的項目主頁:https://github.com/dm77/barcodescanner , barcodescanner最大的特點是集成簡單,掃描速度較快,比較穩(wěn)定,很便于開發(fā)者迅速集成開發(fā)。但是barcodescanner的不太靈活UI調(diào)整,如果設(shè)計要求二維碼掃描界面比較復(fù)雜的UI要求,那么就需要把barcodescanner的整體代碼都拖下來,自己再次改造定制。
      (3)BGAQRCode-Android也是一種二維碼掃描解決方案,其在github上的項目主頁:https://github.com/bingoogolapple/BGAQRCode-Android , BGAQRCode-Android也和barcodescanner一樣簡單易用,然而更加便于定制開發(fā)。我個人喜歡使用BGAQRCode-Android。

      二、條形碼、二維碼的區(qū)別和組成結(jié)構(gòu)介紹

      1. 演示圖


      二維碼

      2. 組成結(jié)構(gòu)

      2.1 一維碼

      條形碼(barcode)是將寬度不等的多個黑條和空白,按照一定的編碼規(guī)則排列,用以表達一組信息的圖形標(biāo)識符。常見的條形碼是由反射率相差很大的黑條(簡稱條)和白條(簡稱空)排成的平行線圖案。
      其對應(yīng)字符由一組阿拉伯?dāng)?shù)字組成,供人們直接識讀或通過鍵盤 向計算機輸入數(shù)據(jù)使用。這一組條空和相應(yīng)的字符所表示的信息是相同的。
      通用商品條形碼一共有13位,一般由前綴部分、制造廠商代碼、商品代碼和校驗碼4個部分組成。

      前綴部分
      由第1到第3位構(gòu)成,是用來標(biāo)識國家或地區(qū)的代碼,賦碼權(quán)在國際物品編碼協(xié)會,如 00-09代表美國、加拿大。45、49代表 日本。69代表中國大陸,471 代表中國臺灣地區(qū),489 代表香港特區(qū)。

      制造廠商代碼
      由第4到第7位構(gòu)成,是用來標(biāo)識不同生產(chǎn)廠家的代碼,賦碼權(quán)在各個國家或地區(qū)的物品編碼組織,中國由國家物品編碼中心賦予制造廠商代碼。

      商品代碼
      由第8到第12位構(gòu)成,是各個廠商用來標(biāo)識自己商品的代碼,賦碼權(quán)由產(chǎn)品生產(chǎn)企業(yè)自己行使,可以組成10000個不同的商品代碼。

      校驗碼
      由第13位構(gòu)成,用來校驗商品條形碼中左起第1-12數(shù)字代碼的正確性。這一位的數(shù)字是由前12位數(shù)字按照一定規(guī)則計算出來的,若讀取出的前12位按照該規(guī)則計算出的數(shù)字跟第13位不符合,則表示讀取失敗,是條形碼的一種驗錯措施。

      2.2 二維碼

      二維條碼/二維碼(2-dimensional bar code)是用某種特定的幾何圖形按一定規(guī)律在平面(二維方向上)分布的黑白相間的圖形記錄數(shù)據(jù)符號信息的,二維碼是一種比一維碼更高級的條碼格式。一維碼只能在一個方向(一般是水平方向)上表達信息,而二維碼在水平和垂直方向都可以存儲信息。一維碼只能由數(shù)字和字母組成,而二維碼能存儲漢字、數(shù)字和圖片等信息,因此二維碼的應(yīng)用領(lǐng)域要廣得多。
      以使用廣泛的QR(Quick-Response) CODE為例,主要由定位圖形、格式信息、版本信息、數(shù)據(jù)和糾錯信息5部分構(gòu)成。

      定位圖形
      用于對二維碼的定位,一共有個數(shù)為3,即3個定位圖形可標(biāo)識一個矩形,同時可以用于確認二維碼的大小和方向;

      格式信息
      存在于所有的尺寸中,用于存放一些格式化數(shù)據(jù)。表示改二維碼的糾錯級別,分為L、M、Q、H;

      版本信息
      即二維碼的規(guī)格,在 >= Version 7以上,需要預(yù)留兩塊3 x 6的區(qū)域存放一些版本信息。

      數(shù)據(jù)信息和糾錯信息
      實際保存的二維碼信息(Data Code 數(shù)據(jù)碼)和糾錯信息(Error Correction Code 糾錯碼)(用于修正二維碼損壞帶來的錯誤)。

      三、條形碼、二維碼掃描框架應(yīng)用場景

      (1)信息獲?。?、地圖、WIFI密碼、資料)
      (2)網(wǎng)站跳轉(zhuǎn)(跳轉(zhuǎn)到微博、手機網(wǎng)站、網(wǎng)站)
      (3)廣告推送(用戶掃碼,直接瀏覽商家推送的視頻、音頻廣告)
      (4)手機電商(用戶掃碼、手機直接購物下單)
      (5)防偽溯源(用戶掃碼、即可查看生產(chǎn)地;同時可以獲取最終消費地)
      (6)優(yōu)惠促銷(用戶掃碼,下載電子優(yōu)惠券,抽獎)
      (7)會員管理(用戶手機上獲取電子會員信息、VIP服務(wù))
      (8)手機支付(掃描商品二維碼,通過銀行或第三方支付提供的手機端通道完成支付
      (9)登陸管理(不需輸入賬戶,密碼,掃碼登陸)

      四、BGAQRCode-Android框架實戰(zhàn)

      1. build.gradle添加引用

          compile 'com.google.zxing:core:3.2.1'
          compile 'cn.bingoogolapple:bga-qrcodecore:1.1.7@aar'
          compile 'cn.bingoogolapple:bga-zxing:1.1.7@aar'
      

      2. 新建xml布局

      <?xml version="1.0" encoding="utf-8"?>
      <RelativeLayout xmlns:android="http://schemas./apk/res/android"
          xmlns:app="http://schemas./apk/res-auto"
          android:layout_width="match_parent"
          android:layout_height="match_parent">
       
          <cn.bingoogolapple.qrcode.zxing.ZXingView
              android:id="@+id/zxingview"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
       
              app:qrcv_animTime="1000"
              app:qrcv_borderColor="@android:color/white"
              app:qrcv_borderSize="1px"
              app:qrcv_cornerColor="@android:color/holo_green_light"
              app:qrcv_cornerLength="20dp"
              app:qrcv_cornerSize="5dp"
              app:qrcv_isShowDefaultScanLineDrawable="true"
              app:qrcv_isShowTipTextAsSingleLine="true"
              app:qrcv_isTipTextBelowRect="true"
              app:qrcv_maskColor="#64000000"
       
              app:qrcv_qrCodeTipText="將二維碼放入框內(nèi),自動掃描"
              app:qrcv_rectWidth="200dp"
              app:qrcv_scanLineColor="@android:color/holo_green_light"
              app:qrcv_scanLineSize="2dp"
       
              app:qrcv_tipTextColor="@android:color/white"
              app:qrcv_tipTextMargin="15dp"
              app:qrcv_tipTextSize="18dp" />
       
          <LinearLayout
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_alignParentBottom="true"
              android:layout_centerHorizontal="true"
              android:layout_marginBottom="50dp"
              android:orientation="horizontal">
       
              <Button
                  android:id="@+id/start_spot"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_gravity="center"
                  android:text="開始掃碼" />
       
              <Button
                  android:id="@+id/stop_spot"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_gravity="center"
                  android:text="暫停掃碼" />
       
              <Button
                  android:id="@+id/open_flashlight"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_gravity="center"
                  android:text="開燈" />
       
              <Button
                  android:id="@+id/close_flashlight"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:layout_gravity="center"
                  android:text="關(guān)燈" />
          </LinearLayout>
      </RelativeLayout>
      

      3. Java代碼

      import android.app.Activity;
      import android.os.Bundle;
      import android.os.Handler;
      import android.os.Vibrator;
      import android.util.Log;
      import android.view.View;
      import android.widget.Toast;
       
      import cn.bingoogolapple.qrcode.core.QRCodeView;
      import cn.bingoogolapple.qrcode.zxing.ZXingView;
       
      public class MainActivity extends Activity {
          private QRCodeView mQRCodeView;
          private Activity activity;
       
          @Override
          public void onCreate(Bundle state) {
              super.onCreate(state);
              activity = this;
              setContentView(R.layout.activity_main);
       
              mQRCodeView = (ZXingView) findViewById(R.id.zxingview);
              mQRCodeView.changeToScanQRCodeStyle(); //掃二維碼
              mQRCodeView.setDelegate(new QRCodeView.Delegate() {
       
                  @Override
                  public void onScanQRCodeSuccess(String result) {
                      Log.d("二維碼掃描結(jié)果", "result:" + result);
       
                      Toast.makeText(activity, result, Toast.LENGTH_LONG).show();
       
                      //掃描得到結(jié)果震動一下表示
                      vibrate();
       
                      //獲取結(jié)果后三秒后,重新開始掃描
                      new Handler().postDelayed(new Runnable() {
                          @Override
                          public void run() {
                              mQRCodeView.startSpot();
                          }
                      }, 3000);
                  }
       
                  @Override
                  public void onScanQRCodeOpenCameraError() {
                      Toast.makeText(activity, "打開相機錯誤!", Toast.LENGTH_SHORT).show();
                  }
              });
       
              findViewById(R.id.start_spot).setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
                      mQRCodeView.startSpot();
                      Toast.makeText(activity, "startSpot", Toast.LENGTH_SHORT).show();
                  }
              });
       
              findViewById(R.id.stop_spot).setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
                      mQRCodeView.stopSpot();
                      Toast.makeText(activity, "stopSpot", Toast.LENGTH_SHORT).show();
                  }
              });
       
              findViewById(R.id.open_flashlight).setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
                      mQRCodeView.openFlashlight();
                      Toast.makeText(activity, "openFlashlight", Toast.LENGTH_SHORT).show();
                  }
              });
       
              findViewById(R.id.close_flashlight).setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
                      mQRCodeView.closeFlashlight();
                      Toast.makeText(activity, "closeFlashlight", Toast.LENGTH_SHORT).show();
                  }
              });
       
      //        findViewById(R.id.scan_qrcode).setOnClickListener(new View.OnClickListener(){
      //            @Override
      //            public void onClick(View view) {
      //                mQRCodeView.changeToScanQRCodeStyle();
      //                Toast.makeText(activity,"changeToScanQRCodeStyle",Toast.LENGTH_SHORT).show();
      //            }
      //        });
          }
       
          @Override
          protected void onStart() {
              super.onStart();
              mQRCodeView.startCamera();
              //強制手機攝像頭鏡頭朝向前邊
              //mQRCodeView.startCamera(Camera.CameraInfo.CAMERA_FACING_FRONT);
       
              mQRCodeView.showScanRect(); //顯示掃描方框
          }
       
          @Override
          protected void onStop() {
              mQRCodeView.stopCamera();
              super.onStop();
          }
       
          @Override
          protected void onDestroy() {
              mQRCodeView.onDestroy();
              super.onDestroy();
          }
       
          //震動
          private void vibrate() {
              Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
              vibrator.vibrate(200);
          }
      }
      

      4. 添加相機、閃光燈、震動權(quán)限

        <uses-permission android:name="android.permission.CAMERA" />
          <uses-permission android:name="android.permission.VIBRATE" />
          <uses-permission android:name="android.permission.FLASHLIGHT" />
      

      5. 運行項目并訪問

      五、項目源碼下載

      鏈接:https://pan.baidu.com/s/1rQOyYKJIVcpzlUCvsgPBXQ

      六、參考文章

      1. https://blog.csdn.net/csdn_aiyang/article/details/78983090
      2. https://blog.csdn.net/zhangphil/article/details/69625321
      3. https://blog.csdn.net/dcrmg/article/details/52106805

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    激情内射亚洲一区二区三区| 欧美日韩精品一区二区三区不卡| 字幕日本欧美一区二区| 日韩精品在线观看完整版| 久久91精品国产亚洲| 在线观看免费视频你懂的 | 国产亚洲欧美日韩精品一区| 成年男女午夜久久久精品| 国产精品视频一区麻豆专区| 黄片免费观看一区二区| 最新日韩精品一推荐日韩精品| 邻居人妻人公侵犯人妻视频| 午夜福利大片亚洲一区| 午夜精品久久久免费视频| 99久久精品免费看国产高清| 日本加勒比在线观看一区| 字幕日本欧美一区二区| 精品一区二区三区中文字幕| 亚洲精品成人综合色在线| 国产免费一区二区不卡| 99在线视频精品免费播放| 性欧美唯美尤物另类视频| 色欧美一区二区三区在线| 日韩欧美国产高清在线| 国产成人午夜福利片片| 人妻乱近亲奸中文字幕| 东京热男人的天堂一二三区| 老司机亚洲精品一区二区| 国产精品推荐在线一区| 亚洲一区二区三区三区| 有坂深雪中文字幕亚洲中文 | 亚洲av日韩av高潮无打码| 美女被后入福利在线观看| 日韩人妻中文字幕精品| 亚洲最新的黄色录像在线| 亚洲中文字幕日韩在线| 国产精品欧美激情在线| 亚洲熟女诱惑一区二区| 高清一区二区三区四区五区 | 国产精品日韩精品一区| 国产又色又爽又黄又大|