我刚刚从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
语句我不知道这没有任何用处,因为mSak
和mAtqa
在无用的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 接受或解决此问题。