临时接到要求,开发一个基于Android智能手表的NFC应用。立刻在网上狂搜索了一番。了解到NFC通讯有 三种方式:读标签、当做标签、互相通讯。根据已有的要求和条件确认为第三种通讯方式。
任务通讯基本都有三个部分组成:基础条件设置、发送、接收。
基础条件设置
无外乎一些权限的申请、一些参数的指定
发送信息:
触发发送
当安装有应用的手机靠近另外一台NFC设备时,发送数据的回调函数将会被调用,应用则会发送出自己的数据:
具体方法为实现CreateNdefMessageCallback接口的createNdefMessage,在此方法内返回一个自定义的NdefMessage对象.
发送结果通知
当数据发送完成后,发送数据完成的回调函数将会被调用,应用在此回调函数内完成一些提示进度方面的操作:
具体方法为实现OnNdefPushCompleteCallback接口的onNdefPushComplete函数.在此函数内写业务操作
接收信息
首先声明
<intent-filter>
//指定可以接收NFC消息
<action
android:name="android.nfc.action.NDEF_DISCOVERED"/>
<category android:name="android.intent.category.DEFAULT"/>
///指定对应程序包
<data android:mimeType="application/vnd.com.example.android.beam"/>
</intent-filter>
然后定义消息接收函数
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
...
if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) {
// Process the messages array.
//从消息里获取tag
val tag: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)
...
}
}
}
信息结构
发送数据组装
new NdefMessage(new NdefRecord[]{})
一次发送一个消息(NdefMessage),
一个消息包含若干个记录(NdefRecord),
一个记录包含四部分:类型枚举,消息类型,占位,消息内容
类型枚举:NF_MIME_MEDIA等
消息类型:和 <intent-filter></intent-filter>里面配置的
<data android:mimeType="application/vnd.com.example.android.beam"/>
相同
占位符:空字节byte[0]
消息内容:二进制数据
接收数据拆解
Parcelable[] rawMsgs = intent
.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
// only one message sent during the beam
NdefMessage msg = (NdefMessage) rawMsgs[0];
// record 0 contains the MIME type, record 1 is the AAR, if present
mInfoText.setText(new String(msg.getRecords()[0].getPayload()));
参考文章
https://developer.android.google.cn/guide/topics/connectivity/nfc?hl=zh-cn
https://developer.android.google.cn/reference/android/nfc/package-summary?hl=zh-cn
网友评论