【发布时间】:2020-12-11 17:36:05
【问题描述】:
我已经为此苦苦挣扎了几天,我需要帮助。我想用我的应用程序读取 HCE 和 beams,它们独立工作正常,但是当我想将它们放在一起时,onTagDiscovered 总是被调用,并且当它来自 beams 时永远不会获得任何信息。
我认为这是可能的,但我对此很陌生,所以我可能正在做一些疯狂的事情。
代码如下:
class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback {
private var command: ByteArray? = null
private lateinit var mNFCAdapter: NfcAdapter
companion object {
val TAG: String = com.solano.nfc.isodep.reader.MainActivity::class.java.name
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d(TAG, "onCreate")
setContentView(R.layout.activity_main)
mNFCAdapter = NfcAdapter.getDefaultAdapter(this)
command = Utils.hexStringToByteArray("00A4040007A220100247100100")
}
override fun onResume() {
super.onResume()
Log.d(TAG, "onResume")
intent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP
val pendingIntent =
PendingIntent.getActivity(this, 0, intent, 0)
val filters = arrayOfNulls<IntentFilter>(1)
val techList =
arrayOf<Array<String>>()
// Filter for nfc tag discovery
// Filter for nfc tag discovery
filters[0] = IntentFilter()
filters[0]!!.addAction(NfcAdapter.ACTION_NDEF_DISCOVERED)
filters[0]!!.addCategory(Intent.CATEGORY_DEFAULT)
filters[0]!!.addDataType("application/vnd.com.example.myapp")
if(::mNFCAdapter.isInitialized){
val flags = NfcAdapter.FLAG_READER_NFC_A or NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK
mNFCAdapter.enableReaderMode(this, this, flags, intent.extras)
mNFCAdapter.enableForegroundDispatch(this, pendingIntent, filters, techList)
}
}
override fun onPause() {
super.onPause()
Log.d(TAG, "onPause")
mNFCAdapter.disableReaderMode(this)
mNFCAdapter.disableForegroundDispatch(this)
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
Log.d(TAG, "onNewIntent ${intent!!.action}")
handleIntents(intent)
}
private fun handleIntents(intent: Intent?) {
if (true) {
val rawMessages = intent!!.getParcelableArrayExtra(
NfcAdapter.EXTRA_NDEF_MESSAGES
)
val message =
rawMessages!![0] as NdefMessage // only one message transferred
tvMain.text = String(message.records[0].payload)
} else tvMain.text = "Waiting for NDEF Message"
}
override fun onTagDiscovered(tag: Tag?) {
Log.d(TAG, "onTagDiscovered")
try{
val nDef = Ndef.get(tag)
val isoDep = IsoDep.get(tag)
if (nDef != null) {
Log.d(TAG, "NDEF is supported")
} else if (isoDep != null) {
Log.d(TAG, "ISO-Dep is supported")
if(!isoDep.isConnected){
isoDep.connect()
val response = isoDep.transceive(command)
val status = Utils.getStatus(response!!)
if(status == "9000") {
Log.d(TAG, "OK\n${String(response)}")
} else {
Log.d(TAG, "WTF Status code: $status")
}
isoDep.close()
}
}
} catch (ex: Exception) {
Log.d(TAG, ex.message)
}
}
}
【问题讨论】:
标签: android nfc android-beam