Gelişmiş NFC'ye genel bakış

Bu dokümanda, çeşitli etiket teknolojileriyle çalışma, çeşitli etiket teknolojileri ve ön planda bir uygulamanın ön planda çalışmasına izin veren ön plan gönderme gibi özellikler içeren aynı amaçlar için diğer uygulamalar filtrelense bile amaçları işler.

Desteklenen etiket teknolojileriyle çalışma

NFC etiketleri ve Android destekli cihazlarla çalışırken, okumak için kullandığınız ana biçim ve etiketlere veri yazma NDEF'dir. Android, NDEF verileri içeren bir etiketi taradığında destek sağlar. NdefMessage içinde teslim edilmesini sağlayan yapmasını sağlar. Bununla birlikte, NDEF verileri veya NDEF verileri bir MIME türü ya da URI ile eşleştirilemediğinde. Bu gibi durumlarda, doğrudan etiketle bir iletişim açmanız ve etiketi okuyup ona yazmanız gerekir. (ham bayt cinsinden) ekleyebilirsiniz. Android, bu kullanım alanları için android.nfc.tech paketine (Tablo 1'de açıklanmıştır). Şunları yapabilirsiniz: teknolojileri belirlemek için getTechList() yöntemini kullanın etiket tarafından desteklenir ve ilgili TagTechnology öğesini oluşturur android.nfc.tech tarafından sağlanan sınıflardan birine sahip nesne

Tablo 1. Desteklenen etiket teknolojileri

Sınıf Açıklama
TagTechnology Tüm etiket teknolojisi sınıflarının uygulaması gereken arayüz.
NfcA NFC-A (ISO 14443-3A) özelliklerine ve G/Ç işlemlerine erişim sağlar.
NfcB NFC-B (ISO 14443-3B) özelliklerine ve G/Ç işlemlerine erişim sağlar.
NfcF NFC-F (JIS 6319-4) özelliklerine ve G/Ç işlemlerine erişim sağlar.
NfcV NFC-V (ISO 15693) özelliklerine ve G/Ç işlemlerine erişim sağlar.
IsoDep ISO-DEP (ISO 14443-4) özelliklerine ve G/Ç işlemlerine erişim sağlar.
Ndef NDEF verilerine ve şu şekilde biçimlendirilmiş NFC etiketlerindeki işlemlere erişim sağlar: NDEF
NdefFormatable NDEF biçimlendirilebilir etiketler için bir biçim işlemleri sağlar.

Aşağıdaki etiket teknolojilerinin Android destekli cihazlarda desteklenmesi gerekmez.

Tablo 2. İsteğe bağlı desteklenen etiket teknolojileri

Sınıf Açıklama
MifareClassic Bu Android cihaz varsa MIFARE Classic özelliklerine ve G/Ç işlemlerine erişim sağlar MIFARE'yi destekler.
MifareUltralight Bu Android cihazı MIFARE Ultralight özelliklerine ve G/Ç işlemlerine erişim sağlar cihaz MIFARE'yi destekliyor.

Etiket teknolojileri ve ACTION_TECH_DISCOVERED amacı ile çalışma

Bir cihaz, NDEF verileri içeren ancak MIME veya URI ile eşlenemeyen bir etiketi taradığında Etiket gönderme sistemi, ACTION_TECH_DISCOVERED ile bir etkinlik başlatmaya isteyebilirsiniz. ACTION_TECH_DISCOVERED, bir etiket aşağıdaki durumlarda da kullanılır: taranır. Bu yedeğin olması, etiketteki verilerle çalışmanıza olanak tanır . Proje yöneticileriyle çalışırken etiket teknolojileri şunlardır:

  1. Şunları belirten bir ACTION_TECH_DISCOVERED amacı için filtre: etiket teknolojilerinin mevcut olduğunu unutmayın. Bkz. NFC için filtreleme intent'lere bakın. Genel olarak, bir NDEF mesajı olduğunda etiket gönderme sistemi ACTION_TECH_DISCOVERED niyetini başlatmaya çalışır bir MIME türü veya URI ile eşlenemez ya da taranan etiket NDEF verisi içermiyorsa. Örneğin, Bunun nasıl belirlendiği hakkında daha fazla bilgi için Etiket Sevk Sistemi bölümüne bakın.
  2. Uygulamanız niyeti aldığında Tag nesnesini şuradan alın: amaç:

    Kotlin

    var tagFromIntent: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)
    

    Java

    Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    
  3. Aşağıdakilerden birini çağırarak bir TagTechnology örneği elde edin: android.nfc.tech paketindeki sınıfların get fabrika yöntemi. Şunları yapabilirsiniz: get fabrika yöntemini çağırmadan önce getTechList() öğesini çağırarak etiketin desteklenen teknolojilerini numaralandırma Örneğin, bir örneği almak için Tag arasından MifareUltralight için şunları yapın:

    Kotlin

    MifareUltralight.get(intent.getParcelableExtra(NfcAdapter.EXTRA_TAG))
    

    Java

    MifareUltralight.get(intent.getParcelableExtra(NfcAdapter.EXTRA_TAG));
    

