问题描述:在Android Kotlin应用程序中,无法读取NFC标签。
解决方法:
// 获取NFC适配器
val nfcAdapter = NfcAdapter.getDefaultAdapter(this)
// 检查设备是否支持NFC
if (nfcAdapter == null) {
// NFC不可用
return
}
// 检查NFC是否已启用
if (!nfcAdapter.isEnabled) {
// NFC未启用,可以在此处提示用户启用NFC
}
// 创建一个PendingIntent,用于处理NFC事件
val pendingIntent = PendingIntent.getActivity(
this, 0,
Intent(this, javaClass).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0
)
// 创建一个IntentFilter,用于过滤NDEF消息
val intentFilter = IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED)
// 为IntentFilter添加一个数据方案
intentFilter.addDataScheme("http")
// 创建一个IntentFilter数组
val intentFiltersArray = arrayOf(intentFilter)
// 创建一个String数组,用于存储需要处理的NFC技术列表
val techListsArray = arrayOf(arrayOf(NfcF::class.java.name))
// 注册NFC事件
nfcAdapter.enableForegroundDispatch(
this, pendingIntent, intentFiltersArray,
techListsArray
)
override fun onResume() {
super.onResume()
// 在Activity恢复时启用前台调度
val nfcAdapter = NfcAdapter.getDefaultAdapter(this)
nfcAdapter?.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray)
}
override fun onPause() {
super.onPause()
// 在Activity暂停时禁用前台调度
val nfcAdapter = NfcAdapter.getDefaultAdapter(this)
nfcAdapter?.disableForegroundDispatch(this)
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
// 处理新的NFC Intent
if (intent != null && NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) {
val rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)
if (rawMessages != null) {
// 处理NDEF消息
val messages = arrayOfNulls(rawMessages.size)
for (i in rawMessages.indices) {
messages[i] = rawMessages[i] as NdefMessage
}
// 在messages数组中处理NDEF消息
}
}
}
请注意,以上代码仅提供了一个基本的框架,用于处理NFC事件。实际上,您还需要根据您的应用程序的需求进行适当的处理和解析NFC标签的数据。