奇怪地扫描NFC标签时出现IOException

Getting IOException when scanning an NFC tag weirdly

当我正常扫描 NFC 标签时,我的代码工作正常。但是当我奇怪地扫描它时,比如滑动什么的,我可以在控制台中得到这个错误:

W/System.err( 8533): java.io.IOException
W/System.err( 8533):    at android.nfc.tech.BasicTagTechnology.connect(BasicTagTechnology.java:85)
W/System.err( 8533):    at android.nfc.tech.Ndef.connect(Ndef.java:71)
W/System.err( 8533):    at myapp.myapp.MainActivity.onNewIntent(MainActivity.java:171)
W/System.err( 8533):    at android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1213)
W/System.err( 8533):    at android.app.Instrumentation.callActivityOnNewIntent(Instrumentation.java:1225)
W/System.err( 8533):    at android.app.ActivityThread.deliverNewIntents(ActivityThread.java:2610)
W/System.err( 8533):    at android.app.ActivityThread.performNewIntents(ActivityThread.java:2622)
W/System.err( 8533):    at android.app.ActivityThread.handleNewIntent(ActivityThread.java:2631)
W/System.err( 8533):    at android.app.ActivityThread.access00(ActivityThread.java:169)
W/System.err( 8533):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1454)
W/System.err( 8533):    at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err( 8533):    at android.os.Looper.loop(Looper.java:148)
W/System.err( 8533):    at android.app.ActivityThread.main(ActivityThread.java:5554)
W/System.err( 8533):    at java.lang.reflect.Method.invoke(Native Method)
W/System.err( 8533):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:746)
W/System.err( 8533):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)

这是我的 NFC 代码:

ndef.connect();                                                           
NdefMessage ndefMessage = ndef.getNdefMessage();                          
if (ndefMessage != null) {                                                
    String message = new String(ndefMessage.getRecords()[0].getPayload());
    //Log.w(TAG, "readFromNFC:: "+message);                               
    if (mEvents != null){                                                 
        Log.d(TAG, "mEvents aren't null");                                
        mEvents.success(message);                                         
    }                                                                     
} else {                                                                  
    if (mEvents != null){                                                 
        mEvents.error("ERROR", "empty", null);                            
    }                                                                     
}                                                                         
ndef.close();   

这种行为是预期的吗?

这种行为并没有什么奇怪的。

如果 "scan it weirdly" 意味着您扫描标签并在它仍然被访问时将其拉出读取范围(例如,在调用 connect() 之前),那么您应该得到一个 IOException记录 here。您会收到该 IO 异常,因为您尝试访问不再可用的外部设备(NFC 标签)。因此,无法再进行通信,必须中断 IO 操作。

但是,当您只想从标签读取 NDEF 消息时,Android 已经在将标签发现事件分派到您的应用程序之前为您解决了这个问题。 Android 通过 intent extra EXTRA_NDEF_MESSAGES 将该 NDEF 消息传递给您的应用程序。所以(通常)不需要再次手动读取NDEF消息(除非标签上的消息动态变化)。