Android二維碼的基礎使用(三):二維碼掃描Demo實現(xiàn)

前言

在前兩篇文章中唬渗,我們講述了二維碼的生成典阵、保存和分享的內(nèi)容,本次我們對于二維碼的掃描的內(nèi)容進行說明镊逝,實現(xiàn)一個簡易的Android掃一掃功能壮啊。

系列文章:

Android二維碼的基礎使用(一):利用Zxing生成自定義二維碼
Android二維碼的基礎使用(二):保存和分享
Android二維碼的基礎使用(三):二維碼掃描Demo實現(xiàn)

一、lib庫說明

掃描二維碼同樣需要引入zxing庫撑蒜,但是由于原生的zxing庫使用在自定義特性上支持一般歹啼,于是在此我選擇引入了輔助庫:

implementation 'com.king.zxing:zxing-lite:1.1.9-androidx'

zxing-lite庫實際上是一個Zxing的精簡輔助庫,對于掃碼功能進行了優(yōu)化座菠,同時內(nèi)置了閃光燈等功能狸眼,對于代碼集成上也是更加簡單刀闷。

其GitHub地址如下:
zxing-lite Github地址

一部默、布局實現(xiàn)

首先我們先添加一個布局activity_q_r_scanner.xml,包括有掃碼框撇贺,打開閃光燈的開關(guān)巡莹,代碼如下:

<?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">

    <SurfaceView
        android:id="@+id/sv_preview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <com.king.zxing.ViewfinderView
        android:id="@+id/vfv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:cornerColor="@color/color_4E5BCD"
        app:cornerRectHeight="54dp"
        app:cornerRectWidth="4dp"
        app:frameColor="@color/color_4E5BCD"
        app:frameHeight="242dp"
        app:frameWidth="242dp"
        app:labelText="請掃描智慧碼"
        app:labelTextColor="@color/color_ffffff"
        app:labelTextLocation="bottom"
        app:labelTextPadding="18dp"
        app:labelTextSize="16sp"
        app:laserColor="@color/color_4E5BCD"
        app:maskColor="@color/color_80000000"
        app:scannerLineHeight="4dp" />

    <TextView
        android:id="@+id/tv_torch"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="32dp"
        android:drawableTop="@drawable/selector_torch"
        android:drawablePadding="12dp"
        android:gravity="center"
        android:text="打開照明"
        android:textColor="@color/color_ffffff"
        android:textSize="26sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        tools:ignore="HardCodedText" />

</androidx.constraintlayout.widget.ConstraintLayout>

其中com.king.zxing.ViewfinderView為掃描框司志,有著眾多的屬性,如設置提示文本的labelText等降宅,大家可以在zxing-lite的GitHub地址上進行屬性查詢及運用骂远。

二、activity代碼

添加一個和布局對應的activity——QRScannerActivity.kt腰根,首先我們需要判斷權(quán)限問題激才,如下:

    /**
     * 權(quán)限檢查
     */
    private fun checkPermission() {
        if (!checkPermissions(arrayOf(Manifest.permission.CAMERA))) {
            //彈起授權(quán)彈窗
            baseRequestPermissions(
                arrayOf(Manifest.permission.CAMERA),
                object : PermissionCallback() {
                    override fun onPermissionGranted(permissions: Array<String?>?) {}
                    override fun onPermissionDenied(permissions: Array<String?>?) {
                        Toast.makeText(mActivity,"權(quán)限被拒絕",Toast.LENGTH_SHORT).show()
                        finish()
                    }
                })
        }
    }

