How to transfer plain text via Android NFC?

烂漫一生 提交于 2021-02-11 17:40:53

问题


I am new to Android NFC and developing NFC application in android. My idea is Device A need to send a plain text to Device B. Is it possible in Android NFC? I just tried with Tag Dispatcher (enableForegroundDispatch , disableForegroundDispatch) on both Reader and Writer. My Reader side code is :

nfcAdapter.enableForegroundDispatch(this, pendingIntent, intentFilters, techList)
override fun onNewIntent(intent: Intent?) {
intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMessages ->
            val messages: List<NdefMessage> = rawMessages.map { it as NdefMessage }

            for (message in messages) {
                for (record in message.records) {
                    println(" ${record.toString()}")
                }
            }
        }
}

My Writer side code is:

nfcAdapter.enableForegroundDispatch(
        this, pendingIntent, intentFilters, techList)
override fun onNewIntent(intent: Intent?) {
if (action.equals(NfcAdapter.EXTRA_TAG)) {
        val tagFromIntent = intent.getParcelableExtra<Tag>(NfcAdapter.EXTRA_TAG)
        if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(action)
            || NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)
        ) {
            println("testing=============== tag discovered ")
            writeNdefMessage(tagFromIntent!!, "This is my first app")
        }
    }}

private fun writeNdefMessage(tag: Tag, message: String) {
    val record: NdefRecord = newTextRecord(message, Locale.ENGLISH, true)!!
    val ndefMessage = NdefMessage(arrayOf(record))
    try {
        if (isExist(tag.techList, NdefFormatable::class.java.name)) {
            val ndefFormatable = NdefFormatable.get(tag)
            try {
                if (!ndefFormatable.isConnected) {
                    ndefFormatable.connect()
                }
                ndefFormatable.format(ndefMessage)
            } finally {
                ndefFormatable.close()
            }
        } else if (isExist(tag.techList, Ndef::class.java.name)) {
            val ndef = Ndef.get(tag)
            try {
                if (!ndef.isConnected) {
                    ndef.connect()
                }
                if (ndef.isWritable) {
                    ndef.writeNdefMessage(ndefMessage)
                }
            } finally {
                ndef.close()
            }
        }
    } catch (e: FormatException) {
        println("Format failed exception")
    } catch (e: IOException) {
        println("")
    }
}

Application is launched when I scan the Tag (via AndroidManifest.xml details). But I am not able to send plain text via NFC. I don't know what I did wrong. I don't know whether the approach is right or wrong. Please help me to proceed this.

Thanks in advance.


回答1:


So in Android peer to peer NFC (Device to Device) also called Android Beam has been deprecated as of API 29

See https://developer.android.com/reference/android/nfc/NfcAdapter#setNdefPushMessage(android.nfc.NdefMessage,%20android.app.Activity,%20android.app.Activity...)

You are using the wrong methods to use Android Beam in older Android Versions. See https://developer.android.com/guide/topics/connectivity/nfc/nfc#p2p for more details of actually how to use it. (You are using methods for writing to a NFC card not another Device)

Note Peer to Peer via NFC is Android only, iOS does not support it and it is depreciated in favour of Bluetooth/Wifi Direct

Note that it is still possible to have one Android Device use Host Card Emulation to Emulate a Type 4 NFC card with an NDEF messages on it but this is quite complicated to achieve.

Update:

Link to Host Card Emulation https://developer.android.com/guide/topics/connectivity/nfc/hce and Type 4 card spec http://apps4android.org/nfc-specifications/NFCForum-TS-Type-4-Tag_2.0.pdf



来源:https://stackoverflow.com/questions/60812818/how-to-transfer-plain-text-via-android-nfc

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!