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
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.
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_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 sistemiACTION_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. - 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);
- Aşağıdakilerden birini çağırarak bir
TagTechnology
örneği elde edin:android.nfc.tech
paketindeki sınıflarınget
fabrika yöntemi. Şunları yapabilirsiniz:get
fabrika yöntemini çağırmadan öncegetTechList()
öğesini çağırarak etiketin desteklenen teknolojilerini numaralandırma Örneğin, bir örneği almak içinTag
arasındanMifareUltralight
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:
- Aşağıdaki kodu etkinliğinizin
onCreate()
yöntemine ekleyin:- 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);
- 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'iNDEF_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, };
- 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çinonNewIntent
geri ç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 }