UTS 开启NFC读取模式

2024-01-03  本文已影响0人  空腹无才

基于安卓

import NfcAdapter from 'android.nfc.NfcAdapter';
import Tag from "android.nfc.Tag"
import Ndef from "android.nfc.tech.Ndef";


let nfcAdapter : NfcAdapter | null = null;
let callbacks : ((data: string) => void) | null = null;

/**
  这里会提示 类型“ReaderCallback”不是构造函数类型。
  不用管
*/
class temps extends NfcAdapter.ReaderCallback {
    constructor() {
        super()
    }

        /**
          这里会提示     此成员不能有 "override" 修饰符,因为它的包含类 "temps" 不扩展其他类。
          不用管
      */
    override onTagDiscovered(tag : Tag) {
        const byteArray = tag!.getId();
        const result = (byteArray[0] & 0xFF) << 24 |
                     (byteArray[1] & 0xFF) << 16 |
                     (byteArray[2] & 0xFF) << 8 |
                     (byteArray[3] & 0xFF);
        
        // 调用返回值
        (callbacks as (data: string) => void)(result.toString())
        setTimeout(() => {  // 用于解决低版本安卓  enableReaderMode 无法重复启动问题
                  disableNFCReaderMode();
       }, 1000)
    }
}

export function disableNFCReaderMode() {
    // 禁用NFC读取器模式
    if(nfcAdapter !== null) {
        console.log("关闭NFC读取器模式");
        (nfcAdapter as NfcAdapter)!.disableReaderMode(UTSAndroid.getUniActivity());
        nfcAdapter = null;
    }
    
    if(callbacks !== null) {
        callbacks = null;
    }
}

export function readNFC(callback: (data: string) => void) {
    const context = UTSAndroid.getAppContext();

    nfcAdapter = NfcAdapter.getDefaultAdapter(context);
    
    try{
        callbacks = callback;
        
        (nfcAdapter as NfcAdapter)!.enableReaderMode(UTSAndroid.getUniActivity()!, new temps(), (
            NfcAdapter.FLAG_READER_NFC_A |
            NfcAdapter.FLAG_READER_NFC_B |
            NfcAdapter.FLAG_READER_NFC_F |
            NfcAdapter.FLAG_READER_NFC_V |
            NfcAdapter.FLAG_READER_NFC_BARCODE
        ), null)
        
        
        uni.showToast({
            title: "启动NFC读取器模式",
            icon: "none"
        })
    }catch(e){
        uni.showToast({
            title: "NFC启动失败",
            icon: "error"
        })
    }

}
上一篇下一篇

猜你喜欢

热点阅读