MifareClassic#get() 在 Android 10 上抛出 NPE(但在 Android 8 上不会)

MifareClassic#get() throws NPE on Android 10 (but not on Android 8)

我刚刚从 Android 8 迁移到 10,现在我的 NFC 测试应用程序在读取 Mifare 标签时开始抛出 NPE。其他标签似乎有效(特别是支持 NfcV、NdefFormatable 的标签)。

堆栈跟踪:

E/AndroidRuntime( 1277): java.lang.NullPointerException: Attempt to invoke virtual method 'short android.os.Bundle.getShort(java.lang.String)' on a null object reference
E/AndroidRuntime( 1277):    at android.nfc.tech.NfcA.<init>(NfcA.java:76)
E/AndroidRuntime( 1277):    at android.nfc.tech.NfcA.get(NfcA.java:62)
E/AndroidRuntime( 1277):    at android.nfc.tech.MifareClassic.<init>(MifareClassic.java:150)
E/AndroidRuntime( 1277):    at android.nfc.tech.MifareClassic.get(MifareClassic.java:140)
E/AndroidRuntime( 1277):    at myapp.nfc_reader.TagViewer.dumpTagData(TagViewer.java:201)

收到 NFC intent 后,应用会执行以下操作:

Parcelable p = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Tag tag = (Tag) p;
for (String tech : tag.getTechList()) {
    if (tech.equals(MifareClassic.class.getName())) {
        MifareClassic mifareTag = MifareClassic.get(tag);
        // more code here
    }
}

显然 Tag 有一个非 public Bundle 成员,它在 Android 10 上为空并导致 NPE。这在 Android 8 (LineageOS 15.1) 上有效,但在 Android 10 (LineageOS 17.1;设备是 OnePlus One) 上失败。

这是 OS 中的错误还是我做错了什么?

看起来像一个 OS 错误

这个变化看起来很可疑https://review.lineageos.org/c/LineageOS/android_frameworks_base/+/256596/5/core/java/android/nfc/tech/NfcA.java

首次在 lineage-17.0 中引入(Android 10 版本)

为什么下面的代码有无用的 if 语句我不知道它没有任何用处,因为 mSakmAtqa 是使用股票 Android 代码重置的在 useless if 之后紧接着第 76 行在 useless if

    public NfcA(Tag tag) throws RemoteException {
        super(tag, TagTechnology.NFC_A);
        Bundle extras;
        mSak = 0;
        if(tag.hasTech(TagTechnology.MIFARE_CLASSIC))
        {
            extras = tag.getTechExtras(TagTechnology.MIFARE_CLASSIC);
            mSak = extras.getShort(EXTRA_SAK);
        }
        extras = tag.getTechExtras(TagTechnology.NFC_A);
        mSak |= extras.getShort(EXTRA_SAK);
        mAtqa = extras.getByteArray(EXTRA_ATQA);
    }

这不是现货Androidhttps://android.googlesource.com/platform/frameworks/base/+/refs/heads/android10-release/core/java/android/nfc/tech/NfcA.java

[以下由另一位用户编辑] 此补丁修复了此问题。 https://review.lineageos.org/c/LineageOS/android_packages_apps_Nfc/+/306229

此补丁已解决此问题。 https://review.lineageos.org/c/LineageOS/android_packages_apps_Nfc/+/306229 亲爱的OP请确认一下。

亲爱的超级用户,如果您打算删除我的答案,那么最好说明您这样做的原因。否则,我会再试一次,直到 OP 接受或解决这个问题。