Etiketleri okuma ve etiketlere yazma

NFC etiketini okuma ve yazma işlemi, etiketin amaçtan alınmasını ve etiket ile iletişimin açılışı. Veri okumak ve yazmak için kendi protokol yığınınızı tanımlamanız gerekir ekleyin. Bununla birlikte, çalışırken NDEF verilerini okumaya ve yazmaya devam edebileceğinizi . Öğeleri nasıl yapılandırmak istediğinize siz karar verirsiniz. İlgili içeriği oluşturmak için kullanılan aşağıdaki örnekte, MIFARE Ultralight etiketiyle nasıl çalışıldığı gösterilmektedir.

Kotlin

package com.example.android.nfc
import android.nfc.Tag
import android.nfc.tech.MifareUltralight
import java.io.IOException
import java.nio.charset.Charset

class MifareUltralightTagTester {

    fun writeTag(tag: Tag, tagText: String) {
        MifareUltralight.get(tag)?.use { ultralight ->
            ultralight.connect()
            Charset.forName("US-ASCII").also { usAscii ->
                ultralight.writePage(4, "abcd".toByteArray(usAscii))
                ultralight.writePage(5, "efgh".toByteArray(usAscii))
                ultralight.writePage(6, "ijkl".toByteArray(usAscii))
                ultralight.writePage(7, "mnop".toByteArray(usAscii))
            }
        }
    }

    fun readTag(tag: Tag): String? {
        return MifareUltralight.get(tag)?.use { mifare ->
            mifare.connect()
            val payload = mifare.readPages(4)
            String(payload, Charset.forName("US-ASCII"))
        }
    }
}

Java

package com.example.android.nfc;

import android.nfc.Tag;
import android.nfc.tech.MifareUltralight;
import android.util.Log;
import java.io.IOException;
import java.nio.charset.Charset;

public class MifareUltralightTagTester {

    private static final String TAG = MifareUltralightTagTester.class.getSimpleName();

    public void writeTag(Tag tag, String tagText) {
        MifareUltralight ultralight = MifareUltralight.get(tag);
        try {
            ultralight.connect();
            ultralight.writePage(4, "abcd".getBytes(Charset.forName("US-ASCII")));
            ultralight.writePage(5, "efgh".getBytes(Charset.forName("US-ASCII")));
            ultralight.writePage(6, "ijkl".getBytes(Charset.forName("US-ASCII")));
            ultralight.writePage(7, "mnop".getBytes(Charset.forName("US-ASCII")));
        } catch (IOException e) {
            Log.e(TAG, "IOException while writing MifareUltralight...", e);
        } finally {
            try {
                ultralight.close();
            } catch (IOException e) {
                Log.e(TAG, "IOException while closing MifareUltralight...", e);
            }
        }
    }

    public String readTag(Tag tag) {
        MifareUltralight mifare = MifareUltralight.get(tag);
        try {
            mifare.connect();
            byte[] payload = mifare.readPages(4);
            return new String(payload, Charset.forName("US-ASCII"));
        } catch (IOException e) {
            Log.e(TAG, "IOException while reading MifareUltralight message...", e);
        } finally {
            if (mifare != null) {
               try {
                   mifare.close();
               }
               catch (IOException e) {
                   Log.e(TAG, "Error closing tag...", e);
               }
            }
        }
        return null;
    }
}

