监听 HCE(基于主机的卡仿真)事件
Listen for HCE (Host-based Card Emulation) event
每次用户使用基于主机的卡仿真 (HCE) 开始 NFC 交易时,我都需要启动我的应用程序。
我不需要管理交互。我不需要来自 reader 或 NFC 模拟器的任何类型的数据。我无法控制使用该服务的应用程序。我只需要知道 phone 是否接近 NFC reader。
有没有一种简单的方法,比如在不干扰其他应用程序的情况下监听通用系统事件或通知?
不,Android 不会像 "hey, there is some app that has just been activated over HCE" 那样发送任何通知。因此,您无法在您的应用程序中获得此类事件。具体来说,它不可能监控您设备上的任何现有 HCE 应用程序(不受您控制)是否已通过 HCE 激活。
您可以做的是创建自己的 HCE 服务(为您的特定应用程序 AID 注册)。如果此 HCE 服务收到交易(另请参阅 ),则可以启动 activity:
public class MyHostApduService extends HostApduService {
@Override
public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
if ((apdu[1] == (byte)0xA4) && (apdu[2] == (byte)0x04)) {
// SELECT by AID
Intent intent = new Intent(this, MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
return new byte[]{ (byte)0x90, (byte)0x00 }
} else {
return new byte[]{ (byte)0x6D, (byte)0x00 }
}
}
}
每次用户使用基于主机的卡仿真 (HCE) 开始 NFC 交易时,我都需要启动我的应用程序。
我不需要管理交互。我不需要来自 reader 或 NFC 模拟器的任何类型的数据。我无法控制使用该服务的应用程序。我只需要知道 phone 是否接近 NFC reader。
有没有一种简单的方法,比如在不干扰其他应用程序的情况下监听通用系统事件或通知?
不,Android 不会像 "hey, there is some app that has just been activated over HCE" 那样发送任何通知。因此,您无法在您的应用程序中获得此类事件。具体来说,它不可能监控您设备上的任何现有 HCE 应用程序(不受您控制)是否已通过 HCE 激活。
您可以做的是创建自己的 HCE 服务(为您的特定应用程序 AID 注册)。如果此 HCE 服务收到交易(另请参阅
public class MyHostApduService extends HostApduService {
@Override
public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
if ((apdu[1] == (byte)0xA4) && (apdu[2] == (byte)0x04)) {
// SELECT by AID
Intent intent = new Intent(this, MyActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
return new byte[]{ (byte)0x90, (byte)0x00 }
} else {
return new byte[]{ (byte)0x6D, (byte)0x00 }
}
}
}