当前位置:   article > 正文

Android NFC开发之NdefFormatable格式化及解决Ndef.get返回空的问题

ndefformatable

Android NFC开发之读取NDEF格式数据这篇文章中我们介绍了如何写入读取NDEF格式的数据

在如下代码中有时候用其他一些NFC标签会抛出NullPointerException异常,Ndef.get方法返回null

  1. @Override
  2. public void onNewIntent(Intent intent) {
  3. //1.获取Tag对象
  4. Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
  5. //2.获取Ndef的实例
  6. Ndef ndef = Ndef.get(detectedTag);
  7. mTagText = "type:" + ndef.getType();
  8. mTagText += "\nmaxsize:" + ndef.getMaxSize() + "bytes";
  9. readNfcTag(intent);
  10. mContent.setText(mTagText);
  11. }

经排查发现测试的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对象后还需判断是否为空再进行读写操作

  1. @Override
  2. public void onNewIntent(Intent intent) {
  3. //1.获取Tag对象
  4. Tag detectedTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
  5. //2.获取Ndef的实例
  6. Ndef ndef = Ndef.get(detectedTag);
  7. if(ndef != null) {
  8. mTagText = "type:" + ndef.getType();
  9. mTagText += "\nmaxsize:" + ndef.getMaxSize() + "bytes";
  10. readNfcTag(intent);
  11. mContent.setText(mTagText);
  12. }
  13. }

格式化

写入数据的时候也要先判断是什么格式,若是Ndef格式可以直接写入数据,若是NdefFormatable数据,则需先执行格式化操作

原来写入的代码如下

  1. public static boolean writeTag(NdefMessage ndefMessage, Tag tag) {
  2. try {
  3. Ndef ndef = Ndef.get(tag);
  4. ndef.connect();
  5. ndef.writeNdefMessage(ndefMessage);
  6. return true;
  7. } catch (Exception e) {
  8. }
  9. return false;
  10. }

修改后如下所示

  1. public static boolean writeTag(NdefMessage ndefMessage, Tag tag) {
  2. Ndef ndef = Ndef.get(tag);
  3. NdefFormatable ndefFormatable = NdefFormatable.get(tag);
  4. try {
  5. if (ndef != null) {
  6. ndef.connect();
  7. ndef.writeNdefMessage(ndefMessage);
  8. return true;
  9. } else if(ndefFormatable != null) {
  10. ndefFormatable.connect();
  11. ndefFormatable.format(ndefMessage);
  12. return true;
  13. }
  14. } catch (IOException e) {
  15. e.printStackTrace();
  16. } catch (FormatException e) {
  17. e.printStackTrace();
  18. }
  19. return false;
  20. }

NdefFormatable格式标签经格式化后会变成Ndef格式,可以通过tag.toString输出看下,可以看到原来的标签已变成Ndef格式

TAG: Tech [android.nfc.tech.NfcV, android.nfc.tech.Ndef]

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/314842
推荐阅读
相关标签
  

闽ICP备14008679号