【问题标题】:How to read NFC Beam and tags?如何读取 NFC Beam 和标签?
【发布时间】: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


    【解决方案1】:

    我不确定您为什么同时使用 enableReaderModeenableForegroundDispatch,因为它们只是不同的 API 来做同样的事情(读取标签)但 enableReaderMode 禁用已弃用的 Android Beam(如果可用)。

    https://developer.android.com/reference/android/nfc/NfcAdapter#enableReaderMode(android.app.Activity,%20android.nfc.NfcAdapter.ReaderCallback,%20int,%20android.os.Bundle)

    在此模式下,NFC 控制器将仅充当 NFC 标签读取器/写入器,因此禁用此设备上 NFC 适配器的任何点对点 (Android Beam) 和卡模拟模式。

    我只会使用enableForegroundDispatch

    【讨论】:

    • 嗯,这就是我做错了。但是,我开始这样做是因为我试图读取仿真卡并且从中得到任何东西。
    • 真正同时阅读 HCE 和 Beam 很复杂,您还需要处理更高版本的 Android 中没有 Beam 的地方。展望未来,我将忽略 Beam 并只关注 HCE(enableReaderMode 更容易,因为如果可用,它会禁用 Beam)。这完全取决于您是否也在对其他设备进行编程。
    • 好吧,当我尝试读取模拟卡和后来的标签时,我才开始对此感兴趣。 HCE 工作正常,但另一个不是。后来我发现有几个应用程序可以两者兼得。我真的很想了解他们是如何做到的。我有一个 ISO 标签,我正在使用一个使用 beam 的应用程序和另一个使用 HCE 的应用程序。我唯一要建立的是诚实的读者
    • 我只是认为尝试了解他们的工作方式是浪费精力,因为 Beam 已从 Android 10 及更高版本中删除。有一种设备可能无法使用它,并且随着更多设备是 Android 10 或更高版本,这种可能性只会随着时间的推移而增加。没有简单的方法真正处理发送设备正在尝试 Beam 但接收方不支持 Beam 的情况,发送方只会将其视为范围内还没有设备并一直等待直到有设备在范围内。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-19
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多