Android Weak Reference Callback失效:LoyaltyCardReader无法触发HCEPayment回调
问题修复方案
1. 修复空指针异常导致的回调中断
HCEPayment中声明的stringReceived未初始化,一旦onAccountReceived被触发,执行stringReceived.append(account)会直接抛出空指针异常,大概率是你误以为回调未触发的核心原因(异常抛出后后续逻辑终止,日志容易被系统冲刷覆盖)。
修复代码:在HCEPayment的onCreate方法中添加初始化逻辑:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_hcepayment); // 添加这行初始化代码 stringReceived = new StringBuilder(); mAccountField = (TextView) findViewById(R.id.card_account_field); mAccountField.setText("Waiting..."); mLoyaltyCardReader = new LoyaltyCardReader(this); enableReaderMode(); }
2. 增加弱引用判空逻辑,避免回调丢失
LoyaltyCardReader中用WeakReference包裹回调实例,当系统GC触发时,弱引用可能被提前回收,导致调用mAccountCallback.get()返回null,无法触发回调。
修复代码:在LoyaltyCardReader触发回调前增加判空校验:
if (Arrays.equals(SELECT_OK_SW, statusWord)) { String accountNumber = new String(payload, "UTF-8"); Log.i(TAG, "Received: " + accountNumber); Log.d("Account",accountNumber); // 增加判空逻辑 AccountCallback callback = mAccountCallback.get(); if (callback != null) { callback.onAccountReceived(accountNumber); } else { Log.e(TAG, "回调实例已被回收,无法触发通知"); } }
3. 补充NFC读卡flag,兼容更多HCE卡类型
当前配置的读卡flag仅支持NFC-A类型的卡片,部分HCE服务模拟的是NFC-B类型卡片,会导致onTagDiscovered根本不触发。
修复代码:修改HCEPayment中的READER_FLAGS配置:
public static int READER_FLAGS = NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_NFC_B | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK;
4. 增加状态字日志校验,确认命令执行结果
你当前仅当SELECT AID命令返回状态字为0x9000时才触发回调,建议打印完整的返回结果校验状态字是否符合预期,避免因HCE服务返回状态字异常导致回调未触发。
在LoyaltyCardReader中接收transceive返回结果后添加日志:
byte[] result = isoDep.transceive(selCommand); Log.i(TAG, "SELECT命令返回结果:" + ByteArrayToHexString(result));
内容的提问来源于stack exchange,提问作者Marcus
相关产品推荐
相关产品推荐

