前言
在前兩篇文章中唬渗,我們講述了二維碼的生成典阵、保存和分享的內(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é)果:
這樣谣光,我們就實現(xiàn)了一個二維碼的掃描功能檩淋。
總結(jié)
zxing-lite是一個實現(xiàn)二維碼相關(guān)內(nèi)容的精簡庫,能夠很方便的實現(xiàn)二維碼的掃描功能萄金。