MifareClassic#get() 在 Android 10 上抛出 NPE(但在 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 意图后,应用会执行以下操作:

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有一个非公开Bundle成员,该成员在 Android 10 上为空并导致 NPE。这在Android 8(LineageOS 15.1)上有效,但在Android 10(LineageOS 17.1;该设备是OnePlus One)上失败。

这是操作系统中的错误还是我做错了什么?

看起来像一个操作系统错误

此更改看起来可疑 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在无用的if之后直接使用库存 Android 代码重置,而第 76 行处于无用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://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 接受或解决此问题。

相关内容

  • 没有找到相关文章

最新更新