android - 如何将文本从 nfc 发送到另一个 android 设备?
问题描述
我一直在寻找大约两个星期,但我找不到解决方案。我尝试使用HostNfcFService进行投射并使用onTagDiscovered上的NfcAdapter.ReaderCallback进行阅读,但找不到获取文本的方法。
AndroidBeam 已弃用到 android10。
这是我模拟 nfc 标签的服务
class MyHostNfcFService : HostNfcFService() {
override fun processNfcFPacket(commandPacket: ByteArray, extras: Bundle?): ByteArray {
val msg = "Hello World!!".toByteArray()
val buffer = ByteBuffer.allocate(msg.size + 2)
buffer.put((msg.size + 2).toByte())
buffer.put(0.toByte())
buffer.put(msg)
return buffer.array()
}
override fun onDeactivated(reason: Int) {
}
在activity和manifest中这个服务的初始化是正确的。另一方面,我展示了阅读它的方式。
类 ReaderFragment : Fragment(), ReaderCallback{
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val adapter = NfcAdapter.getDefaultAdapter(activity)
adapter.enableReaderMode(
activity,
this,
NfcAdapter.FLAG_READER_NFC_A or NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK,
null)
}
override fun onResume() {
Log.d(TAG, "onResume: ")
super.onResume()
val adapter = NfcAdapter.getDefaultAdapter(activity)
adapter.enableReaderMode(
activity,
this,
NfcAdapter.FLAG_READER_NFC_A or NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK,
null)
}
override fun onPause() {
Log.d(TAG, "onPause: ")
super.onPause()
NfcAdapter.getDefaultAdapter(activity)
.disableReaderMode(activity)
}
override fun onTagDiscovered(tag: Tag) {
logd(TAG, "onTagDiscovered: ")
val nfc = IsoDep.get(tag)
if (nfc != null) {
logd(TAG, nfc.tag.toString())
try {
nfc.connect()
val res = nfc.transceive(MyHostApduService.SELECT)
logd(TAG, String(res, Charset.forName("UTF-8")))
} catch (e: IOException) {
e.printStackTrace()
}
}
}
}
我打电话给nfc.transceive(MyHostApduService.SELECT)这是什么。
class MyHostApduService : HostApduService() {
override fun processCommandApdu(commandApdu: ByteArray, extras: Bundle?): ByteArray {
return commandApdu;
}
override fun onDeactivated(reason: Int) {
Log.i(TAG, "onDeactivated, reason=" + reason)
}
companion object {
val SELECT = byteArrayOf(
0x00, 0xA4.toByte(), 0x04, 0x00,
0x07,
0xF0.toByte(), 0x39, 0x41, 0x48, 0x14, 0x81.toByte(), 0x00,
0x00
)
}
}
我处理 commandApdu 但我没有得到我想要的 Hello World 。
解决方案
推荐阅读
- java - 在文件资源管理器中单击其相关文件时如何打开应用程序?
- google-cloud-platform - GCE Windows 启动脚本
- android - 通过单击android studio中的按钮添加新项目时,自定义列表视图在它们之间显示大空间
- azure - Azure 存储 SAS 密钥在到期日期之前变得陈旧
- python - 如何在 Clojure 的 while 循环中应用嵌套的 for 循环?
- python-3.x - Python 请求并行发出但按顺序接收响应
- postgresql - 错误:“TABLE”第 5 行或附近的语法错误:SELECT * FROM TABLE(str_common_utils.splitstr(p_...)
- javascript - ReactJS DataCloneError:无法在“历史”上执行“pushState”:无法克隆 MouseEvent 对象
- google-oauth - 使用 Cloud Identity 签署文档
- java-8 - 为可选设置默认值的更好方法是什么