Bu dokümanda, Android'de gerçekleştirdiğiniz temel NFC görevleri açıklanmaktadır. Bu kılavuzda, NDEF mesajları biçiminde NFC verilerinin nasıl gönderilip alınacağı açıklanmakta ve bu özellikleri destekleyen Android çerçeve API'leri açıklanmaktadır. NDEF olmayan verilerle çalışma tartışması da dahil olmak üzere daha ileri düzey konular için Gelişmiş NFC bölümüne bakın.
NDEF verileri ve Android ile çalışırken başlıca iki kullanım alanı vardır:
- NFC etiketinden NDEF verilerini okuma
- Android BeamTM ile bir cihazdan diğerine NDEF mesajları gönderme
Bir NFC etiketinden NDEF verilerinin okunması, keşfedilen NFC etiketlerini analiz eden, verileri uygun şekilde sınıflandıran ve kategorilere ayrılmış verilerle ilgilenen bir uygulamayı başlatan etiket gönderme sistemi ile gerçekleştirilir. Taranmış NFC etiketini işlemek isteyen bir uygulama, bir amaç filtresi beyan edebilir ve verileri işlemeyi isteyebilir.
Android BeamTM özelliği, cihazların fiziksel olarak birbirine dokundurularak başka bir cihaza NDEF mesajı iletmesine olanak tanır. Bu etkileşim, Bluetooth gibi diğer kablosuz teknolojilere kıyasla veri göndermek için daha kolay bir yol sağlar. Çünkü NFC'de manuel cihaz keşfi veya eşleme gerekmez. İki cihaz kapsama alanına girdiğinde bağlantı otomatik olarak başlatılır. Android Beam, bir dizi NFC API'si üzerinden kullanılabilir. Böylece tüm uygulamalar cihazlar arasında bilgi iletebilir. Örneğin, Kişiler, Tarayıcı ve YouTube uygulamaları kişileri, web sayfalarını ve videoları diğer cihazlarla paylaşmak için Android Beam'i kullanır.
Etiket gönderme sistemi
Android destekli cihazlar, cihazın Ayarlar menüsünde NFC devre dışı bırakılmamışsa genellikle ekran kilidi açıkken NFC etiketleri arar. Android destekli bir cihaz bir NFC etiketi bulduğunda, istenen davranış, kullanıcıya hangi uygulamanın kullanılacağını sormadan en uygun etkinliğin amacı ele almasını sağlamaktır. Cihazlar NFC etiketlerini çok kısa bir aralıkta taradığından kullanıcıların manuel olarak bir etkinlik seçmesi, cihazı etiketten uzağa taşımaya ve bağlantıyı kesmeye zorlanabilir. Etkinliğinizi, Etkinlik Seçici'nin görünmesini önlemek için yalnızca etkinliğinizin önem verdiği NFC etiketlerini işleyecek şekilde geliştirmeniz gerekir.
Android, bu hedefe ulaşmanıza yardımcı olmak için taranan NFC etiketlerini analiz eden, bunları ayrıştıran ve taranan verilerle ilgilenen uygulamaları bulmaya çalışan özel bir etiket gönderme sistemi sağlar. Bunu yapmak için:
- NFC etiketini ayrıştırma ve MIME türünü veya etiketteki veri yükünü tanımlayan bir URI'yi anlama.
- MIME türü veya URI'yı ve yükü bir intent'e dahil etme. Bu ilk iki adım, NFC etiketleri MIME türleri ve URI'lerle nasıl eşlenir? bölümünde açıklanmıştır.
- Amaca göre bir etkinlik başlatır. Bu, NFC Etiketlerinin Uygulamalara Nasıl Gönderilir? bölümünde açıklanmıştır.
NFC etiketleri MIME türleri ve URI'lerle nasıl eşlenir?
NFC uygulamalarınızı yazmaya başlamadan önce, farklı NFC etiket türlerini, etiket gönderme sisteminin NFC etiketlerini nasıl ayrıştırdığını ve etiket gönderme sisteminin bir NDEF mesajı algıladığında yaptığı özel çalışmayı anlamanız önemlidir. NFC etiketleri çok çeşitli teknolojilerden oluşur ve bu etiketlere birçok farklı şekilde yazılabilir. NFC Forumu tarafından tanımlanan NDEF standardını en fazla Android destekler.
NDEF verileri, bir veya daha fazla kayıt (NdefRecord
) içeren bir mesajın (NdefMessage
) içine yerleştirilir. Her NDEF kaydı, oluşturmak istediğiniz kayıt türünün spesifikasyonuna göre doğru şekilde biçimlendirilmiş olmalıdır. Android, android.nfc.tech
paketindeki sınıfları kullanarak üzerinde çalışabileceğiniz NDEF verisi içermeyen diğer etiket türlerini de destekler. Bu teknolojiler hakkında daha fazla bilgi edinmek için Gelişmiş NFC konusuna bakın. Bu diğer etiket türleriyle çalışmak, etiketlerle iletişim kurmak için kendi protokol yığınınızı yazmayı gerektirir. Bu nedenle, Android destekli cihazlar için geliştirme kolaylığı ve maksimum destek sağlamak amacıyla mümkün olduğunda NDEF'yi kullanmanızı öneririz.
Not: Tam NDEF spesifikasyonlarını indirmek için NFC Forum Spesifikasyonları ve Uygulama Belgeleri sitesine gidin ve NDEF kayıtlarının nasıl oluşturulduğuna dair örnekler için Yaygın NDEF kaydı türleri oluşturma bölümüne bakın.
Artık NFC etiketleri konusunda biraz bilgi sahibi olduğunuza göre, aşağıdaki bölümlerde Android'in NDEF biçimindeki etiketleri nasıl işlediği daha ayrıntılı bir şekilde açıklanmaktadır. Android destekli bir cihaz, NDEF biçimli veriler içeren bir NFC etiketini tararken mesajı ayrıştırır ve verilerin MIME türünü veya URI'yı tanımlamaya çalışır. Bunu yapmak için sistem, NDEF mesajının tamamının nasıl yorumlanacağını belirlemek üzere NdefMessage
içindeki ilk NdefRecord
öğesini okur (bir NDEF mesajında birden fazla NDEF kaydı olabilir). İyi biçimlendirilmiş bir NDEF mesajında ilk NdefRecord
, aşağıdaki alanları içerir:
- 3 bit TNF (Tür Adı Biçimi)
- Değişken uzunluk türü alanının nasıl yorumlanacağını gösterir. Geçerli değerler Tablo 1'de açıklanmıştır.
- Değişken uzunluk türü
- Kaydın türünü açıklar.
TNF_WELL_KNOWN
kullanıyorsanız Kayıt Türü Tanımı'nı (RTD) belirtmek için bu alanı kullanın. Geçerli RTD değerleri Tablo 2'de açıklanmıştır. - Değişken uzunluk kimliği
- Kaydın benzersiz tanımlayıcısıdır. Bu alan sık kullanılmaz, ancak bir etiketi benzersiz bir şekilde tanımlamanız gerekiyorsa bunun için bir kimlik oluşturabilirsiniz.
- Değişken uzunlukta yük
- Okumak veya yazmak istediğiniz gerçek veri yükü. Bir NDEF mesajı, birden fazla NDEF kaydı içerebilir. Bu nedenle, tam yükün NDEF mesajının ilk NDEF kaydında olduğunu varsaymayın.
Etiket gönderme sistemi, bir MIME türünü veya URI'yi NDEF mesajıyla eşlemeye çalışmak için TNF ve tür alanlarını kullanır. Başarılı olursa bu bilgileri gerçek yükle birlikte bir ACTION_NDEF_DISCOVERED
amacının içine dahil eder. Bununla birlikte, etiket gönderme sisteminin ilk NDEF kaydına göre veri türünü belirleyemediği durumlar vardır. Bu durum, NDEF verileri bir MIME türü veya URI ile eşlenemediğinde ya da NFC etiketi başlangıçta NDEF verileri içermediğinde meydana gelir. Bu gibi durumlarda, etiketin teknolojileri ve yük hakkında bilgi içeren bir Tag
nesnesi, bunun yerine bir ACTION_TECH_DISCOVERED
amacının içine yerleştirilir.
Tablo 1'de, etiket gönderme sisteminin TNF ve tür alanlarını MIME türleri veya URI'lerle nasıl eşleştirdiği açıklanmaktadır. Ayrıca, hangi TNF'lerin bir MIME türü veya URI ile eşlenemediğini de açıklar.
Bu durumlarda etiket gönderme sistemi, ACTION_TECH_DISCOVERED
değerine geri döner.
Örneğin, etiket gönderme sistemi TNF_ABSOLUTE_URI
türünde bir kayıtla karşılaşırsa bu kaydın değişken uzunluk türü alanını bir URI ile eşler. Etiket gönderme sistemi, bir ACTION_NDEF_DISCOVERED
amacının veri alanındaki URI'yı etiket hakkındaki yük gibi diğer bilgilerle birlikte içerir. Diğer yandan, TNF_UNKNOWN
türünde bir kayıtla karşılaşırsa bunun yerine etiketin teknolojilerini kapsayan bir amaç oluşturur.
Tablo 1. Desteklenen TNF'ler ve eşlemeleri
Tür Adı Biçimi (TNF) | Eşleme |
---|---|
TNF_ABSOLUTE_URI |
Tür alanına dayalı URI. |
TNF_EMPTY |
ACTION_TECH_DISCOVERED değerine geri döner. |
TNF_EXTERNAL_TYPE |
Tür alanında URN'yi temel alan URI. URN, NDEF türü alanına kısaltılmış bir biçimde kodlanmıştır: <domain_name>:<service_name> .
Android bunu şu biçimde bir URI ile eşler: vnd.android.nfc://ext/<domain_name>:<service_name> . |
TNF_MIME_MEDIA |
Tür alanına bağlı MIME türü. |
TNF_UNCHANGED |
İlk kayıtta geçersiz olduğu için ACTION_TECH_DISCOVERED değerine geri döner. |
TNF_UNKNOWN |
ACTION_TECH_DISCOVERED değerine geri döner. |
TNF_WELL_KNOWN |
Tür alanında ayarladığınız Kayıt Türü Tanımı'na (RTD) bağlı olarak MIME türü veya URI. Mevcut RTD'ler ve eşlemeleri hakkında daha fazla bilgi için Tablo 2'ye bakın. |
Tablo 2. TNF_WELL_KNOWN için desteklenen RTD'ler ve eşlemeleri
Kayıt Türü Tanımı (RTD) | Eşleme |
---|---|
RTD_ALTERNATIVE_CARRIER |
ACTION_TECH_DISCOVERED değerine geri döner. |
RTD_HANDOVER_CARRIER |
ACTION_TECH_DISCOVERED değerine geri döner. |
RTD_HANDOVER_REQUEST |
ACTION_TECH_DISCOVERED değerine geri döner. |
RTD_HANDOVER_SELECT |
ACTION_TECH_DISCOVERED değerine geri döner. |
RTD_SMART_POSTER |
Yükün ayrıştırılmasına dayalı URI. |
RTD_TEXT |
text/plain MIME türü. |
RTD_URI |
Yüke dayalı URI. |
NFC etiketleri uygulamalara nasıl dağıtılır?
Etiket gönderme sistemi, NFC etiketini ve tanımlayıcı bilgilerini kapsayan bir amaç oluşturmayı tamamladığında, niyeti amaca göre filtreleyen ilgili bir uygulamaya gönderir. Amacı birden fazla uygulama işleyebiliyorsa kullanıcının Etkinliği seçebilmesi için Etkinlik Seçici sunulur. Etiket gönderme sistemi, önceliği en yüksekten en düşüğe doğru sıralanmış üç amaç tanımlar:
-
ACTION_NDEF_DISCOVERED
: Bu intent, NDEF yükü içeren ve tanınan türde bir etiket tarandığında bir Etkinlik başlatmak için kullanılır. Bu, en yüksek öncelikli amaçtır ve etiket gönderme sistemi, mümkün olduğunda diğer herhangi bir amaçtan önce bu amaçla bir Etkinlik başlatmaya çalışır. ACTION_TECH_DISCOVERED
:ACTION_NDEF_DISCOVERED
amacını işlemek için hiçbir etkinlik kaydedilmemişse etiket gönderme sistemi bu amaçla bir uygulama başlatmaya çalışır. Bu amaç, taranan etiket bir MIME türü veya URI ile eşlenemeyen NDEF verileri içeriyorsa ya da etiket NDEF verileri içermiyorsa ancak bilinen bir etiket teknolojisine sahipse doğrudan (önceACTION_NDEF_DISCOVERED
başlatılmadan) başlatılır.ACTION_TAG_DISCOVERED
:ACTION_NDEF_DISCOVERED
veyaACTION_TECH_DISCOVERED
amaçlarını hiçbir etkinlik gerçekleştirmiyorsa bu amaç başlatılır.
Etiket gönderme sisteminin çalışma şekli temel olarak şu şekildedir:
- NFC etiketini ayrıştırırken etiket dağıtım sistemi (
ACTION_NDEF_DISCOVERED
veyaACTION_TECH_DISCOVERED
) tarafından oluşturulan amaçla bir Etkinlik başlatmayı deneyin. - Bu amaç için hiçbir etkinlik filtrelenmiyorsa bir uygulama amaç için filtrelenene veya etiket gönderme sistemi olası tüm amaçları deneyene kadar sonraki en düşük öncelikli niyetle (
ACTION_TECH_DISCOVERED
veyaACTION_TAG_DISCOVERED
) bir Etkinlik başlatmayı deneyin. - Amaçların hiçbiri için hiçbir uygulama filtrelenmiyorsa hiçbir şey yapmayın.

