首頁 > 軟體

app場景下uniapp的掃碼記錄

2022-07-21 14:02:52

背景

掃碼需求日益增多,為了滿足客戶的需求,掃碼演變的多種多樣,其中有二維條碼,條形碼居中,條形碼又可以細分成幾種,以下記錄全螢幕和自定義頁面掃碼的在uniapp的技術實現

全螢幕掃碼

uniapp自身帶的api方法-uni.scanCode

uni.scanCode(OBJECT)

h5平臺暫不支援這種形式調起全螢幕

掃碼的格式基本滿足日常需求,但是一些格式的碼還是沒有得到支援

程式碼範例如下:

// 允許從相機和相簿掃碼
uni.scanCode({
	success: function (res) {
		console.log('條碼型別:' + res.scanType);
		console.log('條碼內容:' + res.result);
	}
});
// 只允許通過相機掃碼
uni.scanCode({
	onlyFromCamera: true,
	success: function (res) {
		console.log('條碼型別:' + res.scanType);
		console.log('條碼內容:' + res.result);
	}
});
// 調起條碼掃描
uni.scanCode({
	scanType: ['barCode'],
	success: function (res) {
		console.log('條碼型別:' + res.scanType);
		console.log('條碼內容:' + res.result);
	}
});

優點:方便快捷調起全螢幕掃碼

缺點:支援碼的種類不多,掃碼效率比不過微信、支付寶等商業掃碼庫。如需更強的掃碼效果,參考下方的支付寶外掛掃碼

支付寶外掛掃碼

針對app場景,我們使用全螢幕掃碼,可以使用支付寶提供的掃碼外掛,具體接入,可參考我上一篇 uniapp接入支付寶掃碼 ,這個的速度和識別率基本是業內頂尖,特別提醒接入掃一掃這個服務本身是免費的,但是假如你要開啟掃碼檢測,紀錄檔記錄的話,這些就要額外收費,這點大家根據需求來,但是大部分情況,作為免費測試的話,大家記得關閉這些額外收費的功能

tip:接入這個外掛要先自定義基座再打包,不然執行不生效

var mpaasScanModule = uni.requireNativePlugin("Mpaas-Scan-Module")
mpaasScanModule.mpaasScan({
                        // 掃碼識別型別,引數可多選,qrCode、barCode,不設定,預設識別所有
                        'scanType':  ['qrCode','barCode'],
                        // 是否隱藏相簿,預設false不隱藏
                        'hideAlbum': false
                    },
                    (ret) => {
                        uni.showModal({
                            title: "彈窗標題",
                            // 返回值中,resp_code 表示返回結果值,10:使用者取消,11:其他錯誤,1000:成功
                            // 返回值中,resp_message 表示返回結果資訊
                            // 返回值中,resp_result 表示掃碼結果,只有成功才會有返回
                            content: JSON.stringify(ret),
                            showCancel: false,
                            confirmText: "確定"
                        })
                    })

優點:支援掃碼的格式多,基本涵蓋各類碼

缺點:uniapp暫時只支援全螢幕,希望官方可以推出自定義掃碼

自定義掃碼

自定義掃碼的場景也是在市場上的需求佔有一定的分量,例如快遞員的快遞app,經常一個頁面巢狀一個半頁的掃碼框,掃完之後的內容load在下面,直接視覺化觀看!

uniapp nvue自帶的Barcode

app端nvue專用的掃碼元件。

  • App下純nvue專案(manifest中renderer為native),暫不支援uni.scanCode API,此時只能使用barcode元件來替代。
  • 此元件自HBuilderX 2.1.5+起支援。

<barcode id='1' class="barcode" autostart="true" ref="barcode" background="rgb(0,0,0)" frameColor="#1C86EE" scanbarColor="#1C86EE" :filters="fil" @marked="success1" @error="fail1"></barcode>
<template>
	<view>
		<barcode id='1' class="barcode" autostart="true" ref="barcode" background="rgb(0,0,0)" frameColor="#1C86EE" scanbarColor="#1C86EE" :filters="fil" @marked="success1" @error="fail1"></barcode>
		<button class="btn" @click="toStart">開始掃碼識別</button>
		<button class="btn" @click="tocancel">取消掃碼識別</button>
		<button class="btn" @click="toFlash">開啟閃光燈</button>
		<button class="btn" @click="toscan">預覽</button>
	</view>
</template>
<script>
	export default {
		onLoad() {
		},
		data() {
			return {
				fil: [0, 2, 1]
			}
		},
		methods: {
			success1(e) {
				console.log("success1:" + JSON.stringify(e));
			},
			fail1(e) {
				console.log("fail1:" + JSON.stringify(e));
			},
			toStart: function() {
				this.$refs.barcode.start({
					conserve: true,
					filename: '_doc/barcode/'
				});
			},
			tocancel:function(){
				this.$refs.barcode.cancel();
			},
			toFlash: function() {
				this.$refs.barcode.setFlash(true);
			},
			toscan: function() {
				console.log("scan:");				
				const barcodeModule = uni.requireNativePlugin('barcodeScan');
				barcodeModule.scan("/static/barcode1.png"
				,(e)=>{
					console.log("scan_error:"+JSON.stringify(e));
				});
			}
		}
	}
</script>
<style>
	.barcode {
		width: 750rpx;
		height: 700rpx;
		background-color: #808080;
	}
	.btn {
		top: 20rpx;
		width: 730rpx;
		margin-left: 10rpx;
		margin-top: 10rpx;
		background-color: #458B00;
		border-radius: 10rpx;
	}
</style>

優點:該場景可以自由設定寬高巢狀在頁面
缺點:有時候處理不當容易黑畫面,容易樣式錯亂

操作原生的視覺化控制元件Barcode

uni-app可以呼叫plus的api操作擴充套件能力,這塊很簡單,在app的條件編譯裡直接寫就好了,也不需要plus ready。 但是HTML5 裡有很多原生的視覺化控制元件,包括map、video、livepusher、barcode、nview(包括原生頭、原生tab),獲取這些物件和操作他們需要有特殊寫法。

5+app開發時,我們可以用plus.webview.currentWebview獲取當前頁面,但uni-app裡用法不一樣,需要這樣取當前顯示的webview:

const currentWebview = this.$mp.page.$getAppWebview(); //注意相關操作寫在APP-PLUS條件編譯下

還有一種寫法比較冗餘,可以獲取頁面棧中任意一個webview物件:

var pages = getCurrentPages();  
var page = pages[pages.length - 1];  
// #ifdef APP-PLUS  
var currentWebview = page.$getAppWebview(); //頁面棧最頂層就是當前webview  
// #endif

注意uni-app不需要像5+App那樣等待plus ready,可以直接用。核心程式碼:

var barcode = plus.barcode.create('barcode', [plus.barcode.QR], {  
    top:'100px',  
    left:'0px',  
    width: '300px',  
    height: '300px',  
    position: 'static'  
});  
//此處未演示掃碼成功回撥的地址設定,實際請參考HTML5Plus API自行處理  
//注意掃碼區域需為正方形,否則影響掃碼識別率  
currentWebview.append(barcode);

這也是目前比較穩定的自定義掃碼

優點:穩定識別率高,自由度高

缺點:需要自己進行封裝元件,可能沒有上面的單純的呼叫,更多依靠自己的封裝元件能力

這篇記錄了全螢幕掃碼,自定義掃碼分別兩種方式來記錄,請大家各取所需,有什麼更好的,歡迎大家踴躍評論,這篇只是講了app場景,假如是h5選項的情況,以上的記錄可能將不適用,更多關於uniapp掃碼記錄的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com