public class Nfc
- Object
- Nfc
Entry point for the Codename One NFC API – read and write NDEF
messages, exchange APDUs with smart cards, and host-emulate as a
contactless card. Obtain the platform implementation via
getInstance(); the returned subclass is owned by the active port.
Quick start: Read an NDEF URI
Nfc nfc = Nfc.getInstance();
if (!nfc.canRead()) {
// device has no NFC or it is disabled
return;
}
nfc.readTag(new NfcReadOptions()
.setNdefOnly(true)
.setAlertMessage("Hold near the poster"))
.onResult((tag, err) -> {
if (err != null) {
return;
}
tag.readNdef().onResult((msg, e) -> {
if (e == null) {
String url = msg.getFirstRecord().getUriPayload();
// launch / display url
}
});
});
Quick start: Send an APDU to a smart card
nfc.readTag(new NfcReadOptions()
.setTechFilter(TagType.ISO_DEP)
.setIsoSelectAids(myAid))
.onResult((tag, err) -> {
if (err != null) return;
IsoDep iso = tag.getIsoDep();
if (iso == null) return;
iso.transceive(myCommandApdu).onResult((resp, e) -> {
if (ApduResponse.isSuccess(resp)) { ... }
});
});
Quick start: Host card emulation
class MyService extends HostCardEmulationService {
public String[] getAids() { return new String[] { "F0010203040506" }; }
public byte[] processCommand(byte[] apdu) {
return ApduResponse.withStatus(new byte[] { 'O', 'K' },
ApduResponse.swSuccess());
}
}
Nfc.getInstance().registerHostCardEmulationService(new MyService());
Platform support
- Android –
NfcAdapterforeground dispatch / reader-mode +HostApduServicefor HCE. Both manifest entries are auto-injected by the Maven plugin and the build daemon when this class is referenced. - iOS –
Core NFC(NFCNDEFReaderSession,NFCTagReaderSession) for reading;CardSession(iOS 17.4+, EU only) for HCE. TheNFCReaderUsageDescriptionplist entry and the relevant entitlements are auto-injected by IPhoneBuilder. - JavaSE simulator – the Simulate -> NFC menu lets you tap a
virtual tag, edit its NDEF payload, and fire APDUs at any registered
HostCardEmulationService. - All other platforms (desktop deploy, JavaScript, …) – this
base class is returned as-is and reports the device as unsupported;
every operation completes with
NfcError.NOT_AVAILABLE.
Constructors
protected Nfc() | Ports construct subclasses. |
Methods
Inherited methods
Constructor details
Nfc
protected Nfc()getInstance().Method details
getInstance
public static Nfc getInstance()Nfc
instance whose methods report the device as unsupported; calling
code never needs a null check or a platform-specific if.isSupported
public boolean isSupported()true when NFC hardware is present, regardless of whether it is
currently enabled. Combine with canRead() to drive UI
affordances. Returns false on the fallback base class.canRead
public boolean canRead()true when NFC is supported AND currently enabled (Android setting
toggle on, iOS Core NFC available). Defaults to false.canWrite
public boolean canWrite()true when NFC writing is supported on this device. On Android
this mirrors canRead(); on iOS, writing requires iOS 13+ and
the NFCReaderUsageDescription plist entry. Defaults to false.canHostEmulate
public boolean canHostEmulate()true when this device can act as a host-emulated contactless
card. Android requires FEATURE_NFC_HOST_CARD_EMULATION; iOS 17.4
- EU only with the HCE entitlement. Defaults to
false.
readTag
public AsyncResource<Tag> readTag(NfcReadOptions options)Performs a single tag-read session. Resolves with the discovered
Tag (call Tag.readNdef() or one of the technology accessors)
or fails with an NfcException. The base class fails immediately
with NfcError.NOT_AVAILABLE.
Cancel an in-flight read via stopRead().
readNdef
public AsyncResource<NdefMessage> readNdef(NfcReadOptions options)readTag(new NfcReadOptions().setNdefOnly(true))
followed by Tag.readNdef(). Resolves with the parsed NDEF
message, or fails with an NfcException.writeNdef
public AsyncResource<Boolean> writeNdef(NfcReadOptions options, NdefMessage message)true. Fails with
NfcError.READ_ONLY for locked tags and with
NfcError.CAPACITY_EXCEEDED when the message is too large.stopRead
public boolean stopRead()readTag(NfcReadOptions) /
readNdef(NfcReadOptions) / writeNdef(NfcReadOptions, NdefMessage)
call. The pending AsyncResource completes with
NfcError.USER_CANCELED.Returns
true when a call was cancelled; false when no session was
pending. Always false on the fallback base class.addTagListener
public void addTagListener(NfcListener listener)Registers a long-running tag-discovery listener – useful on
Android reader-mode where multiple tags can be tapped in
succession. Each new tag calls NfcListener.tagDiscovered(Tag)
from the EDT.
Ports that do not support multi-shot reading fall back to a
single-shot readTag(NfcReadOptions) each time – iOS for
example dismisses the system sheet after the first tag and
re-prompts.
No-op on the fallback base class.
removeTagListener
public void removeTagListener(NfcListener listener)addTagListener(NfcListener). No-op on the fallback base class.registerHostCardEmulationService
public void registerHostCardEmulationService(HostCardEmulationService service)Registers a Host Card Emulation service. Only one service may be
registered per app, and only the AIDs reported by
HostCardEmulationService.getAids() are routed to it.
On Android the platform routing tables are populated from the service’s manifest entry; the Codename One Maven plugin and BuildDaemon auto-generate that entry from the AIDs at build time. At runtime this method simply hands the live instance to the port so APDUs can be dispatched.
No-op on the fallback base class.
unregisterHostCardEmulationService
public void unregisterHostCardEmulationService()