uniapp nfc读写

2023-10-27

1.先添加权限

"<uses-permission android:name=\"android.permission.NFC\"/>"

2.添加NFC调用js

import store from '@/store/index.js'

// 包路径
const package_NdefRecord = 'android.nfc.NdefRecord';
const package_NdefMessage = 'android.nfc.NdefMessage';
const package_TECH_DISCOVERED = 'android.nfc.action.TECH_DISCOVERED';
const package_Intent = 'android.content.Intent'; 
const package_Activity = 'android.app.Activity'; 
const package_PendingIntent = 'android.app.PendingIntent'; 
const package_IntentFilter = 'android.content.IntentFilter'; 
const package_NfcAdapter = 'android.nfc.NfcAdapter'; 
const package_Ndef = 'android.nfc.tech.Ndef'; 
const package_NdefFormatable = 'android.nfc.tech.NdefFormatable'; 
const package_Parcelable = 'android.os.Parcelable'; 
const package_String = 'java.lang.String'; 

let NfcAdapter;
let NdefRecord;
let NdefMessage;
let readyWriteData = false;//开启写
let readyRead = false;//开启读
let noNFC = false;
let techListsArray = [
    ['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']
];
// 要写入的数据
let text = '{id:666,name:aaa,stie:ffff.com}';
let readResult = '';

