1

所以我想从一个标签中读取,但是在连接到它时得到一个 NullPointerException。我知道我的标签不为空,因为我的活动在检测到它时开始,并且代码中的额外测试证明了这一点。

public void getDataFromTag()
{
    tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    text.setText(tag.toString());
    text.append("\n\n");
    // get NDEF tag details
    MifareClassic mfc = MifareClassic.get(tag);
    byte[] data;
    if (tag == null)
        text.append("\n Tag is null");
    try
    {
        mfc.connect();
        ...
    }
    catch (IOException e) 
    { 
        text.append("\n " + "Error while reading!");
    } 
    catch (NullPointerException e)
    {
        text.append("\n " + e.toString());
    }
}

那么这里的问题是什么?顺便说一句,我正在 Nexus 7 平板电脑上测试我的应用程序。

应大众需求...这里有一个 logCat

04-13 15:56:47.101: D/libEGL(2046): loaded /system/lib/egl/libEGL_tegra.so
04-13 15:56:47.121: D/libEGL(2046): loaded /system/lib/egl/libGLESv1_CM_tegra.so
04-13 15:56:47.131: D/libEGL(2046): loaded /system/lib/egl/libGLESv2_tegra.so
04-13 15:56:47.151: D/OpenGLRenderer(2046): Enabling debug mode 0
04-13 15:56:52.161: D/AndroidRuntime(2046): Shutting down VM
04-13 15:56:52.161: W/dalvikvm(2046): threadid=1: thread exiting with uncaught exception (group=0x41037930)
04-13 15:56:52.171: E/AndroidRuntime(2046): FATAL EXCEPTION: main
04-13 15:56:52.171: E/AndroidRuntime(2046): java.lang.RuntimeException: Unable to resume activity {bsp.app/bsp.app.Main_Menue}: java.lang.NullPointerException
04-13 15:56:52.171: E/AndroidRuntime(2046):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2742)
04-13 15:56:52.171: E/AndroidRuntime(2046):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2771)
04-13 15:56:52.171: E/AndroidRuntime(2046):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2235)
04-13 15:56:52.171: E/AndroidRuntime(2046):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
04-13 15:56:52.171: E/AndroidRuntime(2046):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
04-13 15:56:52.171: E/AndroidRuntime(2046):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-13 15:56:52.171: E/AndroidRuntime(2046):     at android.os.Looper.loop(Looper.java:137)
04-13 15:56:52.171: E/AndroidRuntime(2046):     at android.app.ActivityThread.main(ActivityThread.java:5041)
04-13 15:56:52.171: E/AndroidRuntime(2046):     at java.lang.reflect.Method.invokeNative(Native Method)
04-13 15:56:52.171: E/AndroidRuntime(2046):     at java.lang.reflect.Method.invoke(Method.java:511)
04-13 15:56:52.171: E/AndroidRuntime(2046):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-13 15:56:52.171: E/AndroidRuntime(2046):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-13 15:56:52.171: E/AndroidRuntime(2046):     at dalvik.system.NativeStart.main(Native Method)
04-13 15:56:52.171: E/AndroidRuntime(2046): Caused by: java.lang.NullPointerException
04-13 15:56:52.171: E/AndroidRuntime(2046):     at bsp.app.Main_Menue.getDataFromTag(Main_Menue.java:81)
04-13 15:56:52.171: E/AndroidRuntime(2046):     at bsp.app.Main_Menue.onResume(Main_Menue.java:65)
04-13 15:56:52.171: E/AndroidRuntime(2046):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1185)
04-13 15:56:52.171: E/AndroidRuntime(2046):     at android.app.Activity.performResume(Activity.java:5182)
04-13 15:56:52.171: E/AndroidRuntime(2046):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2732)
04-13 15:56:52.171: E/AndroidRuntime(2046):     ... 12 more
4

2 回答 2

1

您无需获取 Tag 对象即可获取 NDEF 内容,Android 默认读取 NDEf 内容,您可以使用

Parcelable[] messages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
if (messages != null) {
    NdefMessage[] ndefMessages = new NdefMessage[messages.length];
    for (int i = 0; i < messages.length; i++) {
        ndefMessages[i] = (NdefMessage) messages[i];
    }
    // process messages, usually only a single is present
}

请注意,如果标签实际上不属于该技术,则获取任何特定的标签技术类 (MifareClassic) 都不起作用 - 这就是您所看到的。因此,您应该首先检查您拥有的标签类型。

于 2013-04-13T16:52:35.230 回答
1

您应该检查是否mfc不在null该行之后MifareClassic mfc = MifareClassic.get(tag);。如果是null,则该标签可能不是 MIFARE Classic(也许您应该尝试MifareUltralight)。

于 2013-04-14T11:57:16.073 回答