Android将自动读取NFC标签的NDEF消息,为了处理它基于Android的应用程序记录基于第一NDEF记录
- 开始注册活动,
- 启动应用程序(AAR )在NDEF消息中的任何地方。
为了让您的活动开始,并有Android的通过预读取NDEF消息,你可以使用NDEF_DISCOVERED
意图过滤器:
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="vnd.android.nfc"
android:host="ext"
android:pathPrefix="/example.com:mycustomtype"/>
</intent-filter>
从活动中
然后,您可以处理该NDEF消息:
public void onResume() {
super.onResume();
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
NdefMessage[] msgs = null;
Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMsgs != null) {
msgs = new NdefMessage[rawMsgs.length];
for (int i = 0; i < rawMsgs.length; ++i) {
msgs[i] = (NdefMessage)rawMsgs[i];
}
}
if ((msgs != null) && (msgs.length > 0)) {
NdefRecord[] records = msgs[0].getRecords();
NdefRecord firstRecord = records[0];
byte[] payloadData = firstRecord.getPayload();
// do something with the payload (data passed through your NDEF record)
// or process remaining NDEF message
}
}
}
请注意,onResume()
会在您的活动成为前台活动时运行。因此,它可能会在同一个标签上运行多次。因此,您可以使用另一种生命周期方法,或者采取一些预防措施,避免多次解析消息。
如果您想要放弃所有进一步的NFC事件,一旦您的活动开放,您可以按照我在Android app enable NFC only for one Activity的回应中描述的方法进行操作。因此,你的前景调度寄存器(这使您的活动优先接收NFC事件,然后你可以简单地下降这些事件。
public void onResume() {
super.onResume();
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
nfcAdapter.enableForegroundDispatch(this, pendingIntent, null, null);
}
public void onPause() {
super.onPause();
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcAdapter.disableForegroundDispatch(this);
}
public void onNewIntent(Intent intent) {
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
// drop NFC events
}
}
最后,创建NDEF消息的NFC标签,你会做这样的事情:
byte[] payload = ... // generate your data payload
NdefMessage msg = new NdefMessage(
NdefRecord.createExternal("example.com", "mycustomtype", payload)
)
如果你想确保只有您的应用程序是通过这个标签开始(或者如果没有安装Play商店打开你的应用程序),你还可以添加一个AAR:
NdefMessage msg = new NdefMessage(
NdefRecord.createExternal("example.com", "mycustomtype", payload),
NdefRecord.createApplicationRecord("com.example.your.app.package")
)
应用程序的数据来自哪里?从NFC标签或其他地方? – corvairjo
您是否阅读过http://developer.android.com/guide/topics/connectivity/nfc/nfc.html? –
corvairjo - 数据将来自NFC标签。所以我想NFC标签启动应用程序(这很容易),然后传入一个字符串(这是我觉得很困惑)。 –