MST

星途 面试题库

面试题:Kotlin NFC开发中如何处理不同类型的NFC标签

在Kotlin进行NFC近场通信开发时,NFC标签存在多种类型,如ISO 14443 A/B、ISO 15693等。请阐述如何在Kotlin代码中识别并处理这些不同类型的NFC标签,包括相关的API调用和基本的处理逻辑。
41.6万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试
  1. 识别NFC标签类型
    • 在Kotlin的NFC开发中,首先需要注册NFC相关的Intent过滤器,以便在设备检测到NFC标签时,应用能够接收到通知。在AndroidManifest.xml文件中注册如下:
    <intent - filter>
        <action android:name="android.nfc.action.TECH_DISCOVERED" />
    </intent - filter>
    <meta - data
        android:name="android.nfc.action.TECH_DISCOVERED"
        android:resource="@xml/nfc_tech_filter" />
    
    • res/xml/nfc_tech_filter.xml文件中定义支持的NFC技术类型,例如:
    <resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
        <tech - list>
            <tech>android.nfc.tech.IsoDep</tech>
            <tech>android.nfc.tech.MifareClassic</tech>
            <tech>android.nfc.tech.MifareUltralight</tech>
            <tech>android.nfc.tech.Ndef</tech>
            <tech>android.nfc.tech.NdefFormatable</tech>
            <tech>android.nfc.tech.NfcA</tech>
            <tech>android.nfc.tech.NfcB</tech>
            <tech>android.nfc.tech.NfcF</tech>
            <tech>android.nfc.tech.NfcV</tech>
        </tech - list>
    </resources>
    
    • 在Activity中获取NFC标签信息,在onNewIntent方法中:
    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        val tag = intent.getParcelableExtra<Tag>(NfcAdapter.EXTRA_TAG)
        tag?.let {
            val techList = it.techList
            for (tech in techList) {
                when (tech) {
                    "android.nfc.tech.NfcA" -> {
                        // 处理ISO 14443 A类型标签
                        val nfcA = NfcA.get(it)
                        try {
                            nfcA.connect()
                            // 进行数据读取等操作
                            nfcA.close()
                        } catch (e: IOException) {
                            e.printStackTrace()
                        }
                    }
                    "android.nfc.tech.NfcB" -> {
                        // 处理ISO 14443 B类型标签
                        val nfcB = NfcB.get(it)
                        try {
                            nfcB.connect()
                            // 进行数据读取等操作
                            nfcB.close()
                        } catch (e: IOException) {
                            e.printStackTrace()
                        }
                    }
                    "android.nfc.tech.NfcV" -> {
                        // 处理ISO 15693类型标签
                        val nfcV = NfcV.get(it)
                        try {
                            nfcV.connect()
                            // 进行数据读取等操作
                            nfcV.close()
                        } catch (e: IOException) {
                            e.printStackTrace()
                        }
                    }
                    // 其他类型标签的处理类似
                }
            }
        }
    }
    
  2. 基本处理逻辑
    • 连接标签:对于不同类型的NFC标签,通过get方法获取相应的NFC技术类实例后,调用connect方法连接标签。例如对于NfcA标签:
    val nfcA = NfcA.get(tag)
    nfcA.connect()
    
    • 读取数据:连接成功后,可以根据标签类型进行数据读取操作。例如对于支持NDEF格式的标签:
    val ndef = Ndef.get(tag)
    ndef.connect()
    val ndefMessage = ndef.cachedNdefMessage
    if (ndefMessage != null) {
        val records = ndefMessage.records
        for (record in records) {
            val payload = record.payload
            // 处理读取到的数据
        }
    }
    ndef.close()
    
    • 写入数据:同样,连接成功后,如果标签支持写入操作,可以进行数据写入。例如对于NDEF格式标签:
    val ndef = Ndef.get(tag)
    ndef.connect()
    val ndefRecord = NdefRecord.createTextRecord(null, "Hello, NFC!")
    val ndefMessage = NdefMessage(arrayOf(ndefRecord))
    ndef.writeNdefMessage(ndefMessage)
    ndef.close()
    
    • 关闭连接:在完成对NFC标签的操作后,务必调用相应技术类的close方法关闭连接,以释放资源。例如:
    nfcA.close()
    

需要注意的是,NFC开发还涉及到权限申请,需要在AndroidManifest.xml文件中添加如下权限:

<uses - permission android:name="android.permission.NFC" />
<uses - feature android:name="android.hardware.nfc" android:required="true" />