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]

 

 

 

posted @ 2019-09-10 15:04  野猿新一  阅读(172)  评论(0编辑  收藏  举报