uni-app 利用native调用Android NFC 读取RFID标签的UID

2,001 阅读1分钟

注意:打包前一定一定要在mainfest.json中进行Nfc授权,否则打包出来的安装包无法正常读取标签

mainfest.json授权:

"<uses-permission android:name="android.permission.INTERNET"/>",
"<uses-permission android:name="android.permission.NFC"/>",
"<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>",

<template>
	<view class="container_wrap setting_container">
		<u-form ref="uForm" :model="form" class="setting_form">
			<u-form-item label="RFID" prop="rfid">
				<u-input v-model="form.rfid" placeholder="请输入RFID" input-align="right"/>
			</u-form-item>
			<u-form-item label="电机序列号" prop="motorSN" labelWidth="178" >
				<u-input v-model="form.motorSN" placeholder="请输入电机序列号" input-align="right"/>
			</u-form-item>
			<u-form-item label="货位" prop="position" >
				<u-input v-model="form.position" placeholder="请选择货位" type="select" @click="positionShow=true" input-align="right"/>
			</u-form-item>
		</u-form>
		<u-button class="primary_button" @click="submit" shape='circle'>入库</u-button>
		<u-modal v-model="confirmShow" show-cancel-button @confirm="confirmSubmit" cancel="confirmShow = false" title="请确认信息无误">
			<view class="slot-content form-modal-cont">
				<view>货位:{{form.position}}</view>
				<view>RFID:{{confirmInfo.Rfid}}</view>
				<view>电机序列号:{{confirmInfo.MotorSN}}</view>
				<view>电机型号:{{confirmInfo.MotorType}}</view>
				<view>电机修程:{{confirmInfo.MotorRepair}}</view>
				<view>轴承厂家:{{confirmInfo.Factory}}</view>
				<view>修俊时间:{{confirmInfo.RepairDate}}</view>
				<!-- <view style="color:red;text-align: center;margin-top: 10rpx;">请确认信息无误!</view> -->
			</view>
		</u-modal>
		
		<u-select :default-value="defaultValue" value-name="Id" label-name="Name" :mode="mode" v-model="positionShow" :list="positionList" @confirm="confirmPicker" @cancel="cancelPicker"></u-select>
		<tabBar current="/pages/work/goodsIn"></tabBar>
	</view>
</template>

