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.
141 lines
3.7 KiB
141 lines
3.7 KiB
<template> |
|
<view class="content"></view> |
|
</template> |
|
|
|
<script lang="ts"> |
|
import { |
|
onLoad, |
|
onShow, |
|
onHide, |
|
onUnload |
|
} from '@dcloudio/uni-app' |
|
import { |
|
reactive, |
|
defineProps |
|
} from "vue"; |
|
export default { |
|
setup() { |
|
let details = reactive({ |
|
activity: null, |
|
receiver: null, |
|
intentFilter: null, |
|
isstart:false, |
|
|
|
}) |
|
const props=defineProps<{ishidestop?:boolean}>() |
|
onLoad(() => { |
|
initScan() |
|
startScan(); |
|
}) |
|
onShow(()=>{ |
|
startScan(); |
|
}) |
|
onHide(() => { |
|
if(props?.ishidestop)return |
|
stopScan(); |
|
}) |
|
onUnload(() => { |
|
stopScan(); |
|
uni.$off('scancodedate') |
|
}) |
|
|
|
function initScan() { |
|
// #ifdef APP |
|
if (plus) { |
|
details.activity = plus.android.runtimeMainActivity(); //获取activity |
|
var IntentFilter = plus.android.importClass('android.content.IntentFilter'); |
|
details.intentFilter = new IntentFilter(); |
|
details.intentFilter.addAction("scan.rcv.message") // 换你的广播动作 |
|
details.receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', { |
|
onReceive: function(context, intent) { |
|
console.log("intent", intent) |
|
plus.android.importClass(intent); |
|
let content = utf8ByteToUnicodeStr(intent.getByteArrayExtra('barocode')) |
|
uni.$emit('scancodedate', content.replace(/\n/g, "")) |
|
} |
|
}); |
|
} |
|
// #endif |
|
} |
|
|
|
function utf8ByteToUnicodeStr(utf8Bytes) { |
|
var unicodeStr = ""; |
|
for (var pos = 0; pos < utf8Bytes.length;) { |
|
var flag = utf8Bytes[pos]; |
|
var unicode = 0; |
|
if ((flag >>> 7) === 0) { |
|
unicodeStr += String.fromCharCode(utf8Bytes[pos]); |
|
pos += 1; |
|
|
|
} else if ((flag & 0xFC) === 0xFC) { |
|
unicode = (utf8Bytes[pos] & 0x3) << 30; |
|
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 24; |
|
unicode |= (utf8Bytes[pos + 2] & 0x3F) << 18; |
|
unicode |= (utf8Bytes[pos + 3] & 0x3F) << 12; |
|
unicode |= (utf8Bytes[pos + 4] & 0x3F) << 6; |
|
unicode |= (utf8Bytes[pos + 5] & 0x3F); |
|
unicodeStr += String.fromCodePoint(unicode); |
|
pos += 6; |
|
|
|
} else if ((flag & 0xF8) === 0xF8) { |
|
unicode = (utf8Bytes[pos] & 0x7) << 24; |
|
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 18; |
|
unicode |= (utf8Bytes[pos + 2] & 0x3F) << 12; |
|
unicode |= (utf8Bytes[pos + 3] & 0x3F) << 6; |
|
unicode |= (utf8Bytes[pos + 4] & 0x3F); |
|
unicodeStr += String.fromCodePoint(unicode); |
|
pos += 5; |
|
|
|
} else if ((flag & 0xF0) === 0xF0) { |
|
unicode = (utf8Bytes[pos] & 0xF) << 18; |
|
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 12; |
|
unicode |= (utf8Bytes[pos + 2] & 0x3F) << 6; |
|
unicode |= (utf8Bytes[pos + 3] & 0x3F); |
|
unicodeStr += String.fromCodePoint(unicode); |
|
pos += 4; |
|
|
|
} else if ((flag & 0xE0) === 0xE0) { |
|
unicode = (utf8Bytes[pos] & 0x1F) << 12;; |
|
unicode |= (utf8Bytes[pos + 1] & 0x3F) << 6; |
|
unicode |= (utf8Bytes[pos + 2] & 0x3F); |
|
unicodeStr += String.fromCharCode(unicode); |
|
pos += 3; |
|
|
|
} else if ((flag & 0xC0) === 0xC0) { //110 |
|
unicode = (utf8Bytes[pos] & 0x3F) << 6; |
|
unicode |= (utf8Bytes[pos + 1] & 0x3F); |
|
unicodeStr += String.fromCharCode(unicode); |
|
pos += 2; |
|
|
|
} else { |
|
unicodeStr += String.fromCharCode(utf8Bytes[pos]); |
|
pos += 1; |
|
} |
|
} |
|
return unicodeStr; |
|
} |
|
|
|
function startScan() { |
|
// #ifdef APP |
|
if(details.isstart) return |
|
details.isstart=true |
|
details.activity.registerReceiver(details.receiver, details.intentFilter); |
|
// #endif |
|
} |
|
function stopScan() { |
|
// #ifdef APP |
|
details.isstart=false |
|
details.activity.unregisterReceiver(details.receiver); |
|
// #endif |
|
} |
|
return { |
|
startScan, |
|
stopScan, |
|
initScan, |
|
} |
|
} |
|
} |
|
</script> |
|
|
|
<style> |
|
</style> |