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:
- Şunları belirten bir
ACTION_TECH_DISCOVEREDamacı 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 sistemiACTION_TECH_DISCOVEREDniyetini 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. - Uygulamanız niyeti aldığında
Tagnesnesini şuradan alın: amaç:Kotlin
var tagFromIntent: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)
Java
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
- Aşağıdakilerden birini çağırarak bir
TagTechnologyörneği elde edin:android.nfc.techpaketindeki sınıflarıngetfabrika yöntemi. Şunları yapabilirsiniz:getfabrika yöntemini çağırmadan öncegetTechList()öğesini çağırarak etiketin desteklenen teknolojilerini numaralandırma Örneğin, bir örneği almak içinTagarasındanMifareUltralightiç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:
- Aşağıdaki kodu etkinliğinizin
onCreate()yöntemine ekleyin:- Android sisteminin doldurabilmesi için değişebilir bir
PendingIntentnesnesi 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);
- 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
nullintent 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'iNDEF_DISCOVEREDiç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, };
- 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() } };
- Android sisteminin doldurabilmesi için değişebilir bir
- 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çinonNewIntentgeri çağırma işlemini de uygulamanız gerekir kapanış etiketinin hemen öncesine yapıştırın.
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 }