export default {
    listenNFCStatus: function () {
        console.log("---------监听NFC状态--------------")
        let that = this;
        try {
            let main = plus.android.runtimeMainActivity();
            let Intent = plus.android.importClass('android.content.Intent');
            let Activity = plus.android.importClass('android.app.Activity');
            let PendingIntent = plus.android.importClass('android.app.PendingIntent');
            let IntentFilter = plus.android.importClass('android.content.IntentFilter');
            NfcAdapter = plus.android.importClass('android.nfc.NfcAdapter');
            let nfcAdapter = NfcAdapter.getDefaultAdapter(main);
            
            if(nfcAdapter == null){
                uni.showToast({
                  title: '设备不支持NFC!',
                  icon: 'none'
                })
                noNFC = true;
                return;
            }
            
            if (!nfcAdapter.isEnabled()) {
                uni.showToast({
                  title: '请在系统设置中先启用NFC功能!',
                  icon: 'none'
                });
                noNFC = true;
                return;
            }else{
                noNFC = false;
            }
            
            let intent = new Intent(main, main.getClass());
            intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            let pendingIntent = PendingIntent.getActivity(main, 0, intent, 0);
            let ndef = new IntentFilter("android.nfc.action.TECH_DISCOVERED");
            ndef.addDataType("*/*");
            let intentFiltersArray = [ndef];
            
            plus.globalEvent.addEventListener('newintent',function() {
                console.log('newintent running');
                // 轮询调用 NFC
                setTimeout(that.nfcRuning(), 1000);
            });
            plus.globalEvent.addEventListener('pause',function(e) {
                console.log('pause running');
                if (nfcAdapter) {
                    //关闭前台调度系统
                    //恢复默认状态
                    nfcAdapter.disableForegroundDispatch(main);
                }
            });
            plus.globalEvent.addEventListener('resume',function(e) {
                console.log('resume running');
                if (nfcAdapter) {
                     //开启前台调度系统
                    // 优于所有其他NFC
                    nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray);
                }
            });
            nfcAdapter.enableForegroundDispatch(main, pendingIntent, intentFiltersArray, techListsArray); 
        } catch (e) {
            console.error(e);
        }
    },
    nfcRuning: function () { //
        console.log("--------------NFC 运行---------------")
        NdefRecord = plus.android.importClass("android.nfc.NdefRecord");
        NdefMessage = plus.android.importClass("android.nfc.NdefMessage");
        let main = plus.android.runtimeMainActivity();
        let intent = main.getIntent();
        let that = this;
        
        console.log("action type:" + intent.getAction());
        console.log(package_TECH_DISCOVERED == intent.getAction());
        if (package_TECH_DISCOVERED == intent.getAction()) {
            if (readyWriteData) {
                console.log("----------我在写1-------------")
                that.write(intent);
                readyWriteData = false;
            } else if (readyRead) {
                console.log("----------我在读1-------------")
                that.read(intent);
                readyRead = false;
            }
        }
    },
    write(intent) {  //写代码
        console.log("----------我在写-------------")
        try {
            toast('请勿移开标签 正在写入...');
            console.log("text=" + text);
            
            let textBytes = plus.android.invoke(text, "getBytes");
            // image/jpeg text/plain  
            let textRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA,
                                            plus.android.invoke("text/plain", "getBytes"),  
                                            plus.android.invoke("", "getBytes"), textBytes);
            let message = new NdefMessage([textRecord]);
            let Ndef = plus.android.importClass('android.nfc.tech.Ndef');
            let NdefFormatable = plus.android.importClass('android.nfc.tech.NdefFormatable');
            let tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
            let ndef = Ndef.get(tag);
            if (ndef != null) {
                // 待写入的数据长度
                let size = message.toByteArray().length;
                ndef.connect();
                if (!ndef.isWritable()) {
                    toast('tag不允许写入!');
                    return;
                }
                if (ndef.getMaxSize() < size) {
                    toast('文件大小超出容量!');
                    return;
                }
                ndef.writeNdefMessage(message);  //写入数据
                toast('写入数据成功!');
                return;
            } else {
                let format = NdefFormatable.get(tag);
                if (format != null) {
                    try {
                        format.connect();
                        format.format(message);
                        toast('格式化tag并且写入message');
                        return;
                    } catch (e) {
                        toast('格式化tag失败.');
                        return;
                    }
                } else {
                    toast('Tag不支持NDEF');
                    return;
                }
            }
        } catch (e) {
            toast('写入失败');
            console.log("error=" + e);
        }
    
    },
    read(intent) { // 读代码
        console.log("----------我在读read-------------")
        toast('请勿移开标签正在读取数据');
        let that = this;
        // NFC id
        let bytesId = intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
        let nfc_id = that.byteArrayToHexString(bytesId);
        console.log('nfc_id:', nfc_id);
        let Parcelable = plus.android.importClass("android.os.Parcelable");
        let rawmsgs = intent.getParcelableArrayExtra("android.nfc.extra.NDEF_MESSAGES");
        //let rawmsgs = intent.getParcelableArrayExtra();
        
        console.log("数据"+rawmsgs)
        if(rawmsgs != null && rawmsgs.length > 0) {
            let records = rawmsgs[0].getRecords();
            let result = records[0].getPayload();
            let data = plus.android.newObject("java.lang.String", result);
            // 写入vuex
            store.commit('setNfcReadTxt', data);
            toast('NFC 数据:' + data);
            console.log('NFC 数据:',data);
            readResult = data;
        }else{
            toast('没有读取到数据');
        }
    },
    byteArrayToHexString: function (inarray) { // 将字节数组转换为字符串  
        let i, j, inn;  
        let hex = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"];  
        let out = "";  
        
        for(j = 0; j < inarray.length; ++j) {
            inn = inarray[j] & 0xff;  
            i = (inn >>> 4) & 0x0f;  
            out += hex[i];  
            i = inn & 0x0f;  
            out += hex[i];  
        }  
        return out;  
    },
    writeData: function () { // 更改写状态
        if(noNFC){
            toast('请检查设备是否支持并开启 NFC 功能!');
            return;
        }
        // 轮询条件
        readyWriteData = true;
        toast('请将NFC标签靠近!');
    },
    readData: function () { // 更改读状态
        if(noNFC){
            toast('请检查设备是否支持并开启 NFC 功能!');
            return;
        }
        // 轮询条件
        readyRead = true;
        toast('请将NFC标签靠近!');
    },
    // close: function(){
        
    // },
    setTxt: function(txt){
        if(noNFC){
            toast('请检查设备是否支持并开启 NFC 功能!');
            return;
        }
        text = txt;
    }
}
function toast(content){
    uni.showToast({
        title: content,
        icon: 'none'
    })
}