Mümkün olduğunda NDEF mesajları ve ACTION_NDEF_DISCOVERED
amacı ile çalışın. Bu amaç, üçü arasından en spesifik olanıdır. Bu amaç, uygulamanızı diğer iki amaçtan daha uygun bir zamanda başlatmanıza olanak tanıyarak kullanıcıya daha iyi bir deneyim sunmanızı sağlar.
Android manifest dosyasında NFC erişimi isteme
Bir cihazın NFC donanımına erişebilmek ve NFC amaçlarını doğru şekilde işleyebilmek için önce AndroidManifest.xml
dosyanızda aşağıdaki öğeleri beyan edin:
- NFC donanımına erişmek için NFC
<uses-permission>
öğesi:<uses-permission android:name="android.permission.NFC" />
- Uygulamanızın destekleyebileceği minimum SDK sürümü. API düzeyi 9, yalnızca
ACTION_TAG_DISCOVERED
üzerinden sınırlı etiket dağıtımını destekler ve NDEF mesajlarına yalnızcaEXTRA_NDEF_MESSAGES
ekstrası üzerinden erişim sağlar. Başka hiçbir etiket özelliğine veya G/Ç işlemine erişilemez. API düzeyi 10, kapsamlı okuyucu/yazar desteğinin yanı sıra ön planda NDEF aktarma özelliğini içerir. API düzeyi 14 ise NDEF mesajlarını Android Beam ile diğer cihazlara aktarmanın daha kolay bir yolunu ve NDEF kayıtları oluşturmak için ekstra kolaylık yöntemleri sunar.<uses-sdk android:minSdkVersion="10"/>
- Uygulamanızın Google Play'de yalnızca NFC donanımına sahip cihazlarda gösterilmesini sağlayan
uses-feature
öğesi:<uses-feature android:name="android.hardware.nfc" android:required="true" />
Uygulamanız NFC işlevi kullanıyorsa ancak bu işlev uygulamanız için önemli değilse
uses-feature
öğesini atlayabilir ve çalışma zamanındagetDefaultAdapter()
öğesininnull
olup olmadığını kontrol ederek NFC kullanılabilirliğini kontrol edebilirsiniz.
NFC amaçları için filtrele
İşlemek istediğiniz bir NFC etiketi tarandığında uygulamanızı başlatmak için uygulamanız, Android manifest dosyasındaki NFC amaçlarından birini, ikisini veya üçüne göre filtreleme yapabilir. Ancak uygulamanızın ne zaman başlayacağını en iyi şekilde kontrol edebilmek için genellikle ACTION_NDEF_DISCOVERED
amacına göre filtreleme yapmak istersiniz. ACTION_TECH_DISCOVERED
amacı, hiçbir uygulamanın ACTION_NDEF_DISCOVERED
için filtrelediği veya yük NDEF olmadığında ACTION_NDEF_DISCOVERED
için yedektir. ACTION_TAG_DISCOVERED
için filtreleme, genellikle filtre uygulayamayacak kadar fazla genel bir kategoridir. Birçok uygulama ACTION_TAG_DISCOVERED
tarihinden önce ACTION_NDEF_DISCOVERED
veya ACTION_TECH_DISCOVERED
için filtrelendiğinden uygulamanızın başlatılma olasılığı düşük olur. ACTION_TAG_DISCOVERED
, yalnızca ACTION_NDEF_DISCOVERED
veya ACTION_TECH_DISCOVERED
amacını yerine getirecek başka bir uygulamanın yüklü olmadığı durumlarda filtreleme yapılacak uygulamalar için son çare olarak kullanılabilir.
NFC etiketi dağıtımları değişiklik gösterdiği ve çoğu zaman sizin kontrolünüzde olmadığından bu her zaman mümkün değildir. Bu nedenle, gerektiğinde diğer iki amacı kullanabilirsiniz. Etiket türlerinin ve yazılan verilerin kontrolü sizde olduğunda etiketlerinizi biçimlendirmek için NDEF kullanmanız önerilir. Aşağıdaki bölümlerde, her amaç türü için nasıl filtreleneceği açıklanmaktadır.
ACTION_NDEF_DISCOVERED (İŞLEM)
ACTION_NDEF_DISCOVERED
amaçlarını filtrelemek için amaç filtresini, filtrelemek istediğiniz veri türüyle birlikte bildirin. Aşağıdaki örnek, ACTION_NDEF_DISCOVERED
için text/plain
MIME türüyle ilişkilidir:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain" /> </intent-filter>
Aşağıdaki örnek, https://developer.android.com/index.html
biçimindeki bir URI için filtre uygular.
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="https" android:host="developer.android.com" android:pathPrefix="/index.html" /> </intent-filter>
ACTION_TECH_DISCOVERED (İŞLEM)
Etkinliğiniz ACTION_TECH_DISCOVERED
amacı için filtre uyguluyorsa bir tech-list
grubu içinde etkinliğinizin desteklediği teknolojileri belirten bir XML kaynak dosyası oluşturmanız gerekir. tech-list
kümesi, etiket tarafından desteklenen teknolojilerin alt kümesiyse etkinliğiniz eşleşme olarak kabul edilir. Bu teknolojileri getTechList()
çağırarak edinebilirsiniz.
Örneğin, taranan etiket MifareKlasik, NdefFormatable ve NfcA'yı destekliyorsa
tech-list
kümenizin etkinliğinizin eşleştirilebilmesi için
üç, iki veya teknolojilerden birini de belirtmesi (ve başka hiçbir şeyi belirtmemesi) gerekir.
Aşağıdaki örnekte tüm teknolojiler tanımlanmaktadır. NFC etiketinizin desteklemediğini
kaldırmanız gerekir. Bu dosyayı <project-root>/res/xml
klasörüne kaydedin (istediğiniz adı verebilirsiniz).
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.IsoDep</tech> <tech>android.nfc.tech.NfcA</tech> <tech>android.nfc.tech.NfcB</tech> <tech>android.nfc.tech.NfcF</tech> <tech>android.nfc.tech.NfcV</tech> <tech>android.nfc.tech.Ndef</tech> <tech>android.nfc.tech.NdefFormatable</tech> <tech>android.nfc.tech.MifareClassic</tech> <tech>android.nfc.tech.MifareUltralight</tech> </tech-list> </resources>
Birden fazla tech-list
grubu da belirtebilirsiniz. tech-list
gruplarının her biri bağımsız olarak değerlendirilir ve tek bir tech-list
kümesi getTechList()
tarafından döndürülen teknolojilerin alt kümesiyse etkinliğiniz eşleşme olarak kabul edilir. Bu, eşleşen teknolojiler için AND
ve OR
anlamları sağlar. Aşağıdaki örnek, NfcA ve Ndef teknolojilerini destekleyebilen veya NfcB ve Ndef teknolojilerini destekleyebilen etiketlerle eşleşmektedir:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <tech-list> <tech>android.nfc.tech.NfcA</tech> <tech>android.nfc.tech.Ndef</tech> </tech-list> <tech-list> <tech>android.nfc.tech.NfcB</tech> <tech>android.nfc.tech.Ndef</tech> </tech-list> </resources>
AndroidManifest.xml
dosyanızda, <activity>
öğesinin içindeki <meta-data>
öğesinde yeni oluşturduğunuz kaynak dosyasını aşağıdaki örnekte olduğu gibi belirtin:
<activity> ... <intent-filter> <action android:name="android.nfc.action.TECH_DISCOVERED"/> </intent-filter> <meta-data android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> ... </activity>
Etiket teknolojileriyle çalışma ve ACTION_TECH_DISCOVERED
amacı hakkında daha fazla bilgi için Gelişmiş NFC dokümanındaki Desteklenen Etiket Teknolojileriyle Çalışma bölümüne bakın.
ACTION_TAG_DISCOVERED
ACTION_TAG_DISCOVERED
için filtreleme yapmak üzere şu amaç filtresini kullanın:
<intent-filter> <action android:name="android.nfc.action.TAG_DISCOVERED"/> </intent-filter>
Amaçlardan bilgi edinme
Bir etkinlik NFC amacı nedeniyle başlarsa amaçtan, taranan NFC etiketi hakkında bilgi edinebilirsiniz. Intent'ler, taranan etikete bağlı olarak aşağıdaki ekstraları içerebilir:
EXTRA_TAG
(gerekli): Taranan etiketi temsil eden birTag
nesnesi.EXTRA_NDEF_MESSAGES
(isteğe bağlı): Etiketten ayrıştırılan NDEF mesajları dizisi.ACTION_NDEF_DISCOVERED
amaçları için bu ekstra zorunludur.EXTRA_ID
(isteğe bağlı): Etiketin alt düzey kimliği.
Bu ekstra özelliklere erişmek için, bir etiketin tarandığından emin olmak amacıyla etkinliğinizin NFC amaçlarından biriyle başlatılıp başlatılmadığını kontrol edin ve ardından ekstraları amaçtan çıkarın. Aşağıdaki örnek, ACTION_NDEF_DISCOVERED
amacını kontrol eder ve ekstra bir intent'den NDEF mesajlarını alır.
Kotlin
override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) ... if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) { intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMessages -> val messages: List<NdefMessage> = rawMessages.map { it as NdefMessage } // Process the messages array. ... } } }
Java
@Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); ... if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) { Parcelable[] rawMessages = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); if (rawMessages != null) { NdefMessage[] messages = new NdefMessage[rawMessages.length]; for (int i = 0; i < rawMessages.length; i++) { messages[i] = (NdefMessage) rawMessages[i]; } // Process the messages array. ... } } }
Alternatif olarak amaçtan bir Tag
nesnesi elde edebilirsiniz. Bu nesne, yükü içerir ve etiketin teknolojilerini numaralandırmanıza olanak tanır:
Kotlin
val tag: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)
Java
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Yaygın NDEF kaydı türlerini oluşturma
Bu bölümde, NFC etiketlerine yazma veya Android Beam ile veri gönderme konusunda size yardımcı olması için yaygın olarak kullanılan NDEF kaydı türlerinin nasıl oluşturulacağı açıklanmaktadır. Android 4.0 (API düzeyi 14) sürümünden başlayarak, URI kayıtlarını otomatik olarak oluşturmanıza yardımcı olmak için createUri()
yöntemi kullanılabilir. Android 4.1'den (API düzeyi 16) itibaren createExternal()
ve createMime()
, MIME ve harici türde NDEF kayıtları oluşturmanıza yardımcı olmak için kullanılabilir. NDEF kayıtlarını manuel olarak oluştururken hatalardan kaçınmak için mümkün olduğunda bu yardımcı yöntemleri kullanın.
Bu bölümde, kayda karşılık gelen amaç filtresinin nasıl oluşturulacağı da açıklanmaktadır. Bu NDEF kaydı örneklerinin tümü, bir etikete veya ışınlamaya yazdığınız NDEF mesajının ilk NDEF kaydında olmalıdır.
TNF_ABSOLUTE_URI
Not: Daha verimli olduğu için TNF_ABSOLUTE_URI
yerine RTD_URI
türünü kullanmanızı öneririz.
TNF_ABSOLUTE_URI
NDEF kaydını aşağıdaki şekilde oluşturabilirsiniz:
Kotlin
val uriRecord = ByteArray(0).let { emptyByteArray -> NdefRecord( TNF_ABSOLUTE_URI, "https://developer.android.com/index.html".toByteArray(Charset.forName("US-ASCII")), emptyByteArray, emptyByteArray ) }
Java
NdefRecord uriRecord = new NdefRecord( NdefRecord.TNF_ABSOLUTE_URI , "https://developer.android.com/index.html".getBytes(Charset.forName("US-ASCII")), new byte[0], new byte[0]);
Önceki NDEF kaydının intent filtresi şöyle görünür:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="https" android:host="developer.android.com" android:pathPrefix="/index.html" /> </intent-filter>
TNF_MIME_MEDIA
TNF_MIME_MEDIA
NDEF kaydını aşağıdaki yöntemlerle oluşturabilirsiniz:
createMime()
yöntemini kullanarak:
Kotlin
val mimeRecord = NdefRecord.createMime( "application/vnd.com.example.android.beam", "Beam me up, Android".toByteArray(Charset.forName("US-ASCII")) )
Java
NdefRecord mimeRecord = NdefRecord.createMime("application/vnd.com.example.android.beam", "Beam me up, Android".getBytes(Charset.forName("US-ASCII")));
NdefRecord
manuel olarak oluşturuluyor:
Kotlin
val mimeRecord = Charset.forName("US-ASCII").let { usAscii -> NdefRecord( NdefRecord.TNF_MIME_MEDIA, "application/vnd.com.example.android.beam".toByteArray(usAscii), ByteArray(0), "Beam me up, Android!".toByteArray(usAscii) ) }
Java
NdefRecord mimeRecord = new NdefRecord( NdefRecord.TNF_MIME_MEDIA , "application/vnd.com.example.android.beam".getBytes(Charset.forName("US-ASCII")), new byte[0], "Beam me up, Android!".getBytes(Charset.forName("US-ASCII")));
Önceki NDEF kaydının intent filtresi şöyle görünür:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="application/vnd.com.example.android.beam" /> </intent-filter>
RTD_TEXT ile TNF_WELL_KNOWN
TNF_WELL_KNOWN
NDEF kaydını aşağıdaki şekilde oluşturabilirsiniz:
Kotlin
fun createTextRecord(payload: String, locale: Locale, encodeInUtf8: Boolean): NdefRecord { val langBytes = locale.language.toByteArray(Charset.forName("US-ASCII")) val utfEncoding = if (encodeInUtf8) Charset.forName("UTF-8") else Charset.forName("UTF-16") val textBytes = payload.toByteArray(utfEncoding) val utfBit: Int = if (encodeInUtf8) 0 else 1 shl 7 val status = (utfBit + langBytes.size).toChar() val data = ByteArray(1 + langBytes.size + textBytes.size) data[0] = status.toByte() System.arraycopy(langBytes, 0, data, 1, langBytes.size) System.arraycopy(textBytes, 0, data, 1 + langBytes.size, textBytes.size) return NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, ByteArray(0), data) }
Java
public NdefRecord createTextRecord(String payload, Locale locale, boolean encodeInUtf8) { byte[] langBytes = locale.getLanguage().getBytes(Charset.forName("US-ASCII")); Charset utfEncoding = encodeInUtf8 ? Charset.forName("UTF-8") : Charset.forName("UTF-16"); byte[] textBytes = payload.getBytes(utfEncoding); int utfBit = encodeInUtf8 ? 0 : (1 << 7); char status = (char) (utfBit + langBytes.length); byte[] data = new byte[1 + langBytes.length + textBytes.length]; data[0] = (byte) status; System.arraycopy(langBytes, 0, data, 1, langBytes.length); System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length); NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], data); return record; }
Önceki NDEF kaydının intent filtresi şöyle görünür:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter>
RTD_URI ile TNF_WELL_KNOWN
TNF_WELL_KNOWN
NDEF kaydını aşağıdaki yöntemlerle oluşturabilirsiniz:
createUri(String)
yöntemini kullanarak:
Kotlin
val rtdUriRecord1 = NdefRecord.createUri("https://example.com")
Java
NdefRecord rtdUriRecord1 = NdefRecord.createUri("https://example.com");
createUri(Uri)
yöntemini kullanarak:
Kotlin
val rtdUriRecord2 = Uri.parse("https://example.com").let { uri -> NdefRecord.createUri(uri) }
Java
Uri uri = Uri.parse("https://example.com"); NdefRecord rtdUriRecord2 = NdefRecord.createUri(uri);
NdefRecord
manuel olarak oluşturuluyor:
Kotlin
val uriField = "example.com".toByteArray(Charset.forName("US-ASCII")) val payload = ByteArray(uriField.size + 1) //add 1 for the URI Prefix payload [0] = 0x01 //prefixes https://www. to the URI System.arraycopy(uriField, 0, payload, 1, uriField.size) //appends URI to payload val rtdUriRecord = NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, ByteArray(0), payload)
Java
byte[] uriField = "example.com".getBytes(Charset.forName("US-ASCII")); byte[] payload = new byte[uriField.length + 1]; //add 1 for the URI Prefix payload[0] = 0x01; //prefixes https://www. to the URI System.arraycopy(uriField, 0, payload, 1, uriField.length); //appends URI to payload NdefRecord rtdUriRecord = new NdefRecord( NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, new byte[0], payload);
Önceki NDEF kaydının intent filtresi şöyle görünür:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="https" android:host="example.com" android:pathPrefix="" /> </intent-filter>
TNF_EXTERNAL_TYPE
Aşağıdaki yöntemlerle TNF_EXTERNAL_TYPE
NDEF kaydı oluşturabilirsiniz:
createExternal()
yöntemini kullanarak:
Kotlin
var payload: ByteArray //assign to your data val domain = "com.example" //usually your app's package name val type = "externalType" val extRecord = NdefRecord.createExternal(domain, type, payload)
Java
byte[] payload; //assign to your data String domain = "com.example"; //usually your app's package name String type = "externalType"; NdefRecord extRecord = NdefRecord.createExternal(domain, type, payload);
NdefRecord
manuel olarak oluşturuluyor:
Kotlin
var payload: ByteArray ... val extRecord = NdefRecord( NdefRecord.TNF_EXTERNAL_TYPE, "com.example:externalType".toByteArray(Charset.forName("US-ASCII")), ByteArray(0), payload )
Java
byte[] payload; ... NdefRecord extRecord = new NdefRecord( NdefRecord.TNF_EXTERNAL_TYPE, "com.example:externalType".getBytes(Charset.forName("US-ASCII")), new byte[0], payload);
Önceki NDEF kaydının intent filtresi şöyle görünür:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="vnd.android.nfc" android:host="ext" android:pathPrefix="/com.example:externalType"/> </intent-filter>
Hem Android destekli hem de Android olmayan cihazları daha iyi desteklemek amacıyla daha genel NFC etiketi dağıtımları için TNF_EXTERNAL_TYPE
kullanın.
Not: TNF_EXTERNAL_TYPE
için URN'ler, standart biçimdir: urn:nfc:ext:example.com:externalType
ancak NFC Forum RTD spesifikasyonunda, URN'nin urn:nfc:ext:
bölümünün NDEF kaydından çıkarılması gerektiği belirtilmektedir. Yani yalnızca, iki nokta üst üste ile ayrılmış alan adı (örnekte example.com
) ve tür (örnekte externalType
) olacaktır.
TNF_EXTERNAL_TYPE
gönderilirken Android, urn:nfc:ext:example.com:externalType
URN'sini vnd.android.nfc://ext/example.com:externalType
URI'sine dönüştürür. Bu URL, örnekteki amaç filtresinde belirtilmiştir.
Android uygulaması kayıtları
Android 4.0'da (API düzeyi 14) kullanıma sunulan Android Uygulama Kaydı (AAR), uygulamanızın NFC etiketi tarandığında başlatıldığına dair daha yüksek bir kesinlik sağlar. AAR, NDEF kaydına yerleştirilmiş bir uygulamanın paket adını içerir. Android, NDEF mesajının tamamında AAR'leri aradığından, NDEF mesajınızın herhangi bir NDEF kaydına AAR ekleyebilirsiniz. AAR bulursa uygulamayı AAR'deki paket adına göre başlatır. Uygulama cihazda yoksa Google Play başlatılır ve uygulama indirilir.
AAR'ler, diğer uygulamaların aynı amaç için filtreleme yapmasını ve dağıttığınız belirli etiketleri potansiyel olarak işlemesini önlemek istediğinizde yararlıdır. AAR'ler, paket adı kısıtlaması nedeniyle yalnızca uygulama düzeyinde desteklenir. Amaç filtrelemede olduğu gibi Etkinlik düzeyinde desteklenmez. Bir amacı Etkinlik düzeyinde işlemek istiyorsanız amaç filtrelerini kullanın.
Bir etiket bir AAR içeriyorsa etiket gönderme sistemi aşağıdaki şekilde gönderir:
- Normalde amaç filtresi kullanarak etkinlik başlatmayı deneyin. Amaçla eşleşen Etkinlik AAR ile de eşleşiyorsa Etkinliği başlatın.
- Niyet için filtreleyen Etkinlik AAR ile eşleşmiyorsa, amacı birden fazla Etkinlik işleyebiliyorsa veya niyeti hiçbir Etkinlik işleme koymuyorsa AAR tarafından belirtilen uygulamayı başlatın.
- Hiçbir uygulama AAR ile başlayamazsa Google Play'e giderek AAR'ye dayalı uygulamayı indirin.
Not: AAR'leri ve amaç dağıtım sistemini ön plan gönderim sistemiyle geçersiz kılabilirsiniz. Bu sistem, bir NFC etiketi keşfedildiğinde ön plan etkinliğine öncelik verilmesini sağlar. Bu yöntemle, AAR'leri ve amaç dağıtım sistemini geçersiz kılmak için etkinliğin ön planda olması gerekir.
AAR içermeyen taranmış etiketleri yine de filtrelemek istiyorsanız amaç filtrelerini normal şekilde bildirebilirsiniz. Bu, uygulamanız AAR içermeyen diğer etiketlerle ilgileniyorsa yararlıdır. Örneğin, uygulamanızın dağıttığınız özel etiketlerin yanı sıra üçüncü taraflarca dağıtılan genel etiketleri de işlediğinden emin olmak isteyebilirsiniz. AAR'lerin, Android 4.0 veya sonraki sürümlere özel olduğunu unutmayın. Bu nedenle, etiketleri dağıtırken en geniş cihaz yelpazesini desteklemek için AAR'ler ve MIME türlerinin/URI'lerinin bir kombinasyonunu kullanmak isteyebilirsiniz. Buna ek olarak, NFC etiketlerini dağıtırken çoğu cihazda (Android destekli ve diğer cihazlar) desteği etkinleştirmek için NFC etiketlerinizi nasıl yazmak istediğinizi düşünün. Bunu, uygulamaların daha kolay ayırt etmesini sağlamak için nispeten benzersiz bir MIME türü veya URI tanımlayarak yapabilirsiniz.
Android, AAR oluşturmak için basit bir API (createApplicationRecord()
) sağlar. Tek yapmanız gereken AAR'yi NdefMessage
içindeki herhangi bir yere yerleştirmektir. AAR, NdefMessage
içindeki tek kayıt olmadığı sürece NdefMessage
cihazınızın ilk kaydını kullanmak istemezsiniz. Bunun nedeni, Android sisteminin etiketin MIME türünü veya URI'sını belirlemek için ilk NdefMessage
kaydını kontrol etmesidir. Etiketin URI'sı, uygulamaların filtrelenmesi amacıyla bir amaç oluşturmak için kullanılır. Aşağıdaki kod, bir AAR'nin nasıl oluşturulacağını göstermektedir:
Kotlin
val msg = NdefMessage( arrayOf( ..., NdefRecord.createApplicationRecord("com.example.android.beam") ) )
Java
NdefMessage msg = new NdefMessage( new NdefRecord[] { ..., NdefRecord.createApplicationRecord("com.example.android.beam")} ); )
NDEF mesajlarını diğer cihazlara gönderme
Android Beam, Android destekli iki cihaz arasında eşler arası basit bir veri alışverişi sağlar. Verileri başka bir cihaza ışınlamak isteyen uygulama ön planda olmalı ve verileri alan cihaz kilitli olmamalıdır. Işınlama cihazı, bir alma cihazıyla yeterince yakın olduğunda ışın veren cihaz, "Dokun Gönderme" kullanıcı arayüzünü görüntüler. Daha sonra kullanıcı, mesajın alıcı cihaza ışınlanıp gönderilmeyeceğini seçebilir.
Not: Ön plan NDEF aktarması, Android Beam ile benzer işlev sağlayan API düzeyi 10'da kullanılabiliyordu. Bu API'ler o zamandan beri kullanımdan kaldırılmış olsa da eski cihazları desteklemek için kullanılabilirler. Daha fazla bilgi için enableForegroundNdefPush()
dokümanına bakın.
Aşağıdaki iki yöntemden birini çağırarak uygulamanız için Android Beam'i etkinleştirebilirsiniz:
setNdefPushMessage()
: Işınlanacak mesaj olarak ayarlamak için birNdefMessage
kabul eder. İki cihaz yeterince yakında olduğunda mesajı otomatik olarak ışınlar.setNdefPushMessageCallback()
:createNdefMessage()
içeren bir geri çağırmayı kabul eder. Bu geri çağırma, bir cihaz veri ışınlanacak kapsama alanında olduğunda çağrılır. Geri çağırma, NDEF mesajını yalnızca gerektiğinde oluşturmanıza olanak tanır.
Bir etkinlik aynı anda yalnızca bir NDEF mesajı aktarabilir. Bu nedenle, her ikisi de ayarlanmışsa setNdefPushMessageCallback()
, setNdefPushMessage()
mesajına göre öncelikli olur. Android Beam'i kullanmak için aşağıdaki genel yönergelere uyulması gerekir:
- Verileri ışınlayan etkinlik ön planda olmalıdır. Her iki cihazın da ekranlarının kilidi açık olmalıdır.
- Işınladığınız verileri bir
NdefMessage
nesnesine kapsüllemeniz gerekir. - Işınlamalı verileri alan NFC cihazı,
com.android.npp
NDEF aktarma protokolünü veya NFC Forumu'nun SNEP'sini (Basit NDEF Değişim Protokolü) desteklemelidir.com.android.npp
protokolü, API düzeyi 9 (Android 2.3) ile API düzeyi 13 (Android 3.2) arasındaki cihazlar için zorunludur.com.android.npp
ve SNEP, API düzeyi 14 (Android 4.0) ve sonraki sürümlerde gereklidir.
Not: Etkinliğiniz Android Beam'i etkinleştiriyorsa ve ön plandaysa standart amaç dağıtım sistemi devre dışı bırakılır. Bununla birlikte, etkinliğiniz ön plan gönderimini de etkinleştiriyorsa ön plan gönderiminde ayarlanan amaç filtreleriyle eşleşen etiketleri taramaya devam edebilir.
Android Beam'i etkinleştirmek için:
- Diğer cihaza aktarmak istediğiniz
NdefRecord
öğelerini içeren birNdefMessage
oluşturun. setNdefPushMessage()
öğesiniNdefMessage
ile çağırın veya etkinliğinizinonCreate()
yöntemindeki birNfcAdapter.CreateNdefMessageCallback
nesnesinde geçensetNdefPushMessageCallback
işlevini çağırın. Bu yöntemler, Android Beam ile etkinleştirmek istediğiniz en az bir etkinliğin yanı sıra etkinleştirilecek diğer etkinliklerin isteğe bağlı bir listesini gerektirir.Genel olarak, Etkinliğinizin yalnızca her zaman aynı NDEF mesajını aktarması gerekiyorsa, iki cihaz iletişim kuracak kapsama alanındayken
setNdefPushMessage()
kullanmanız gerekir. Uygulamanız, uygulamanın mevcut bağlamını önemsediğinde ve kullanıcının uygulamanızda ne yaptığına bağlı olarak bir NDEF mesajı aktarmak istediğindesetNdefPushMessageCallback
kullanırsınız.
Aşağıdaki örnek, basit bir etkinliğin bir etkinliğin onCreate()
yönteminde NfcAdapter.CreateNdefMessageCallback
yöntemini nasıl çağırdığını gösterir (örneğin tamamı için AndroidBeamDemo'ya bakın). Bu örnekte, MIME kaydı oluşturmanıza yardımcı olacak yöntemler de bulunmaktadır:
Kotlin
package com.example.android.beam import android.app.Activity import android.content.Intent import android.nfc.NdefMessage import android.nfc.NdefRecord import android.nfc.NfcAdapter import android.nfc.NfcAdapter.CreateNdefMessageCallback import android.nfc.NfcEvent import android.os.Bundle import android.os.Parcelable import android.widget.TextView import android.widget.Toast import java.nio.charset.Charset class Beam : Activity(), NfcAdapter.CreateNdefMessageCallback { private var nfcAdapter: NfcAdapter? = null private lateinit var textView: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) textView = findViewById(R.id.textView) // Check for available NFC Adapter nfcAdapter = NfcAdapter.getDefaultAdapter(this) if (nfcAdapter == null) { Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show() finish() return } // Register callback nfcAdapter?.setNdefPushMessageCallback(this, this) } override fun createNdefMessage(event: NfcEvent): NdefMessage { val text = "Beam me up, Android!\n\n" + "Beam Time: " + System.currentTimeMillis() return NdefMessage( arrayOf( createMime("application/vnd.com.example.android.beam", text.toByteArray()) ) /** * The Android Application Record (AAR) is commented out. When a device * receives a push with an AAR in it, the application specified in the AAR * is guaranteed to run. The AAR overrides the tag dispatch system. * You can add it back in to guarantee that this * activity starts when receiving a beamed message. For now, this code * uses the tag dispatch system. *///,NdefRecord.createApplicationRecord("com.example.android.beam") ) } override fun onResume() { super.onResume() // Check to see that the Activity started due to an Android Beam if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) { processIntent(intent) } } override fun onNewIntent(intent: Intent) { // onResume gets called after this to handle the intent setIntent(intent) } /** * Parses the NDEF Message from the intent and prints to the TextView */ private fun processIntent(intent: Intent) { textView = findViewById(R.id.textView) // only one message sent during the beam intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMsgs -> (rawMsgs[0] as NdefMessage).apply { // record 0 contains the MIME type, record 1 is the AAR, if present textView.text = String(records[0].payload) } } } }
Java
package com.example.android.beam; import android.app.Activity; import android.content.Intent; import android.nfc.NdefMessage; import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.nfc.NfcAdapter.CreateNdefMessageCallback; import android.nfc.NfcEvent; import android.os.Bundle; import android.os.Parcelable; import android.widget.TextView; import android.widget.Toast; import java.nio.charset.Charset; public class Beam extends Activity implements CreateNdefMessageCallback { NfcAdapter nfcAdapter; TextView textView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView textView = (TextView) findViewById(R.id.textView); // Check for available NFC Adapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); if (nfcAdapter == null) { Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show(); finish(); return; } // Register callback nfcAdapter.setNdefPushMessageCallback(this, this); } @Override public NdefMessage createNdefMessage(NfcEvent event) { String text = ("Beam me up, Android!\n\n" + "Beam Time: " + System.currentTimeMillis()); NdefMessage msg = new NdefMessage( new NdefRecord[] { createMime( "application/vnd.com.example.android.beam", text.getBytes()) /** * The Android Application Record (AAR) is commented out. When a device * receives a push with an AAR in it, the application specified in the AAR * is guaranteed to run. The AAR overrides the tag dispatch system. * You can add it back in to guarantee that this * activity starts when receiving a beamed message. For now, this code * uses the tag dispatch system. */ //,NdefRecord.createApplicationRecord("com.example.android.beam") }); return msg; } @Override public void onResume() { super.onResume(); // Check to see that the Activity started due to an Android Beam if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) { processIntent(getIntent()); } } @Override public void onNewIntent(Intent intent) { // onResume gets called after this to handle the intent setIntent(intent); } /** * Parses the NDEF Message from the intent and prints to the TextView */ void processIntent(Intent intent) { textView = (TextView) findViewById(R.id.textView); Parcelable[] rawMsgs = intent.getParcelableArrayExtra( NfcAdapter.EXTRA_NDEF_MESSAGES); // only one message sent during the beam NdefMessage msg = (NdefMessage) rawMsgs[0]; // record 0 contains the MIME type, record 1 is the AAR, if present textView.setText(new String(msg.getRecords()[0].getPayload())); } }
Bu kodun bir AAR'yi açıkladığını unutmayın. Bu AAR'yi kaldırabilirsiniz. AAR'yi etkinleştirirseniz AAR'de belirtilen uygulama her zaman Android Beam mesajını alır. Uygulama mevcut değilse Google Play uygulamayı indirmeye başlar. Bu nedenle, AAR kullanılıyorsa Android 4.0 veya üzeri cihazlar için aşağıdaki intent filtresi teknik olarak gerekli değildir:
<intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="application/vnd.com.example.android.beam"/> </intent-filter>
Bu intent filtresiyle com.example.android.beam
uygulaması artık bir NFC etiketini taradığında veya com.example.android.beam
türünde AAR içeren bir Android Beam aldığında ya da NDEF biçimindeki bir mesaj application/vnd.com.example.android.beam
türünde bir MIME kaydı içerdiğinde başlatılabilir.
AAR'ler bir uygulamanın başlatılmasını veya indirilmesini garanti etse de intent filtreleri önerilir. Çünkü amaç filtreleri, ana Etkinliği her zaman bir AAR tarafından belirtilen paket içinde başlatmak yerine, uygulamanızda istediğiniz bir Etkinliği başlatmanızı sağlar. AAR'lerin etkinlik düzeyi ayrıntı düzeyi yoktur. Ayrıca, Android destekli bazı cihazlar AAR'leri desteklemediğinden, her ihtimale karşı NDEF mesajlarınızın ilk NDEF kaydına kimlik bilgilerini yerleştirmeniz ve bu bilgiler için filtreleme yapmanız gerekir. Kayıt oluşturma hakkında daha fazla bilgi için Yaygın NDEF kaydı Türleri oluşturma bölümüne bakın.