2014-07-09 20 views
11

Sono nuovo per Firemonkey e Android e non so se ho l'approccio sbagliato. Voglio avere un'app in esecuzione e leggere un tag NFC.Adattatore NFC Android Firemonkey

C'è un modo per utilizzare il lettore NFC nei dispositivi Android con firemonkey?

Con una parte di NFCAdapter da FMXExpress (http://www.fmxexpress.com/full-android-sdk-interface-files-in-object-pascal-for-firemonkey/) è possibile determinare se il dispositivo ha un lettore NFC e se è abilitato. Ma per usare tutte le funzioni, ho dovuto definire tutte le interfacce manualmente e risolvere tutti i riferimenti circolari. Non penso che questo possa portare a una soluzione prober.

Im di fronte alla soluzione di costruire il mio JavaClass di comunicare con adattatore NFC come esso è descritto in questo post del blog: http://blong.com/Articles/DelphiXE5AndroidActivityResult/ActivityResult.htm#Building

+2

Se sei ancora bloccato su questo, @deterministicFail, ho scritto come leggere e scrivere tag NFC nelle app Delphi per Android per XE5, XE6 e XE7. Puoi trovare il post con i collegamenti a tutti e tre gli articoli qui: http://blog.blong.com/2014/09/delphi-and-nfc-on-android.html Divertiti! – blong

risposta

21

Sì! Stai prendendo il giusto approccio.

Per effettuare Delphi e FireMonkey lavoro è possibile utilizzare il seguente template in quanto è il modo giusto per ottenere quello che avete in mente:

Interfaccia:

/ JNI NFC import demo 
// Note - REQUIRES - PROJECT OPTIONS - USES PERMISSIONS - NFC 

interface 

uses 
    Androidapi.JNIBridge, 
    Androidapi.JNI.JavaTypes, 
    Androidapi.JNI.GraphicsContentViewText, 
    FMX.Helpers.Android, 
    SysUtils, 
    Classes; 

type 

NFC Adattatore:

/////////////////////////// NfcAdapter ///////////////////////////////// 
    JNfcManager = interface; 
    JNfcAdapter = interface; 

    JNfcAdapterClass = interface(JObjectClass) 
    ['{634258AC-7931-4E38-97E6-48DBF688A288}'] 
    {Property methods} 
    function _ACTION_TAG_DISCOVERED: JString; cdecl; 
    function _EXTRA_ID: JString; cdecl; 
    function _EXTRA_NDEF_MESSAGES: JString; cdecl; 
    function _EXTRA_TAG: JString; cdecl; 
    {Properties} 
    property ACTION_TAG_DISCOVERED: JString read _ACTION_TAG_DISCOVERED; 
    property EXTRA_ID: JString read _EXTRA_ID; 
    property EXTRA_NDEF_MESSAGES: JString read _EXTRA_NDEF_MESSAGES; 
    property EXTRA_TAG: JString read _EXTRA_TAG; 
    end; 

    [JavaSignature('android/nfc/NfcAdapter')] 
    JNfcAdapter = interface(JObject) 
    ['{364D8F3F-23AE-4C28-A261-E30C0893B24C}'] 
    //Return true if this NFC Adapter has any features enabled 
    function isEnabled: Boolean; cdecl; 
    end; 

    TJNfcAdapter = class(TJavaGenericImport<JNfcAdapterClass, JNfcAdapter>) end; 

NfcManager:

/////////////////////////// NfcManager ///////////////////////////////// 

    JNfcManagerClass = interface(JObjectClass) 
    ['{812481E1-F491-47D2-AC1F-4C5AB509532B}'] 
    end; 

    [JavaSignature('android/nfc/NfcManager')] 
    JNfcManager = interface(JObject) 
    ['{04B707EC-966A-4E4F-85DC-F003B7C9ACE3}'] 
    {Methods} 
    function getDefaultAdapter: JNfcAdapter; cdecl; 
    end; 

    TJNfcManager = class(TJavaGenericImport<JNfcManagerClass, JNfcManager>) end; 

function HasNfc: Boolean; 
function IsNfcEnabled: Boolean; 

implementation 

function GetNfcManager: JNfcManager; 
var 
    ConnectivityServiceNative: JObject; 
begin 
    ConnectivityServiceNative := SharedActivityContext.getSystemService(TJContext.JavaClass.NFC_SERVICE); 
    if not Assigned(ConnectivityServiceNative) then 
    raise Exception.Create('Could not locate Nfc Service'); 
    Result := TJNfcManager.Wrap((ConnectivityServiceNative as ILocalObject).GetObjectID); 
    if not Assigned(Result) then 
    raise Exception.Create('Could not access Nfc Manager'); 
end; 

function HasNfc: Boolean; 
var 
    NfcManager: JNfcManager; 
    NfcAdapter: JNfcAdapter; 
begin 
    NfcManager := GetNfcManager; 
    NfcAdapter := NfcManager.getDefaultAdapter; 
    Result := Assigned(NfcAdapter); 
end; 

function IsNfcEnabled: Boolean; 
var 
    NfcManager: JNfcManager; 
    NfcAdapter: JNfcAdapter; 
begin 
    NfcManager := GetNfcManager; 
    NfcAdapter := NfcManager.getDefaultAdapter; 
    Result := Assigned(NfcAdapter)and NfcAdapter.isEnabled; 
end; 

end. 

{code} 

usage 
Memo1.Lines.Add('Nfc Enabled: '+BoolToStr(IsNfcEnabled, True)); 

Nel caso in cui si gioca in giro con questo codice di esempio, sono abbastanza sicuro che funzionerà!

Immagino che tu sia costretto a ottenere il meglio da tutto, ad esempio utilizzando un'API totalmente cross e multi-piattaforma, che ti permetterà di avere esattamente lo stesso codice in esecuzione su Android and iOS senza alcuna modifica del fronte della tua app e back-end. Sì, è vero che alcuni strumenti sono attualmente in fase di sviluppo per il targeting per la vera piattaforma multi-piattaforma integrata development, che dovrebbe raggiungere la piena integrazione probabilmente nel prossimo futuro. Sfortunatamente, la realtà è che nelle attuali fasi di sviluppo di piattaforme mobili, è possibile utilizzare tali strumenti multipiattaforma solo se si implementano app di base che non dipenderanno da risorse più specifiche, come NFC, Geofencing, ecc. Naturalmente, se non sei in un ambiente di produzione, alla fine potresti avere tutto il tempo per giocare e divertirti. Ma supponendo che non sia il caso, quindi mantenere l'attenzione sul mettere insieme le cose per funzionare velocemente, come termine di consegna è solitamente stretto.

Detto questo, in alternativa il modo più veloce e più breve per ottenere la comunicazione NFC-tag è semplicemente farlo con la risorsa API NFC di Android, come è stato introdotto dal livello API 9 - Android Gingerbread.

enter image description here

trasferimenti NFC possono verificarsi tra due dispositivi abilitati NFC, o tra un dispositivo e un “tag” NFC. I tag possono variare da tag passivi che trasmettono un URL quando vengono scansionati a sistemi complessi come quelli utilizzati nelle soluzioni di pagamento NFC, come ad esempio Google Wallet.

enter image description here

Per leggere, scrivere o trasmettere messaggi NFC, l'applicazione richiede l'NFC permesso di manifestare:

<uses-permission android:name=”android.permission.NFC” /> 

Quando un dispositivo Android è utilizzato per eseguire la scansione di un tag NFC, il sistema decodificherà il carico utile in entrata utilizzando il proprio sistema di invio tag, che analizza il tag, classifica i dati e utilizza un'intenzione per avviare un'applicazione per ricevere i dati.

Ecco un codice un'istantanea che mostra come registrare un'attività che risponderà solo alle NFC tags:

<activity android:name=”.BlogViewer”> 
    <intent-filter> 
     <action android:name=”android.nfc.action.NDEF_DISCOVERED”/> 
     <category android:name=”android.intent.category.DEFAULT”/> 
     <data android:scheme=”http”android:host=”blog.example.com”/> 
    </intent-filter> 
</activity> 

L'extra NfcAdapter.EXTRA_TAG include un oggetto Tag grezzo che rappresenta il tag digitalizzata. I NfcAdapter.EXTRA_TNDEF_MESSAGES contiene in più una serie di NDEF Messaggi:

String action = getIntent().getAction(); 

if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(action)) { 
    Parcelable[] messages = 
    intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 
    for (int i = 0; i < messages.length; i++) { 
     NdefMessage message = (NdefMessage)messages[i]; 
     NdefRecord[] records = message.getRecords(); 
     for (int j = 0; j < records.length; j++) { 
      NdefRecord record = records[j]; 
      // TODO Process the individual records. 
     } 
    } 
} 

enter image description here

Le potenzialità e le possibilità di NFC applications è enorme, e la domanda di tale tecnologia tende a crescere in modo significativo:

enter image description here

Se è possibile utilizzare lo smartphone come metodo di pagamento, pagare per cose come il trasporto pubblico e i parchimetri potrebbe essere semplice come swipin g sul tuo telefono. Puoi persino toccare un terminale di giornale sul tuo tragitto giornaliero per scaricare l'ultimo numero sul tuo dispositivo.

+0

Grazie per la tua risposta dettagliata. Sfortunatamente sono legato a Delphi e Firemonkey. – deterministicFail

+0

Grazie per il vostro impegno. Queste interfacce sono ciò che intendevo nella mia domanda e sono l'unico esempio delphi sulla rete. Sulla base della mia ricerca sono giunto alla conclusione che l'unico modo corretto in questo momento è implementare una propria JavaClass e usarla da Firemonkey. – deterministicFail

+0

sentiti libero di scrivere nel caso in cui cerchi ulteriore supporto .... |: 0), – Avanz

Problemi correlati