3.页面引用调用

<template>
    <view class="nfc">
        <nav-bar title="NFC模板" ></nav-bar>
        <textarea class="txtarea" disabled :value="$store.getters.nfcreadtxt" placeholder="这是读取到的nfc的数据"/>
        <button class="btn" @tap="read()">读取NFC</button>
        <textarea class="txtarea" v-model="writeTxt" maxlength="124" placeholder="这是输入写入的nfc的数据"/>
        <button class="btn" @tap="write()">写入NFC</button>
    </view>
</template>

<script>
    // nfc 输入最大数字长度为124位,文字为41位
    // 如果需要写入读取之后的回调,可以使用mixins混入read-write-nfc.js
    import NavBar from '../../common/components/navbar/NavBar.vue'
    import nfctest from "@/common/js/nfc/read-write-nfc.js"
    export default {
        data() {
            return {
                writeTxt:''
            }
        },
        components:{
            NavBar
        },
        mounted() {
        },
        onLoad() {
            // 开启nfc监听
            nfctest.listenNFCStatus();
        },
        methods: {
            read(){
               // 调用 js 文件里面的方法
                nfctest.readData();
            },
            write(){
               // 调用 js 文件里面的方法
                nfctest.setTxt(this.writeTxt);
                nfctest.writeData();
            },
        }
    }
</script>

<style scoped lang="less">
    .nfc{
        padding: 20rpx;
        .txt{
            height: 240rpx;
            line-height: 50rpx;
            font-size: 32rpx;
        }
        .txtarea{
            width: 100%;
            min-height: 240rpx;
            border: 1px solid #f0f0f0;
        }
        .btn{
            border: none;
            background-color: #1b85e9;
            color: #fff;
            margin: 20rpx 0;
        }
    }
</style>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uniapp nfc读写 的相关文章

