0602
This commit is contained in:
+166
@@ -0,0 +1,166 @@
|
||||
/**
|
||||
* 统一扫码模块
|
||||
* 支持 安卓设备 / iData 专用 / 通用 Android 手动配置
|
||||
*
|
||||
* === 使用方式 ===
|
||||
*
|
||||
* import scan from '@/utils/scan.js'
|
||||
*
|
||||
* onLoad() {
|
||||
* scan.setMode('uniapp') // 'uniapp' | 'idata' | 'android'(默认 uniapp)
|
||||
* scan.init()
|
||||
* scan.register((codeStr) => {
|
||||
* console.log('扫码结果:', codeStr)
|
||||
* })
|
||||
* },
|
||||
* onUnload() {
|
||||
* scan.unregister()
|
||||
* }
|
||||
*
|
||||
* === API ===
|
||||
* scan.setMode(mode) - 设置模式:'uniapp' | 'idata' | 'android'
|
||||
* scan.init() - 初始化扫码模块
|
||||
* scan.register(cb) - 注册回调:cb(codeStr)
|
||||
* scan.unregister() - 注销回调(页面级)
|
||||
* scan.startScan() - 开始扫描
|
||||
* scan.stopScan() - 停止扫描
|
||||
* scan.isScanning() - 是否正在扫描
|
||||
* scan.destroy() - 完全销毁(应用级)
|
||||
*/
|
||||
|
||||
// 模式常量
|
||||
var MODE = {
|
||||
UNIAPP: 'uniapp',
|
||||
IDATA: 'idata',
|
||||
ANDROID: 'android'
|
||||
}
|
||||
|
||||
// 当前模式,默认 uniapp(安卓设备)
|
||||
var currentMode = MODE.UNIAPP
|
||||
|
||||
// 实际实现模块(延迟加载)
|
||||
var impl = null
|
||||
|
||||
/**
|
||||
* 设置扫码模式(必须在 init() 之前调用)
|
||||
* @param {'uniapp'|'idata'|'android'} mode
|
||||
*/
|
||||
function setMode(mode) {
|
||||
var validModes = [MODE.UNIAPP, MODE.IDATA, MODE.ANDROID]
|
||||
if (validModes.indexOf(mode) === -1) {
|
||||
console.error('[Scan] 不支持的模式: ' + mode + ',可选: uniapp, idata, android')
|
||||
return
|
||||
}
|
||||
// 如果已初始化,先销毁再重新设置模式
|
||||
if (impl) {
|
||||
destroy()
|
||||
}
|
||||
currentMode = mode
|
||||
}
|
||||
|
||||
/**
|
||||
* 初始化扫码模块
|
||||
* 根据当前配置的模式初始化对应的实现
|
||||
*/
|
||||
function init() {
|
||||
// 如果已初始化,先销毁再重建
|
||||
if (impl) {
|
||||
impl.destroy()
|
||||
impl = null
|
||||
}
|
||||
|
||||
if (currentMode === MODE.UNIAPP) {
|
||||
// 安卓设备:使用 uni-app 默认扫码
|
||||
var ScanUniappImpl = require('./scan-uniapp.js').default
|
||||
impl = new ScanUniappImpl()
|
||||
} else if (currentMode === MODE.IDATA) {
|
||||
var iDataModule = uni.requireNativePlugin('iData-BarcodePlugin-BarcodeModule')
|
||||
if (!iDataModule) {
|
||||
throw new Error('[Scan] iData 插件加载失败,请确认已安装 iData-BarcodePlugin-BarcodeModule')
|
||||
}
|
||||
var ScanIdataImpl = require('./scan-idata.js').default
|
||||
impl = new ScanIdataImpl(iDataModule)
|
||||
} else {
|
||||
// 带扫码PDA设备:使用 Android 系统扫码 API
|
||||
try {
|
||||
plus.android.importClass('android.device.ScanDevice')
|
||||
} catch (e) {
|
||||
throw new Error('[Scan] Android 系统扫码 API 加载失败: ' + e.message)
|
||||
}
|
||||
var ScanAndroidImpl = require('./scan-android.js').default
|
||||
impl = new ScanAndroidImpl()
|
||||
}
|
||||
|
||||
impl.init()
|
||||
}
|
||||
|
||||
/**
|
||||
* 注册扫码结果回调
|
||||
* @param {Function} callback - (codeStr: string) => void
|
||||
*/
|
||||
function register(callback) {
|
||||
if (!impl) {
|
||||
console.error('[Scan] 请先调用 init() 初始化扫码模块')
|
||||
return
|
||||
}
|
||||
impl.register(callback)
|
||||
}
|
||||
|
||||
/**
|
||||
* 注销监听(页面卸载时调用)
|
||||
*/
|
||||
function unregister() {
|
||||
if (impl) {
|
||||
impl.unregister()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 开始扫描
|
||||
*/
|
||||
function startScan() {
|
||||
if (!impl) {
|
||||
console.error('[Scan] 请先调用 init() 初始化扫码模块')
|
||||
return
|
||||
}
|
||||
impl.startScan()
|
||||
}
|
||||
|
||||
/**
|
||||
* 停止扫描
|
||||
*/
|
||||
function stopScan() {
|
||||
if (!impl) {
|
||||
return
|
||||
}
|
||||
impl.stopScan()
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否正在扫描
|
||||
* @returns {boolean}
|
||||
*/
|
||||
function isScanning() {
|
||||
return impl ? impl.isScanning() : false
|
||||
}
|
||||
|
||||
/**
|
||||
* 完全销毁扫码模块(应用退出时调用)
|
||||
*/
|
||||
function destroy() {
|
||||
if (impl) {
|
||||
impl.destroy()
|
||||
impl = null
|
||||
}
|
||||
}
|
||||
|
||||
export default {
|
||||
setMode: setMode,
|
||||
init: init,
|
||||
register: register,
|
||||
unregister: unregister,
|
||||
startScan: startScan,
|
||||
stopScan: stopScan,
|
||||
isScanning: isScanning,
|
||||
destroy: destroy
|
||||
}
|
||||
Reference in New Issue
Block a user