面试题答案
一键面试- 识别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() } } // 其他类型标签的处理类似 } } } }
- 在Kotlin的NFC开发中,首先需要注册NFC相关的Intent过滤器,以便在设备检测到NFC标签时,应用能够接收到通知。在
- 基本处理逻辑:
- 连接标签:对于不同类型的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标签,通过
需要注意的是,NFC开发还涉及到权限申请,需要在AndroidManifest.xml
文件中添加如下权限:
<uses - permission android:name="android.permission.NFC" />
<uses - feature android:name="android.hardware.nfc" android:required="true" />