关于读NFC,这里已经是第三篇了。这篇主要是跟第二篇做一个比较。
onResume的不同写法
方法一
详细看我的第二篇关于NFC读卡的内容
@Override
protected void onResume() {
super.onResume();
nfcAdapter.enableReaderMode(this, new NfcAdapter.ReaderCallback() {
@Override
public void onTagDiscovered(Tag tag) {
byte[] byteArray=tag.getId();
long result = ((long) byteArray[0] & 0xFF) << 24 |
((long) byteArray[1] & 0xFF) << 16 |
((long) byteArray[2] & 0xFF) << 8 |
((long) byteArray[3] & 0xFF);
Log.i("taginfo:",String.valueOf(result));
}
},(NfcAdapter.FLAG_READER_NFC_A |
NfcAdapter.FLAG_READER_NFC_B |
NfcAdapter.FLAG_READER_NFC_F |
NfcAdapter.FLAG_READER_NFC_V |
NfcAdapter.FLAG_READER_NFC_BARCODE),null);
}
方法二
这是网上经常搜到的,采用PendingIntent 延后执行的方式。
@Override
protected void onResume() {
super.onResume();
Intent intent=new Intent(this,MainActivity.class);
intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,0);
if (nfcAdapter != null) {
nfcAdapter.enableForegroundDispatch(this, pendingIntent,null,null);
}
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
// 处理NDEF格式的NFC数据
Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (rawMessages != null) {
NdefMessage[] messages = new NdefMessage[rawMessages.length];
for (int i = 0; i < rawMessages.length; i++) {
messages[i] = (NdefMessage) rawMessages[i];
}
// 处理NDEF消息
}
}else if(NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
byte[] byteArray=tag.getId();
long result = ((long) byteArray[0] & 0xFF) << 24 |
((long) byteArray[1] & 0xFF) << 16 |
((long) byteArray[2] & 0xFF) << 8 |
((long) byteArray[3] & 0xFF);
Log.i("taginfo:",String.valueOf(result));
// 从tag对象中读取卡的内容
// 例如,对于Mifare Classic卡,你可以使用MifareClassic类来读取卡的内容
//MifareClassic mifareClassic = MifareClassic.get(tag);
// ...
}
}
重要差异
方法一
nfcAdapter.enableReaderMode,直接填写回调函数完成。
方法二
nfcAdapter.enableForegroundDispatch
需要另外在onNewIntent中执行读卡的程序。