随机推荐

  • Cmake 中 file、message和add_executable解析

    file 为cmake中文件操作时用的语句 比如文件的创建 读写 等操作都是通过file来操作的 GLOB file GLOB variable RELATIVE path FOLLOW SYMLINKS globbing expressi
  • DVWA靶场下的sql注入之文件读写

    DVWA的安装配置在我上一篇文章上写过了 不知道的可以去看看 这里直接讲sql注入如何获得文件读写权限 sql注入读写的根本条件 1 数据库用户得是高权限用户 root 2 数据库下的secure file priv不是null 如果是也可
  • 文档在线预览(三)使用js前端实现word、excel、pdf、ppt 在线预览

    关于实现文档在线预览的做法 之前文章提到了的两种实现方式 1 通过将文档转成图片 详见 文档在线预览 一 通过将txt word pdf转成图片实现在线预览功能 2 将文档转成html 详见 文档在线预览 二 word pdf文件转html
  • 运放自激振荡的补偿

    运放的相位补偿 为了让运放能够正常工作 电路中常在输入与输出之间加一相位补偿电容 1 关于补偿电容 理论计算有是有的 但是到了设计成熟阶段好象大部分人都是凭借以前的调试经验了 一般对于电容大小的取值要考虑到系统的频响 简单点说加的电容越大
  • 职场工作与生活

    序言 和很多在CSDN的博主一样 大家在工作之后就很少或者是不再回到CSDN 确实自己也一年多没上了 因为可能当初大家在这就是为了记录和分享当初自己学习技术的东西 而大家走出象牙塔开始工作后 发生了很大的转变 在国内大多数搞技术的工作要求保
  • Beam数据流水线——Pipeline

    目录 Beam简介 基本概念 数据流水线 Beam数据流水线的应用 Beam数据流水线的处理模型 Beam数据流水线的错误处理 单Transform错误处理 多步骤Transform错误处理 Beam简介 Apache Beam 是Goog
  • 工厂的进化

    本文从一个简单示例的需求不断衍化过程 来分析理解简单工厂 工厂方法 抽象工厂模式 首先看一下初始示例 public interface Car public void drive public class BenzCar implement
  • js 实现刷新页面 保留当前tab切换状态

    div class mes tab div class tab tit flexbetween span 报考指南 span span 考研院校 span span 考研专业 span span 备考资料 span span 复试调剂 sp
  • ImportError: No module named typing

    python版本 2 7 错误 使用pip时出现该错误 Traceback most recent call last File C Python27 Scripts pip script py line 9 in load entry p
  • iframe如何发送请求_Vue 中使用 Iframe 踩坑记

    背景 创业项目使用的 Vue 开发前端 最近在开发的一个需求涉及到了 Iframe 的使用 为了让父子页面能够正常通信 头都搞大了 不过最终是解决了问题 写篇文章记录下 利人利己 难点 之前没有在 Vue 中使用过 Iframe 网上的相关
  • 【环境搭建】Docker上搭建sqli-labs漏洞环境

    目录 1 sqli labs简介 2 Docker搭建sqli labs 3 总结 参考文献 1 sqli labs简介 sq Ii labs是一款学习SQL注入的开源平台 共有75种不同类型的注入 官方介绍如下 SQLI LABS is
  • 基于VMD-SSA-LSTM的多维时序光伏功率预测

    目录 1 主要内容 变分模态分解 VMD 麻雀搜索算法SSA 长短期记忆网络LSTM 2 部分代码 3 程序结果 4 下载链接 1 主要内容 之前分享了预测的程序基于LSTM的负荷和可再生能源出力预测 核心部分复现 该程序预测效果比较好 并
  • RT-Thread uart2串口dma idle接收不断帧

    硬件STM32F407 IDE使用RT Thread Studio uart2串口使用这两个引脚 功能 IO端口 UART2 TX PA2 UART2 RX PA3 UART2 DMA接收配置 先使能DMA接收 RX缓冲区可以稍微调大些 b
  • Vuetify笔记(5):data-tables组件

    v data table 用于显示表格数据 功能包括排序 搜索 分页 行内编辑 头部提示以及行选择 而我们在实际应用中使用最多的就是服务端分页和排序 如果你从后台加载数据 并希望显示结果之前进行分页和排序 你可以使用 total items
  • 对象的构造和析构

    对象的构造和析构 1 对象的初始化和清理 构造函数 和 析构函数 被编译器自动调用完成对象初始化和对象清理工作 2 构造函数 和 析构函数 构造函数写法 与类名相同 没有返回值 不写void 可以有参数 可以发生重载 构造函数由编译器自动调
  • 神经网络学习——图像篡改

    记录 这是课堂上做的一个关于图像篡改识别的题目 因为前后花的时间比较多 虽然最后实现的效果也不怎么行 但是这个过程踩了很多坑 这里记录一下 文章目录 记录 前提 题目分析 网络搭建 依赖包 数据读取处理 网络搭建 训练参数 预测函数 模型保
  • linux——read和write函数实现cp、用户级缓冲预读入缓冲的简单认识

    用read和write实现cp 1 注意头文件 2 fd1是源文件 传入参数中的第一个 fd2是目标文件 传入参数中的第二个 要写入的文件至少可写 如果没有当前文件就创建文件并设置权限 如果已经有文件就截断为0再重新写 3 定义一个缓冲区
  • vue2和vue3的响应式原理

    vue2和vue3的响应式原理 vue2 的响应式 vue3 的响应式 vue2 的响应式 使用 Object 构造函数上 defineProperty 实现 存在的问题 对象 新增的属性没有响应式 数组 部分操作没有响应式 解决办法 1
  • [推荐系统] 1. 深度学习与推荐系统

    文章目录 1 推荐系统 1 1 推荐系统的作用和意义 1 2 推荐系统架构 1 2 1 推荐系统的逻辑架构 1 2 2 推荐系统的技术架构 2 前置知识 2 1 传统推荐模型的演化 2 2 协同过滤 2 2 1 概述 2 2 2 用户相似度
  • uniapp nfc读写

    1 先添加权限