93 lines
2.0 KiB
JavaScript
93 lines
2.0 KiB
JavaScript
/**
|
||
* uni-app 默认扫码实现
|
||
* 使用 uni.scanCode API(安卓设备)
|
||
*
|
||
* 注意:uni.scanCode 是一次性扫码,每次调用都会弹出扫码界面
|
||
* 不支持持续扫描,因此 startScan() 每次都会弹出新界面
|
||
*/
|
||
|
||
class ScanUniappImpl {
|
||
constructor() {
|
||
this._callback = null
|
||
this._isScanning = false
|
||
}
|
||
|
||
/**
|
||
* 初始化(uni.scanCode 无需特殊初始化)
|
||
*/
|
||
init() {
|
||
console.log('[Scan-Uniapp] 初始化完成(使用 uni.scanCode)')
|
||
}
|
||
|
||
/**
|
||
* 注册扫码结果回调
|
||
* @param {Function} callback - (codeStr: string) => void
|
||
*/
|
||
register(callback) {
|
||
this._callback = callback
|
||
}
|
||
|
||
/**
|
||
* 注销监听(页面卸载时调用)
|
||
*/
|
||
unregister() {
|
||
this._callback = null
|
||
}
|
||
|
||
/**
|
||
* 开始扫描(调用 uni.scanCode)
|
||
* 注意:每次调用都会弹出扫码界面
|
||
*/
|
||
startScan() {
|
||
if (this._isScanning) return
|
||
this._isScanning = true
|
||
|
||
const self = this
|
||
uni.scanCode({
|
||
success: (res) => {
|
||
self._isScanning = false
|
||
console.log('[Scan-Uniapp] 扫码结果:', res.result)
|
||
if (self._callback) {
|
||
self._callback(res.result)
|
||
}
|
||
},
|
||
fail: (err) => {
|
||
self._isScanning = false
|
||
console.error('[Scan-Uniapp] 扫码失败:', err)
|
||
// 用户取消不算错误,不显示 toast
|
||
if (err.errMsg && err.errMsg.indexOf('cancel') === -1) {
|
||
uni.showToast({ title: '扫码失败', icon: 'none' })
|
||
}
|
||
},
|
||
complete: () => {
|
||
self._isScanning = false
|
||
}
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 停止扫描(uni.scanCode 无法中途停止,此方法仅重置状态)
|
||
*/
|
||
stopScan() {
|
||
this._isScanning = false
|
||
}
|
||
|
||
/**
|
||
* 是否正在扫描
|
||
* 注意:uni.scanCode 是异步的,调用后界面会切换,此方法主要用于防止重复调用
|
||
*/
|
||
isScanning() {
|
||
return this._isScanning
|
||
}
|
||
|
||
/**
|
||
* 完全销毁(应用退出时调用)
|
||
*/
|
||
destroy() {
|
||
this.unregister()
|
||
this._isScanning = false
|
||
}
|
||
}
|
||
|
||
export default ScanUniappImpl
|