智能照明系统APP-本地串口
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
LightingSystemApp-serial/.svn/pristine/f5/f52559c07471d82226b110c53ca...

181 lines
4.1 KiB

import {
getStatusBarStyle
} from '../util'
import {
invoke
} from '../../bridge'
import {
ANI_SHOW,
ANI_DURATION
} from '../../constants'
import {
registerPlusMessage,
consumePlusMessage
} from '../../framework/plus-message'
export const SCAN_ID = '__UNIAPP_SCAN'
export const SCAN_PATH = '_www/__uniappscan.html'
const MESSAGE_TYPE = 'scanCode'
export function scanCode ({
onlyFromCamera = false,
scanType
}, callbackId) {
const barcode = plus.barcode
const SCAN_TYPES = {
qrCode: [
barcode.QR,
barcode.AZTEC,
barcode.MAXICODE
],
barCode: [
barcode.EAN13,
barcode.EAN8,
barcode.UPCA,
barcode.UPCE,
barcode.CODABAR,
barcode.CODE128,
barcode.CODE39,
barcode.CODE93,
barcode.ITF,
barcode.RSS14,
barcode.RSSEXPANDED
],
datamatrix: [barcode.DATAMATRIX],
pdf417: [barcode.PDF417]
}
const SCAN_MAPS = {
[barcode.QR]: 'QR_CODE',
[barcode.EAN13]: 'EAN_13',
[barcode.EAN8]: 'EAN_8',
[barcode.DATAMATRIX]: 'DATA_MATRIX',
[barcode.UPCA]: 'UPC_A',
[barcode.UPCE]: 'UPC_E',
[barcode.CODABAR]: 'CODABAR',
[barcode.CODE39]: 'CODE_39',
[barcode.CODE93]: 'CODE_93',
[barcode.CODE128]: 'CODE_128',
[barcode.ITF]: 'CODE_25',
[barcode.PDF417]: 'PDF_417',
[barcode.AZTEC]: 'AZTEC',
[barcode.RSS14]: 'RSS_14',
[barcode.RSSEXPANDED]: 'RSSEXPANDED'
}
const statusBarStyle = getStatusBarStyle()
const isDark = statusBarStyle !== 'light'
let result
let filters = []
if (Array.isArray(scanType) && scanType.length) {
scanType.forEach(type => { // 暂不考虑去重
const types = SCAN_TYPES[type]
if (types) {
filters = filters.concat(types)
}
})
}
if (!filters.length) {
filters = filters.concat(SCAN_TYPES.qrCode).concat(SCAN_TYPES.barCode).concat(SCAN_TYPES.datamatrix).concat(
SCAN_TYPES.pdf417)
}
const buttons = []
if (!onlyFromCamera) {
buttons.push({
float: 'right',
text: '相册',
fontSize: '17px',
width: '60px',
onclick: function () {
plus.gallery.pick(file => {
barcode.scan(file, (type, code) => {
if (isDark) {
plus.navigator.setStatusBarStyle('isDark')
}
result = {
type,
code
}
webview.close('auto')
}, () => {
plus.nativeUI.toast('识别失败')
}, filters)
}, err => {
if (err.code !== 12) {
plus.nativeUI.toast('选择失败')
}
}, {
multiple: false,
system: false
})
}
})
}
const webview = plus.webview.create(SCAN_PATH, SCAN_ID, {
titleNView: {
autoBackButton: true,
type: 'float',
backgroundColor: 'rgba(0,0,0,0)',
titleColor: '#ffffff',
titleText: '扫码',
titleSize: '17px',
buttons
},
popGesture: 'close',
backButtonAutoControl: 'close'
}, {
__uniapp_type: 'scan',
__uniapp_dark: isDark,
__uniapp_scan_type: filters,
'uni-app': 'none'
})
const waiting = plus.nativeUI.showWaiting()
webview.addEventListener('titleUpdate', () => {
webview.show(ANI_SHOW, ANI_DURATION, () => {
waiting.close()
})
})
webview.addEventListener('close', () => {
if (result) {
invoke(callbackId, {
result: result.code,
scanType: SCAN_MAPS[result.type] || '',
charSet: 'utf8',
path: '',
errMsg: 'scanCode:ok'
})
} else {
invoke(callbackId, {
errMsg: 'scanCode:fail cancel'
})
}
consumePlusMessage(MESSAGE_TYPE)
})
if (isDark) { // 状态栏前景色
plus.navigator.setStatusBarStyle('light')
webview.addEventListener('popGesture', ({
type,
result
}) => {
if (type === 'start') {
plus.navigator.setStatusBarStyle('dark')
} else if (type === 'end' && !result) {
plus.navigator.setStatusBarStyle('light')
}
})
}
registerPlusMessage(MESSAGE_TYPE, function (res) {
if (res && 'code' in res) {
result = res
}
}, false)
}