NFC Library for Android 5.3 Full Source » Developer.Team - Developers Paradise!
star archive bad ca calendar cat coms dislike down down2 fav fb gp info left like login love mail od pass rel reply right search set share sort_down sort_up top tw up views vk votes cross phone loc ya

NFC Library for Android 5.3 Full Source

NFC Library for Android 5.3 Full Source
NFC Library for Android 5.3 Full Source


Delphi and C++ Builder NFC library for Android.
uses Android NFC API
provides reading, writing and formatting NFC tags
provides Android Beam data transfer
supports ISO-DEP, NDEF, NFC-A, NFC-B, NFC-F, NFC-V, MIFARE Classic and MIFARE Ultralight tags
available for Delphi/C++ Builder XE7 - 10.2
source code included in registered version
royalty free distribution in applications

Library API
type
  TNfcMode = (moReader, moForegroundDispatch, moBeam);

  TReaderFlag = (reNfcA, reNfcB, reNfcF, reNfcV, reNfcBarcode, reNoNdefCheck, reNoSound);
  TReaderFlags = set of TReaderFlag;

  TBeamCompleteEvent = procedure(Sender: TObject) of object;
  TTagDiscoveredEvent = procedure(Sender: TObject; Tag: TNfcTag) of object;

  ENfcError = class(Exception);

  TNfc = class
    constructor Create(Mode: TNfcMode = moReader);

    function Beam(NdefMessage: TNdefMessage): Boolean;
    function Beam(const Uri: Jnet_Uri): Boolean;
    function Beam(const Uris: TArray<Jnet_Uri>): Boolean;
    function Beam(const FileName: string): Boolean;
    function Beam(const FileNames: TArray<string>): Boolean;

    procedure Disable;
    procedure Enable(ReaderFlags: TReaderFlags = [reNfcA]);

    procedure ShowBeamSettings;
    procedure ShowSettings;

    property Adapter: JNfcAdapter read;
    property AdapterEnabled: Boolean read;
    property BeamEnabled: Boolean read;
    property Mode: TNfcMode read;

    property OnBeamComplete: TBeamCompleteEvent read write;
    property OnTagDiscovered: TTagDiscoveredEvent read write;
  end;

  TNfcTag = class
    function Id(Separator: Char = ':'): string;

    property IsoDep: TIsoDep read;
    property MifareClassic: TMifareClassic read;
    property MifareUltralight: TMifareUltralight read;
    property Ndef: TNdef read;
    property NdefFormatable: TNdefFormatable read;
    property NfcA: TNfcA read;
    property NfcB: TNfcB read;
    property NfcF: TNfcF read;
    property NfcV: TNfcV read;
    property Tag: JTag read;
    property TechList: TArray<string> read;
  end;

  TIsoDep = class
    function Transceive(Data: TArray<Byte>): TArray<Byte>;

    property IsoDep: JIsoDep read;
    property MaxTransceiveLength: Integer read;
    property Tag: JTag read;
    property Timeout: Integer read write;
  end;

  TNfcA = class
    function Transceive(Data: TArray<Byte>): TArray<Byte>;

    property Atqa: TArray<Byte> read;
    property MaxTransceiveLength: Integer read;
    property NfcA: JNfcA read;
    property Sak: SmallInt read;
    property Tag: JTag read;
    property Timeout: Integer read write;
  end;

  TNfcB = class
    function Transceive(Data: TArray<Byte>): TArray<Byte>;

    property MaxTransceiveLength: Integer read;
    property NfcB: JNfcB read;
    property Tag: JTag read;
  end;

  TNfcF = class
    function Transceive(Data: TArray<Byte>): TArray<Byte>;

    property MaxTransceiveLength: Integer read;
    property NfcF: JNfcF read;
    property Tag: JTag read;
    property Timeout: Integer read write;
  end;

  TNfcV = class
    function EasAlarm: TArray<Byte>;
    function GetSecurity(FirstBlock, BlockCount: Byte): TArray<Byte>;
    function LockAfi: TArray<Byte>;
    function LockBlock(Block: Byte): TArray<Byte>;
    function LockDsfid: TArray<Byte>;
    function LockEas: TArray<Byte>;
    function ReadBlock(Block: Byte): TArray<Byte>;
    function ReadBlocks(FirstBlock, BlockCount: Byte): TArray<Byte>;
    function ResetEas: TArray<Byte>;
    function ResetToReady: TArray<Byte>;
    function SetEas: TArray<Byte>;
    function Transceive(Data: TArray<Byte>): TArray<Byte>;
    function WriteAfi(AFI: Byte): TArray<Byte>;
    function WriteBlock(Block: Byte; Data: TArray<Byte>): TArray<Byte>;
    function WriteBlocks(FirstBlock, BlockCount: Byte; Data: TArray<Byte>): TArray<Byte>;
    function WriteDsfid(DSFID: Byte): TArray<Byte>;

    property BlockCount: Integer read;
    property BlockSize: Integer read;
    property DsfId: Byte read;
    property Ic: Integer read;
    property Inventory: TArray<Byte> read;
    property MaxTransceiveLength: Integer read;
    property NfcV: JNfcV read;
    property ResponseFlags: Byte read;
    property SystemInformation: TArray<Byte> read;
    property Tag: JTag read;
  end;

  TNdef = class
    function MakeReadOnly: Boolean;
    function Write(NdefRecord: TNdefRecord): Boolean;
    function Write(NdefRecords: TArray<TNdefRecord>): Boolean;
    function Write(NdefRecords: array of TNdefRecord): Boolean;

    property CanMakeReadOnly: Boolean read;
    property IsWritable: Boolean read;
    property MaxSize: Integer read;
    property Ndef: JNdef read;
    property Records: TArray<TNdefRecord> read;
    property Tag: JTag read;
    property &Type: string read;
  end;

  TNdefFormatable = class
    function Format: Boolean;
    function FormatReadOnly: Boolean;

    property NdefFormatable: JNdefFormatable read;
    property Tag: JTag read;
  end;

  TMifareUltralightNTag = (muUnknown, mu203, mu210, mu212, mu213, mu215, mu216);

  TMifareUltralight = class
    function PageCount(NTag: TMifareUltralightNTag = muUnknown): Integer;
    function ReadData(NTag: TMifareUltralightNTag = muUnknown): TArray<Byte>;
    function ReadPage(PageOffset: Integer): TArray<Byte>;
    function ReadPages(NTag: TMifareUltralightNTag = muUnknown): TArray<TArray<Byte>>;
    procedure WritePage(PageOffset: Integer; Data: TArray<Byte>);
    procedure WritePages(FirstPageOffset: Integer; Data: TArray<TArray<Byte>>);
    function Transceive(Data: TArray<Byte>): TArray<Byte>;

    // NTAG commmands
    function GetVersion: TArray<Byte>;
    function Read(Address: Byte): TArray<Byte>;
    function FastRead(StartAddress, EndAddress: Byte): TArray<Byte>;
    function ReadCounter: TArray<Byte>;
    function ReadSignature: TArray<Byte>;

    property MaxTransceiveLength: Integer read;
    property MifareUltralight: JMifareUltralight read;
    property Tag: JTag read;
    property Timeout: Integer read write;
    property &Type: Integer read;
    property TypeDescription: string read;
  end;

  TMifareClassic = class
    function ReadBlock(Index: Integer; const KeyA: TArray<Byte> = nil; const KeyB: TArray<Byte> = nil): TArray<Byte>;
    function ReadBlocks(const KeyA: TArray<Byte> = nil; const KeyB: TArray<Byte> = nil): TArray<TArray<Byte>>;
    function ReadData(const KeyA: TArray<Byte> = nil; const KeyB: TArray<Byte> = nil): TArray<Byte>;

    property BlockCount: Integer read;
    property BlockSize: Integer read;
    property MifareClassic: JMifareClassic read;
    property MaxTransceiveLength: Integer read;
    property SectorCount: Integer read;
    property Size: Integer read;
    property Tag: JTag read;
    property Timeout: Integer read write;
    property &Type: Integer read;
    property TypeDescription: string read;
  end;

  TNdefRecord = class
    class function CreateExternalRecord(const Domain, &Type: string; const Data: TArray<Byte>): TNdefRecord;
    class function CreateApplicationRecord(const PackageName: string): TNdefRecord;
    class function CreateMimeRecord(const MimeType: string; const MimeData: TArray<Byte>): TNdefRecord;
    class function CreateTextRecord(const Text: string; const LanguageCode: string = 'en'): TNdefRecord;
    class function CreateUriRecord(const Uri: string): TNdefRecord;

    property ExternalText: string read;
    property IsAbsoluteUri: Boolean read;
    property IsEmpty: Boolean read;
    property IsExternalType: Boolean read;
    property IsMimeMedia: Boolean read;
    property IsText: Boolean read;
    property IsUnchanged: Boolean read;
    property IsUnknown: Boolean read;
    property IsUri: Boolean read;
    property IsWellKnown: Boolean read;
    property NdefRecord: JNdefRecord read;
    property Payload: TArray<Byte> read;
    property PayloadUtf8: string read;
    property Text: string read;
    property TextLanguageCode: string read;
    property TnfDescription: string read;
    property Uri: string read;
  end;

  TNdefMessage = class
    constructor Create(NdefRecord: TNdefRecord);
    constructor Create(NdefRecords: TArray<TNdefRecord>);

    property Records: TArray<TNdefRecord> read;
    property NdefMessage: JNdefMessage read;
  end;

// utilities

function BytesToHex(Bytes: TJavaArray<Byte>; Separator: Char = ':'): string;
function BytesToHex(const Bytes: TArray<Byte>; Separator: Char = ':'): string;
function BytesToHex(const Bytes: TArray<Byte>; From, Count: Integer; Separator: Char = ':'): string;

function BytesToHexReverse(Bytes: TJavaArray<Byte>; Separator: Char = ':'): string;
function BytesToHexReverse(const Bytes: TArray<Byte>; Separator: Char = ':'): string;
function BytesToHexReverse(const Bytes: TArray<Byte>; From, Count: Integer; Separator: Char = ':'): string;