Un applicazione NFC con le API Google su Galaxy Nexus

Vediamo in questo post come usare le API di Google per utilizzare l’NFC su uno dei terminali Google ed in particolare il Galaxy Nexus.

Presupponiamo che abbiate installato Eclipse e tutto l’SDK Android.
In caso contratrio potete partire da questo post.

Presupponiamo inoltre che siate già in grado di scrivere semplici applicazioni Android e che abbiate familiarità con l’ambiente di sviluppo.

Creata quindi l’applicazione, il primo passo è inserire nel manifesto (file AndroidManifest.xml) tutto quello che serve per avere accesso alle risorse e i restanti permessi di utilizzo, in particolare ecco di seguito quello che dovremmo inserire nel file:
                                                                               
<uses-permission android:name=“android.permission.NFC” />
<uses-feature android:name=“android.hardware.nfc” android:required=“true” />
 
<activity android:name=“.NfcTestActivity”>
            <intent-filter>
                <action android:name=“android.nfc.action.NDEF_DISCOVERED”/>
                <data android:mimeType=“application/test.nfcapp.nfcdemo”/>
                <category android:name=“android.intent.category.DEFAULT”/>
        </intent-filter>        

</activity>


Successivamente bisognerà scrivere il codice della main activity, e a tale proposito editiamo il file MainActivity.java ed inseriamo nel corpo del metodo OnCreate la seguente riga di codice che ci istanzia l’Nfc Adapter:
mAdapter = NfcAdapter.getDefaultAdapter(this);

Associamo poi alla pressione di un pulsante l'esecuzione del seguente metodo che abilita il PendingIntent che permette all'Intent di eseguire l'Activity nel momento in cui un tag viene rilevato. Ecco di seguito il codice del metodo:

private void enableWriteMode() {

mInWriteMode = true;
   PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),0);
 
IntentFilter tagDetected = new IntentFilter(NfcAdapter.ACTION_TAG_DISCOVERED);
IntentFilter[] filters = new IntentFilter[] { tagDetected };
        
mAdapter.enableForegroundDispatch(this, pendingIntent, filters, null);

}
Il successivo metodo permette di eseguire la scrittura vera e propria del tag rilevato, in questo caso abbiamo scelto di scrivere un tag vuoto attraverso il successivo metodo writeTag:

public void onNewIntent(Intent intent) {

if(mInWriteMode) {
    mInWriteMode = false;
      Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

      writeTag(tag);
}

}

Ecco infine il metodo chiave del programma, quello che esegue l'operazione di scrittura sul tag rilevato previe alcune verifiche di formato:
private boolean writeTag(Tag tag) {

NdefRecord appRecord = NdefRecord.createApplicationRecord("com.nfcapp.nfcdemo");
               
   byte[] payload = getRandomConsole().getBytes();
   byte[] mimeBytes = MimeType.NFC_DEMO.getBytes(Charset.forName("US-ASCII"));
   NdefRecord cardRecord = new NdefRecord(NdefRecord.TNF_MIME_MEDIA, mimeBytes, new byte[0], payload);
   NdefMessage message = new NdefMessage(new NdefRecord[] { cardRecord, appRecord});
       
try {
    // verifico se il tag è goà nel formato NDEF
      Ndef ndef = Ndef.get(tag);
      if (ndef != null) {
      ndef.connect();
 
         if (!ndef.isWritable()) {
          displayMessage("Tag in sola lettura.");
            return false;
         }
 
// verifica spazio disponibile
int size = message.toByteArray().length;
         if (ndef.getMaxSize() < size) {
          displayMessage("Il tag non ha spazio sufficiente.");
            return false;
         }
 
        ndef.writeNdefMessage(message);
         
         displayMessage("Tag correttamente scritto.");
        return true;
    } else {
      
         // attempt to format tag
         NdefFormatable format = NdefFormatable.get(tag);
         
         if (format != null) {
          try {
            format.connect();
               format.format(message);
               displayMessage("
Tag correttamente scritto!");
               return true;
            } catch (IOException e) {
            displayMessage("Impossibile formattare il tag.");
               return false;
            }
         } else {
          displayMessage("Il tag non supporta il formato NDEF.");
            return false;
         }
      }
   } catch (Exception e) {
    displayMessage("Scrittura tag fallita");
}
 
return false;
}
L’esempio è tratto da internet quindi non vuole essere assolutamente a carattere esaustivo ma semplicemente una base da cui partire per crearne di più complessi.
A presto.


Share Button
Pin It

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *