You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:45:02