Android掃碼ZXing

1. 獲取權限

請注意動態申請及重寫申請結果返回方法。

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

2. 添加依賴

//Gradle Scripts -> build.gradle(Module:app)
implementation 'com.google.zxing:core:3.4.1'
implementation 'com.journeyapps:zxing-android-embedded:4.2.0'

3. 引入

import com.google.zxing.integration.android.IntentIntegrator;
import com.google.zxing.integration.android.IntentResult;

4. 簡易掃碼

(1) 啟動掃碼

通常,掃碼是由一個按鈕觸發,跳轉至掃碼Activity(CaptureActivity)。

setDesiredBarcodeFormats()方法用于設置掃碼的類型(不同類型間逗號分隔):

  1. Code 39 條形碼

    • 數據容量:通常用于較短的文本字符串,支持數字、大寫字母和一些特殊字符。
    • 字符集:包含數字 0-9、大寫字母 A-Z 和一些特殊字符(如空格、破折號等)。
    • 用途:廣泛用于工業、物流、標簽等領域,用于標識物品或包裝。
  2. Code 93 條形碼

    • 數據容量:比 Code 39 更高,可以編碼更多字符。
    • 字符集:支持所有的 ASCII 字符。
    • 用途:常用于標簽、物流追蹤、文檔標識等領域,提供了更高的數據密度和安全性。
  3. Code 128 條形碼

    • 數據容量:是一種高密度條形碼,具有更高的數據編碼能力。
    • 字符集:支持所有的 128 個 ASCII 字符,包括數字、字母、符號等。
    • 用途:廣泛應用于零售、物流、運輸等領域,用于編碼大量字符和數據。
  4. UPC-A 條形碼

    • 數據容量:用于編碼商品標識符,可以編碼 12 個數字。
    • 字符集:僅限數字。
    • 用途:主要用于零售業,標識商品,常見于北美地區。
  5. UPC-E 條形碼

    • 數據容量:壓縮版本的 UPC-A,可以編碼 6 個數字。
    • 字符集:僅限數字。
    • 用途:通常用于小型商品包裝,空間有限的情況下采用。
  6. EAN-8 條形碼

    • 數據容量:編碼 8 個數字。
    • 字符集:僅限數字。
    • 用途:類似 UPC-E,用于小型商品包裝,空間有限的情況下采用。
  7. EAN-13 條形碼

    • 數據容量:編碼 13 個數字。
    • 字符集:僅限數字。
    • 用途:在全球范圍內用于標識商品,常見于歐洲和其他地區
  8. QR碼(Quick Response Code): 如前所述,這是一種由Denso Wave開發的二維碼,最初設計用于跟蹤汽車零部件。它被廣泛應用于各種領域,尤其是移動支付和信息快速傳遞。

  9. Data Matrix: 這是另一種常見的二維碼類型,它是由美國公司International Data Matrix(ID Matrix)于1989年創建的。Data Matrix常用于工業標識和物流管理。

  10. PDF417: 這是一種二維碼,其名稱源自它的編碼規范,即PDF(Portable Data File)417。它常用于存儲大量數據,如駕駛執照、護照和車輛注冊證明等。

  11. Aztec Code: 這是一種用于存儲數據的二維碼,通常被用于票務和航空領域。

  12. MaxiCode: 這是由美國郵政服務用于自動識別包裹的一種二維碼。

在中國常用的條碼格式為:EAN-13 和 UPC-A 。?