<script>
	var NfcAdapter; 
	import request from '@/utils/tools/request.js'
	import { loadposition, goodssearch, goodsin } from '@/api/embiid/pda.js'
	export default {
		data() {
			return {
				show: false,
				result: '尚未选择',
				defaultValue: [0],
				mode: 'single-column',
				form:{
					rfid:'',
					motorSN:'',
					position:''
				},
				positionObj:{},
				positionShow:false,
				positionList:[],
				rules: {
					position: [
						{
							required: true, 
							message: '请选择货位', 
							trigger: ['change','blur'],
						}
					]
				},
				// scancode:'',
				confirmInfo:{},
				confirmShow:false,
				confirmCon:''
			}
		},
		onShow() {
			this.NFCInit(); 
		},
		onLoad: function () {
			try {
				this.getPositionFn()
			} catch (e) {
				uni.showToast({
					icon:'fail',
					title:'异常,原因:'+e.message
				});
			}
		},
		onReady() {
			this.$refs.uForm.setRules(this.rules);
		},
		onHide() {  
			this.NFCReadUID();  
		}, 
		methods:{
			getPositionFn(){
				loadposition({regionId:'IN'}).then(res => {
					let { Data } = res
					this.positionList = Data||[]
				}).catch((err) => {
				    if(err.Message){
				    	uni.showModal({
				    		title: 'error',
				    		content: err.Message,
				    		showCancel:false
				    	});
				    }
				})
			},
			confirmPicker(obj){
				this.positionObj = obj[0]
				this.form.position = obj[0].label;
			},
			cancelPicker(){
				
			},
			submit() {
				this.$refs.uForm.validate(valid => {
					if (valid) {
						this.goodssearchFn()
					} else {
						console.log('验证失败');
					}
				});
			},
			goodssearchFn(){
				let params = {
					rfid: this.form.rfid,
					motorSN: this.form.motorSN
				}
				goodssearch(params).then(res => {
					const {Data} = res
					this.confirmInfo = Data
					this.confirmShow = true
				}).catch((err) => {
				    if(err.Message){
				    	uni.showModal({
				    		title: 'error',
				    		content: err.Message,
				    		showCancel:false
				    	});
				    }
				})
			},
			confirmSubmit(){
				let params = {
				    "rfid": this.confirmInfo.Rfid,              //RFID  值
				    "motorSN": this.confirmInfo.MotorSN,    //电机序列号
				    "motorType": this.confirmInfo.MotorType,  //电机型号
				    "motorRepair": this.confirmInfo.MotorRepair, //电机修程
				    "factory": this.confirmInfo.Factory,        //轴承厂家
				    "repairDate": this.confirmInfo.RepairDate,  //修俊时间
				    "productId": 2,    //产品Id  ,默认2
				    "positionName": this.form.position  //位置编号

				}
				goodsin(params).then(res => {
					uni.showToast({
					  icon: "none",
					  title: '操作成功'
					});
				}).catch((err) => {
				    if(err.Message){
				    	uni.showModal({
				    		title: 'error',
				    		content: err.Message,
				    		showCancel:false
				    	});
				    }
				})
			},
			NFCInit() {
				try {  
					var main = plus.android.runtimeMainActivity();  
					var Intent = plus.android.importClass('android.content.Intent');  
					var Activity = plus.android.importClass('android.app.Activity');  
					var PendingIntent = plus.android.importClass('android.app.PendingIntent');  
					var IntentFilter = plus.android.importClass('android.content.IntentFilter');  
					NfcAdapter = plus.android.importClass('android.nfc.NfcAdapter');  
					var _nfcAdapter = NfcAdapter.getDefaultAdapter(main)  

					var ndef = new IntentFilter("android.nfc.action.NDEF_DISCOVERED"); //NfcAdapter.ACTION_NDEF_DISCOVERED  
					var tag = new IntentFilter("android.nfc.action.TAG_DISCOVERED"); //NfcAdapter.ACTION_TECH_DISCOVERED  
					var tech = new IntentFilter("android.nfc.action.TECH_DISCOVERED");  
					var intentFiltersArray = [ndef, tag, tech];  

					var techListsArray = [  
						["android.nfc.tech.Ndef"],  
						["android.nfc.tech.IsoDep"],  
						["android.nfc.tech.NfcA"],  
						["android.nfc.tech.NfcB"],  
						["android.nfc.tech.NfcF"],  
						["android.nfc.tech.Nfcf"],  
						["android.nfc.tech.NfcV"],  
						["android.nfc.tech.NdefFormatable"],  
						["android.nfc.tech.MifareClassi"],  
						["android.nfc.tech.MifareUltralight"]  
					];  
			 
					var _intent = new Intent(main, main.getClass());  
					_intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);  
					
					var pendingIntent = PendingIntent.getActivity(main, 0, _intent, 0);  
					if (_nfcAdapter == null) {  
						this.tip = '本设备不支持NFC!';  
					} else if (_nfcAdapter.isEnabled() == false) {  
						this.tip = 'NFC功能未打开!';  
					} else {  
						this.tip = 'NFC正常';  
						_nfcAdapter.enableForegroundDispatch(main, pendingIntent, IntentFilter, techListsArray);  
					}  
				} catch (e) {  
					//TODO handle the exception  
				}  
			},  
			NFCReadUID() {  
				var main = plus.android.runtimeMainActivity();  
				var _intent = main.getIntent();  
				var _action = _intent.getAction(); 
				if (NfcAdapter.ACTION_NDEF_DISCOVERED == _action || NfcAdapter.ACTION_TAG_DISCOVERED == _action || NfcAdapter.ACTION_TECH_DISCOVERED ==  
					_action) {  
					var Tag = plus.android.importClass('android.nfc.Tag');  
					var tagFromIntent = _intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
					var uid = _intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);  
					let str = this.Bytes2HexString(uid);  
					this.form.rfid = str.toUpperCase()
				}  
			},
			//将byte[] 转为Hex,  
			Bytes2HexString(arrBytes) {  
				var str = "";  
				for (var i = 0; i < arrBytes.length; i++) {  
					var tmp;  
					var num = arrBytes[i];  
					if (num < 0) {  
						//Java中数值是以补码的形式存在的,应用程序展示的十进制是补码对应真值。补码的存在主要为了简化计算机底层的运算,将减法运算直接当加法来做  
						tmp = (255 + num + 1).toString(16);  
					} else {  
						tmp = num.toString(16);  
					}  
					if (tmp.length == 1) {  
						tmp = "0" + tmp;  
					}  
					str += tmp;  
				}  
				return str;  
			}
		}
	}
</script>

<style lang="scss" scoped>
	.setting_container {
		padding: 20rpx 30rpx;
		box-sizing: border-box;
		background-color: #f8f8f8;
		height: 100%;
		.setting_form{
			background-color: #fff;
			padding: 0 30rpx;
			border-radius: 6px;
			/deep/ .u-form-item{
				color: #606266;
			}
		}	
	}
	.form-modal-cont{
		padding: 24rpx 40rpx;
		uni-view{
			height: 64rpx;
			line-height: 64rpx;
		}
	}
</style>