然后需要配置掃碼框的屬性,代碼如下:

    /**
     * 初始化QRScanner配置
     */
    private fun initQRConfig(){
        captureHelper = CaptureHelper(this, viewBinding.svPreview, viewBinding.vfv, null)
        captureHelper.setOnCaptureCallback(this)
        captureHelper.decodeFormats(DecodeFormatManager.QR_CODE_FORMATS)
            .supportAutoZoom(true) // 自動縮放
            .fullScreenScan(true) // 全屏掃碼識別
            .supportLuminanceInvert(true) // 是否支持識別反色碼额嘿,黑白顏色反轉(zhuǎn)瘸恼,開啟提高識別效率
            .continuousScan(true) // 開啟連續(xù)掃描
            .autoRestartPreviewAndDecode(false) // 連續(xù)掃描開啟情況下,取消自動繼續(xù)掃描册养,自己處理完后調(diào)用restartPreviewAndDecode()
            .playBeep(true) // 播放beep聲音
            .supportZoom(true) // 支持雙指縮放
            .frontLightMode(FrontLightMode.OFF) // 默認關(guān)閉閃光燈
            .setOnCaptureCallback(this) // 設置回調(diào)
            .onCreate()
        val cameraManager: CameraManager = captureHelper.cameraManager
        cameraManager.setOnTorchListener { torch: Boolean ->
            viewBinding.tvTorch.isSelected = torch
            viewBinding.tvTorch.text = if (torch) "關(guān)閉照明" else "打開照明"
        }
        viewBinding.tvTorch.setOnClickListener(View.OnClickListener {
            cameraManager.setTorch(
                !viewBinding.tvTorch.isSelected
            )
        })
        viewBinding.tvTorch.post(Runnable { this.updateScanFrameLocation() })
    }

    /**
     * 更新掃描框位置
     */
    private fun updateScanFrameLocation() {
        //(327+184)/2-184
        viewBinding.vfv.setPadding(0, 0, 0, Utils.dp2px(this, 71))
        viewBinding.vfv.scannerStart = 0 // 動態(tài)改變padding時东帅,需要設置該值為0,以觸發(fā)在onDraw中對其的重新賦值
    }

除此之外球拦,我們需要在Activity的生命周期中進行處理,同時繼承OnCaptureCallback接口靠闭,在onCreate()中初始化配置及權(quán)限處理,在onResume(),onPause(),onDestory()進行處理坎炼,代碼如下:

@Route(path = ConstUtil.QRCodeActivityPath)
class QRScannerActivity : BaseActivity(),OnCaptureCallback {
    private lateinit var viewBinding: ActivityQRScannerBinding
    private lateinit var captureHelper: CaptureHelper

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        viewBinding = ActivityQRScannerBinding.inflate(layoutInflater)
        setContentView(viewBinding.root)
        initQRConfig()
        checkPermission()
    }

    override fun onResultCallback(result: String?): Boolean {
        //todo 處理結(jié)果
        Toast.makeText(mActivity,result,Toast.LENGTH_SHORT).show()
        return true
    }

    override fun onResume() {
        //注意在生命周期的captureHelper設置愧膀,否則可能出現(xiàn)無法掃描的問題
        captureHelper.onResume()
        super.onResume()
    }

    override fun onPause() {
        captureHelper.onPause()
        super.onPause()
    }

    override fun onDestroy() {
        captureHelper.onDestroy()
        super.onDestroy()
    }
    ...
}

添加如上代碼,我們就能夠?qū)崿F(xiàn)最終的結(jié)果:

二維碼掃描.png

這樣谣光,我們就實現(xiàn)了一個二維碼的掃描功能檩淋。

總結(jié)

zxing-lite是一個實現(xiàn)二維碼相關(guān)內(nèi)容的精簡庫,能夠很方便的實現(xiàn)二維碼的掃描功能萄金。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蟀悦,一起剝皮案震驚了整個濱河市碳柱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌熬芜,老刑警劉巖莲镣,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涎拉,居然都是意外死亡瑞侮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門鼓拧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來半火,“玉大人,你說我怎么就攤上這事季俩∨ヌ牵” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵酌住,是天一觀的道長店归。 經(jīng)常有香客問我,道長酪我,這世上最難降的妖魔是什么消痛? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮都哭,結(jié)果婚禮上秩伞,老公的妹妹穿的比我還像新娘。我一直安慰自己欺矫,他們只是感情好纱新,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著穆趴,像睡著了一般脸爱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上毡代,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天阅羹,我揣著相機與錄音勺疼,去河邊找鬼教寂。 笑死,一個胖子當著我的面吹牛执庐,可吹牛的內(nèi)容都是我干的酪耕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼轨淌,長吁一口氣:“原來是場噩夢啊……” “哼迂烁!你這毒婦竟也來了看尼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤盟步,失蹤者是張志新(化名)和其女友劉穎藏斩,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體却盘,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡狰域,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了黄橘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兆览。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖塞关,靈堂內(nèi)的尸體忽然破棺而出抬探,到底是詐尸還是另有隱情,我是刑警寧澤帆赢,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布小压,位于F島的核電站,受9級特大地震影響椰于,放射性物質(zhì)發(fā)生泄漏场航。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一廉羔、第九天 我趴在偏房一處隱蔽的房頂上張望溉痢。 院中可真熱鬧,春花似錦憋他、人聲如沸孩饼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镀娶。三九已至,卻和暖如春揪罕,著一層夾襖步出監(jiān)牢的瞬間梯码,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工好啰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留轩娶,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓框往,卻偏偏與公主長得像鳄抒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

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