Android NFC开发之NdefFormatable格式化及解决Ndef.get返回空的问题
在Android NFC开发之读取NDEF格式数据这篇文章中我们介绍了如何写入读取NDEF格式的数据
在如下代码中有时候用其他一些NFC标签会抛出NullPointerException异常,Ndef.get方法返回null
@Override
public void onNewIntent(Intent intent) {
//1.获取Tag对象
Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
//2.获取Ndef的实例
Ndef ndef = Ndef.get(detectedTag);
mTagText = "type:" + ndef.getType();
mTagText += "\nmaxsize:" + ndef.getMaxSize() + "bytes";
readNfcTag(intent);
mContent.setText(mTagText);
}
经排查发现测试的NFC标签有的不是NDEF格式的,而是NdefFormatable,可以用Tag对象的toString方法打印出来看看
像我测试的这款标签包含两种格式,NfcV和NdefFormatable,而NdefFormatable和Ndef是不一样的
但是NdefFormatable支持格式化成Ndef格式,Android SDK提供了相应的格式化api
TAG: Tech [android.nfc.tech.NfcV, android.nfc.tech.NdefFormatable]
读取
所以在通过Ndef.get方法获取到Ndef对象后还需判断是否为空再进行读写操作
@Override
public void onNewIntent(Intent intent) {
//1.获取Tag对象
Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
//2.获取Ndef的实例
Ndef ndef = Ndef.get(detectedTag);
if(ndef != null) {
mTagText = "type:" + ndef.getType();
mTagText += "\nmaxsize:" + ndef.getMaxSize() + "bytes";
readNfcTag(intent);
mContent.setText(mTagText);
}
}
格式化
写入数据的时候也要先判断是什么格式,若是Ndef格式可以直接写入数据,若是NdefFormatable数据,则需先执行格式化操作
原来写入的代码如下
public static boolean writeTag(NdefMessage ndefMessage, Tag tag) {
try {
Ndef ndef = Ndef.get(tag);
ndef.connect();
ndef.writeNdefMessage(ndefMessage);
return true;
} catch (Exception e) {
}
return false;
}
修改后如下所示
public static boolean writeTag(NdefMessage ndefMessage, Tag tag) {
Ndef ndef = Ndef.get(tag);
NdefFormatable ndefFormatable = NdefFormatable.get(tag);
try {
if (ndef != null) {
ndef.connect();
ndef.writeNdefMessage(ndefMessage);
return true;
} else if(ndefFormatable != null) {
ndefFormatable.connect();
ndefFormatable.format(ndefMessage);
return true;
}
} catch (IOException e) {
e.printStackTrace();
} catch (FormatException e) {
e.printStackTrace();
}
return false;
}
NdefFormatable格式标签经格式化后会变成Ndef格式,可以通过tag.toString输出看下,可以看到原来的标签已变成Ndef格式
TAG: Tech [android.nfc.tech.NfcV, android.nfc.tech.Ndef]