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 错误
首次在 lineage-17.0 中引入(Android 10 版本)
为什么下面的代码有无用的 if
语句我不知道它没有任何用处,因为 mSak
和 mAtqa
是使用股票 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);
}
[以下由另一位用户编辑]
此补丁修复了此问题。 https://review.lineageos.org/c/LineageOS/android_packages_apps_Nfc/+/306229
此补丁已解决此问题。
https://review.lineageos.org/c/LineageOS/android_packages_apps_Nfc/+/306229
亲爱的OP请确认一下。
亲爱的超级用户,如果您打算删除我的答案,那么最好说明您这样做的原因。否则,我会再试一次,直到 OP 接受或解决这个问题。
我刚刚从 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 错误
首次在 lineage-17.0 中引入(Android 10 版本)
为什么下面的代码有无用的 if
语句我不知道它没有任何用处,因为 mSak
和 mAtqa
是使用股票 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);
}
[以下由另一位用户编辑] 此补丁修复了此问题。 https://review.lineageos.org/c/LineageOS/android_packages_apps_Nfc/+/306229
此补丁已解决此问题。 https://review.lineageos.org/c/LineageOS/android_packages_apps_Nfc/+/306229 亲爱的OP请确认一下。
亲爱的超级用户,如果您打算删除我的答案,那么最好说明您这样做的原因。否则,我会再试一次,直到 OP 接受或解决这个问题。