button.setOnClickListener(new View.OnClickListener() {public void onClick(View view) {IntentIntegrator intentIntegrator=new IntentIntegrator(MainActivity.this);//設置所需掃描的條碼格式----可有多種,且可同時有條碼和二維碼intentIntegrator.setDesiredBarcodeFormats(IntentIntegrator.CODE_39,IntentIntegrator.CODE_93,IntentIntegrator.CODE_128,IntentIntegrator.UPC_A,IntentIntegrator.UPC_E,IntentIntegrator.EAN_8,IntentIntegrator.EAN_13);intentIntegrator.setBeepEnabled(true);//掃描成功是否有提示音intentIntegrator.setPrompt("掃描");//提示字符串intentIntegrator.setCameraId(0);//設置攝像頭,0為背攝,1為正攝intentIntegrator.setOrientationLocked(false);//是否方向鎖定intentIntegrator.setBarcodeImageEnabled(true);//是否保存掃描成功的圖片intentIntegrator.initiateScan();//啟動掃描器}
});

(2) 獲取掃描結果

掃碼界面本身也是Activity,所以想要獲取掃碼結果可重寫onActivityResult()方法

//本碼中TextView用于顯示掃碼結果
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {IntentResult intentResult=IntentIntegrator.parseActivityResult(requestCode, resultCode, data);//判斷是否為掃碼返回的if(intentResult!=null){//判斷是否掃描成功if(intentResult.getContents()!=null){textView.setText(intentResult.getContents());}else {textView.setText("掃描無結果");}}super.onActivityResult(requestCode, resultCode, data);
}

5. 自定義掃碼界面

掃碼頁面是由initiateScan()方法啟動,不斷查看源碼可知,該方法本質是啟動了一個名為CaptureActivity的頁面

我們可以創建一個新的Activity并用setCaptureActivity()方法取代CaptureActivity。

為了使自定義的Activity具有CaptureActivity的能力,我們首先在Activity中設置一個com.journeyapps.barcodescanner.DecoratedBarcodeView控件,然后將CaptureActivity的Java代碼復制到Activity的Java文件中并修改部分id即可。還可以在Activity添加更多的控件以滿足我們的自定義需求。

(1) 自定義Activity的XML文件

app:zxing_preview_scaling_strategy="centerCrop"這個屬性指定了預覽圖像的縮放策略。在這里,設置為?centerCrop,表示預覽圖像將按比例縮放并截取中間部分以適應。

app:zxing_use_texture_view="false"這個屬性指定是否使用?TextureView?來顯示相機預覽。在這里,設置為?false,表示不使用?TextureView。不使用時為四周透明。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MyCaptureActivity"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><com.journeyapps.barcodescanner.DecoratedBarcodeViewandroid:id="@+id/decoratedBarcodeView"android:layout_height="150dp"android:layout_width="150dp"android:layout_centerInParent="true"app:zxing_preview_scaling_strategy="centerCrop"app:zxing_use_texture_view="false" /></RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

(2) 自定義Activity的Java文件

將CaptureActivity的Java代碼復制并修改部分。

public class MyCaptureActivity extends AppCompatActivity {private CaptureManager capture;private DecoratedBarcodeView barcodeScannerView;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);barcodeScannerView = initializeContent();capture = new CaptureManager(this, barcodeScannerView);capture.initializeFromIntent(getIntent(), savedInstanceState);capture.decode();}/*** Override to use a different layout.** @return the DecoratedBarcodeView*/protected DecoratedBarcodeView initializeContent() {//此處修改//修改前setContentView(R.layout.zxing_capture);//修改前return (DecoratedBarcodeView)findViewById(R.id.zxing_barcode_scanner);setContentView(R.layout.activity_my_capture);return (DecoratedBarcodeView)findViewById(R.id.decoratedBarcodeView);}@Overrideprotected void onResume() {super.onResume();capture.onResume();}@Overrideprotected void onPause() {super.onPause();capture.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();capture.onDestroy();}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);capture.onSaveInstanceState(outState);}@SuppressLint("MissingSuperCall")@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {capture.onRequestPermissionsResult(requestCode, permissions, grantResults);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {return barcodeScannerView.onKeyDown(keyCode, event) || super.onKeyDown(keyCode, event);}
}

(3) 使用setCaptureActivity()方法取代CaptureActivity