Ön plan dağıtım sistemini kullan

Ön plan sevk sistemi, bir etkinliğin niyeti ve iddiaya müdahale etmesine olanak tanır bir amaca hizmet eden diğer etkinliklere göre daha önceliklidir. Bu sistemi kullanmak Android sisteminin uygun etiketleri gönderebilmesi için birkaç veri yapısı bir hedef belirleyebilirsiniz. Ön plan gönderme sistemini etkinleştirmek için:

  1. Aşağıdaki kodu etkinliğinizin onCreate() yöntemine ekleyin:
    1. Android sisteminin doldurabilmesi için değişebilir bir PendingIntent nesnesi oluşturun etiketinin ayrıntılarına eklenmelidir.

      Kotlin

      val intent = Intent(this, javaClass).apply {
          addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
      }
      var pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, intent,
              PendingIntent.FLAG_MUTABLE)
      

      Java

      PendingIntent pendingIntent = PendingIntent.getActivity(
          this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
          PendingIntent.FLAG_MUTABLE);
      
    2. Müdahale etmek istediğiniz amaçları işlemek için intent filtreleri tanımlayın. Ön plan görev dağıtıcı sistemi, belirtilen intent filtrelerini, Cihaz bir etiketi tarar. Eşleşme olması durumunda uygulamanız niyeti işler. Uyuyorsa ön plan dağıtım sistemi, intent dağıtım sistemine geri döner. Bir null intent filtreleri ve teknoloji filtreleri dizisi belirterek, TAG_DISCOVERED öğesine yedek olan tüm etiketler için filtrelemek istediğiniz isteyebilirsiniz. Aşağıdaki kod snippet'i NDEF_DISCOVERED için tüm MIME türlerini işler. Siz yalnızca ihtiyacınız olanlarla ilgilenmelidir.

      Kotlin

      val ndef = IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED).apply {
          try {
              addDataType("*/*")    /* Handles all MIME based dispatches.
                                       You should specify only the ones that you need. */
          } catch (e: IntentFilter.MalformedMimeTypeException) {
              throw RuntimeException("fail", e)
          }
      }
      
      intentFiltersArray = arrayOf(ndef)
      

      Java

      IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
          try {
              ndef.addDataType("*/*");    /* Handles all MIME based dispatches.
                                             You should specify only the ones that you need. */
          }
          catch (MalformedMimeTypeException e) {
              throw new RuntimeException("fail", e);
          }
         intentFiltersArray = new IntentFilter[] {ndef, };
      
    3. Uygulamanızın kullanmak istediği bir dizi etiket teknolojisi oluşturun. Şunu çağırın: Object.class.getName() yöntemini kullanarak öğrendiğiniz teknolojinin sınıfını istediğinize karar verin.

      Kotlin

      techListsArray = arrayOf(arrayOf<String>(NfcF::class.java.name))
      

      Java

      techListsArray = new String[][] { new String[] { NfcF.class.getName() } };
      
  2. Aşağıdaki etkinlik yaşam döngüsü geri çağırmalarını geçersiz kıl ve etkinlik kaybedildiğinde ön plan gönderimi (onPause()) ve yeniden odaklanıyor (onResume()). enableForegroundDispatch() şuradan çağrılmalıdır: ana ileti dizisinde ve yalnızca etkinlik ön plandayken (onResume() çağrısı yapıldığında bunu garanti edersiniz). Taranan NFC'den gelen verileri işlemek için onNewIntent geri çağırma işlemini de uygulamanız gerekir kapanış etiketinin hemen öncesine yapıştırın.
  3. Kotlin

    public override fun onPause() {
        super.onPause()
        adapter.disableForegroundDispatch(this)
    }
    
    public override fun onResume() {
        super.onResume()
        adapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray)
    }
    
    public override fun onNewIntent(intent: Intent) {
        val tagFromIntent: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)
        // do something with tagFromIntent
    }
    

    Java

    public void onPause() {
        super.onPause();
        adapter.disableForegroundDispatch(this);
    }
    
    public void onResume() {
        super.onResume();
        adapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);
    }
    
    public void onNewIntent(Intent intent) {
        Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
        // do something with tagFromIntent
    }