button.setOnClickListener(new View.OnClickListener() {public void onClick(View view) {IntentIntegrator intentIntegrator=new IntentIntegrator(MainActivity.this);//設置所需掃描的條碼格式----可有多種,且可同時有條碼和二維碼intentIntegrator.setDesiredBarcodeFormats(IntentIntegrator.EAN_13,IntentIntegrator.UPC_A);intentIntegrator.setBeepEnabled(true);//掃描成功是否有提示音intentIntegrator.setPrompt("掃描");//提示字符串intentIntegrator.setCameraId(0);//設置攝像頭,0為背攝,1為正攝intentIntegrator.setOrientationLocked(false);//是否方向鎖定intentIntegrator.setBarcodeImageEnabled(true);//是否保存掃描成功的圖片//使用自定義的Activity                intentIntegrator.setCaptureActivity(MyCaptureActivity.class);intentIntegrator.initiateScan();//啟動掃描器}
});

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/163035.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163035.shtml
英文地址,請注明出處:http://en.pswp.cn/news/163035.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決mv3版本瀏覽器插件,不能注入js腳本問題

文章目錄 背景引入ifream解決ifream和父頁面完全跨域問題參考鏈接 背景 瀏覽器插件升級mv3版本后&#xff0c;不能再使用content_script內容腳本向原瀏覽器&#xff08;top&#xff09;注入script標簽達到注入腳本的目的。瀏覽器認為插入未經審核的腳本是不安全的行為。 引入…

python給視頻增加字幕

python給視頻增加字幕 安裝所需庫 在開始之前&#xff0c;我們需要安裝一些Python庫。主要使用到的庫如下&#xff1a; moviepy&#xff1a;用于處理視頻和音頻的庫。 pydub&#xff1a;用于處理音頻的庫。 speech_recognition&#xff1a;用于語音識別的庫。 首先&#xff0…

ajax請求方式處理

1、前置準備 1.1、SpringBoot項目下&#xff1a;寫一個controller RestController public class TestController {RequestMapping("/yyy")public void test(HttpServletRequest request, HttpServletResponse response){String yang request.getParameter("y…

AI助力鋼鐵產業數字化,python基于YOLOv5開發構建鋼鐵產業產品智能自動化檢測識別系統

AI為工業產業智能化數字化賦能早已不是什么新鮮事&#xff0c;越來越多的行業和領域開始更大范圍去擁抱AI&#xff0c;享受科技帶來的變革力量&#xff0c;在我們之前的文章中也有很多相關領域項目的實踐經歷&#xff0c;本文的核心目標就是想要基于鋼鐵領域產品數據來開發構建…

Vue框架的element組件table文字居中

1、代碼展示 <el-table:data"table.data.slice((table.currentPage - 1) * table.limit, table.currentPage * table.limit)"style"width: 100%; margin-top: 15px"border:header-cell-style"{ textAlign: center }":cell-style"{textAl…

【KMP算法】學習總結

說明&#xff1a; 文章內容為對KMP算法的總結&#xff0c;以及力扣例題&#xff1b;文章內容為個人的學習總結&#xff0c;如有錯誤&#xff0c;歡迎指正。 文章目錄 1. KMP算法1.1 算法步驟1.2 關于指針回退問題 2 . LeetCode例題 1. KMP算法 1.1 算法步驟 KMP算法通常用于…

springboot_vue知識點

代碼放到了倉庫。 springboot_vue知識點 1.搭建1.vue2.springboot 2.前后端請求和響應的封裝1.請求封裝2.響應封裝 3.增刪改查1.查詢2.分頁3.新增和編輯4.刪除 4.跨域和自定義異常5.JWT鑒權1.配置pom2.攔截前端請求的攔截器3.生成token并驗證token4.登錄后生成token5.前端獲取…

git如何查看配置,修改配置,設置配置

# 顯示當前的Git配置 $ git config --list# 編輯Git配置文件 $ git config -e [--global]# 設置提交代碼時的用戶信息 $ git config [--global] user.name "[name]" $ git config [--global] user.email "[email address]"

Grafana如何實現折線柱狀圖

程序員的公眾號&#xff1a;源1024&#xff0c;獲取更多資料&#xff0c;無加密無套路&#xff01; 最近整理了一份大廠面試資料《史上最全大廠面試題》&#xff0c;Springboot、微服務、算法、數據結構、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、數據庫等等 …

競賽選題 車位識別車道線檢測 - python opencv

0 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度學習 機器視覺 車位識別車道線檢測 該項目較為新穎&#xff0c;適合作為競賽課題方向&#xff0c;學長非常推薦&#xff01; &#x1f947;學長這里給一個題目綜合評分(每項滿分5分) …

從六個方面對比Go和Python的差異

您是否想過 Go 與 Python 之間的主要區別是什么&#xff1f;隨著對軟件開發人員的需求不斷增加&#xff0c;選擇哪種編碼語言可能會很困難。 ? 在此&#xff0c;我們將從六個方面對比Go和Python,探討 Go 和 Python之間的差異。我們將討論它們的特點、優缺點&#xff0c;以便…

GPT、GPT-2、GPT-3論文精讀筆記

視頻&#xff1a;GPT&#xff0c;GPT-2&#xff0c;GPT-3 論文精讀【論文精讀】_嗶哩嗶哩_bilibili MAE論文&#xff1a;把bert用回計算機視覺領域 CLIP論文&#xff1a;打通文本和圖像 GPT 論文&#xff1a;Improving Language Understanding by Generative Pre-Training …

史詩級云故障敲響警鐘,應用保障不能沒有“連續鍵”!

近日&#xff0c;知名云服務商出現一次史詩級的云故障&#xff1a;全球所有區域/所有服務同時異常&#xff0c;故障持續長達3小時之多&#xff0c;云上眾多應用受到極大影響。 如今&#xff0c;在一個充滿不確定性和復雜性的數字化時代&#xff0c;哪怕是頂級云服務商亦不能避…

python-append與extend的區別

append 和 extend 是用于向列表&#xff08;List&#xff09;添加元素的兩種不同的方法&#xff0c;它們在功能上有一些重要的區別。 append 方法&#xff1a; append 方法用于在列表的末尾添加單個元素。語法&#xff1a;list.append(element)示例&#xff1a;my_list [1, 2,…

并行與分布式計算 第9章 算法設計

文章目錄 并行與分布式計算 第9章 算法設計9.1 設計過程9.1.1 PCAM設計過程9.1.2 劃分9.1.3 通信9.1.4 組合9.1.5 映射 8.2 設計方法8.2.1 劃分技術9.2.2 分治9.2.3 平衡樹技術9.2.4倍增技術9.2.5 流水線技術9.2.6 破對稱技術 并行與分布式計算 第9章 算法設計 9.1 設計過程 …

一張圖,了解美格智能高算力AI模組

美格智能高算力A模組&#xff0c;澎湃算力讓AI觸手可及&#xff01;

數字化背景下,集流體行業的智能制造方法論

行業背景 隨著全球對清潔能源需求的不斷增加&#xff0c;新能源領域正在迅速崛起&#xff0c;在新能源技術中&#xff0c;鋰電池作為一種高效、輕便的能量儲存解決方案&#xff0c;正成為主流。而鋰電集流體作為鋰電池的核心部件&#xff0c;承擔著電池內部電流分布的關鍵角色…

掌握Java關鍵字與面試技巧的完美結合!

問題&#xff1a;請說明什么是策略模式&#xff0c;并使用Java代碼舉例說明其使用場景和實現方式。 答案&#xff1a; 策略模式是一種行為型設計模式&#xff0c;它允許在運行時根據不同的情況選擇不同的算法或策略。它將每個可選的算法封裝成一個獨立的類&#xff0c;從而使得…

服務號可以遷移到訂閱號嗎

服務號和訂閱號有什么區別&#xff1f;服務號轉為訂閱號有哪些作用&#xff1f;首先我們要看一下服務號和訂閱號的主要區別。1、服務號推送的消息沒有折疊&#xff0c;消息出現在聊天列表中&#xff0c;會像收到消息一樣有提醒。而訂閱號推送的消息是折疊的&#xff0c;“訂閱號…