Bu dokümanda, Android'de gerçekleştirdiğiniz temel NFC işlemleri açıklanmaktadır. Bu makalede, NFC verilerinin NDEF mesajları biçiminde nasıl gönderileceği ve alınacağı açıklanmakta, ayrıca bu özellikleri destekleyen Android çerçeve API'leri açıklanmaktadır. NDEF olmayan verilerle çalışma hakkında bilgi de dahil olmak üzere daha ileri düzey konular için İleri seviye NFC başlıklı makaleyi inceleyin.
NFC etiketindeki NDEF verilerinin okunması, keşfedilen NFC etiketlerini analiz eden, verileri uygun şekilde kategorilere ayıran ve kategorize edilmiş verilerle ilgilenen bir uygulamayı başlatan etiket dağıtım sistemi ile yönetilir. Taranan NFC etiketini işlemek isteyen bir uygulama intent filtresi tanımlayabilir ve verileri işleme isteğinde bulunabilir.
Etiket dağıtım sistemi
Android cihazlar, cihazın Ayarlar menüsünde NFC devre dışı bırakılmadığı sürece ekran kilidi açıkken genellikle NFC etiketleri arar. Android destekli bir cihaz NFC etiketi keşfettiğinde, istenen davranış, kullanıcıya hangi uygulamayı kullanacağını sormadan en uygun etkinliğin amacı ele almasıdır. Cihazlar NFC etiketlerini çok kısa bir mesafeden taradığından, kullanıcıların bir etkinliği manuel olarak seçmesi durumunda cihazı etiketten uzaklaştırıp bağlantıyı kesmeleri muhtemeldir. Etkinlik Seçici'nin görünmesini önlemek için etkinliğinizi yalnızca etkinliğinizin ilgilendiğ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, ayrıştıran ve taranan verilerle ilgilenen uygulamaları bulmaya çalışan özel bir etiket dağıtım sistemi sağlar. Bunu şu şekilde yapar:
- NFC etiketini ayrıştırma ve etiketteki veri yükünü tanımlayan MIME türünü veya URI'yi belirleme.
- MIME türünü veya URI'yi ve yük verisini bir intent içine yerleştirme. İlk iki adım NFC etiketlerinin MIME türleri ve URI'lerle eşlenmesi bölümünde açıklanmıştır.
- Intent'e göre bir etkinlik başlatır. Bu konu NFC Etiketlerinin Uygulamalara Gönderilmesi bölümünde açıklanmıştır.
NFC etiketlerinin MIME türleri ve URI'lerle eşlenmesi
NFC uygulamalarınızı yazmaya başlamadan önce farklı NFC etiketi türlerini, etiket dağıtım sisteminin NFC etiketlerini nasıl ayrıştırdığını ve etiket dağıtım sisteminin bir NDEF mesajı algıladığında yaptığı özel işlemi anlamanız önemlidir. NFC etiketleri çok çeşitli teknolojilerden oluşur ve bunlara birçok farklı şekilde veri yazılabilir. Android, NFC Forumu tarafından tanımlanan NDEF standardını en çok destekleyen işletim sistemidir.
NDEF verileri, bir veya daha fazla kayıt (NdefRecord
) içeren bir ileti (NdefMessage
) içine yerleştirilir. Her NDEF kaydı, oluşturmak istediğiniz kayıt türüne göre iyi biçimlendirilmiş olmalıdır. Android, NDEF verileri içermeyen diğer etiket türlerini de destekler. Bu etiketlerle çalışmak için android.nfc.tech
paketindeki sınıfları kullanabilirsiniz. Bu teknolojiler hakkında daha fazla bilgi edinmek için İleri seviye NFC konusuna bakın. Bu diğer etiket türleriyle çalışmak, etiketlerle iletişim kurmak için kendi protokol yığınınızı yazmanızı gerektirir. Bu nedenle, geliştirme kolaylığı ve Android destekli cihazlar için maksimum destek sağlamak amacıyla mümkün olduğunda NDEF kullanmanızı öneririz.
Not: NDEF spesifikasyonlarının tamamını indirmek için NFC Forum Spesifikasyonları ve Uygulama Dokümanları sitesine gidin ve NDEF kayıtlarının nasıl oluşturulacağına dair örnekler için Yaygın NDEF kaydı türleri oluşturma bölümüne bakın.
NFC etiketleri hakkında bilgi sahibi olduğunuza göre, aşağıdaki bölümlerde Android'in NDEF biçimli etiketleri nasıl işlediği daha ayrıntılı olarak açıklanmaktadır. Android destekli bir cihaz, NDEF biçimli veriler içeren bir NFC etiketini taradığında mesajı ayrıştırır ve verilerin MIME türünü veya tanımlama URI'sini bulmaya ç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
'ü okur (NDEF mesajında birden fazla NDEF kaydı olabilir). Düzgün 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 uzunluktaki tür alanının nasıl yorumlanacağını belirtir. 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çıklanmaktadır. - Değişken uzunluktaki kimlik
- Kaydın benzersiz tanımlayıcısıdır. Bu alan sık kullanılmaz ancak bir etiketi benzersiz şekilde tanımlamanız gerekirse etiket için bir kimlik oluşturabilirsiniz.
- Değişken uzunlukta yük
- Okuduğunuz veya yazdığınız gerçek veri yükü. 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 dağıtım 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ükü ile birlikte bir ACTION_NDEF_DISCOVERED
intent'i içine yerleştirir. Ancak etiket dağıtım 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ştan NDEF verileri içermediğinde ortaya çıkar. Bu tür durumlarda, etiketin teknolojileri ve yükleyici hakkında bilgi içeren bir Tag
nesnesi, bunun yerine bir ACTION_TECH_DISCOVERED
intent'inin içine yerleştirilir.
Tablo 1'de, etiket dağıtım sisteminin TNF ve tür alanlarını MIME türleriyle veya URI'lerle nasıl eşlediği açıklanmaktadır. Ayrıca, hangi TNF'lerin bir MIME türü veya URI ile eşlenemeyeceği de açıklanır.
Bu durumlarda etiket dağıtım sistemi ACTION_TECH_DISCOVERED
değerini kullanır.
Örneğin, etiket dağıtım sistemi TNF_ABSOLUTE_URI
türündeki bir kayıtla karşılaşırsa bu kaydın değişken uzunluktaki tür alanını bir URI ile eşler. Etiket dağıtım sistemi, bu URI'yi etiketle ilgili diğer bilgilerle (ör. yük) birlikte bir ACTION_NDEF_DISCOVERED
intent'inin veri alanına yerleştirir. Öte yandan, TNF_UNKNOWN
türündeki bir kayda rastlarsa bunun yerine etiketin teknolojilerini kapsayan bir intent 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ındaki URN'ye dayalı URI. URN, NDEF tür alanına kısaltılmış biçimde kodlanır: <domain_name>:<service_name> .
Android bunu şu biçimteki bir URI ile eşler:
vnd.android.nfc://ext/<domain_name>:<service_name> . |
TNF_MIME_MEDIA |
Tür alanına göre 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. Kullanılabilir 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 öğesinin MIME türü. |
RTD_URI |
Yüke dayalı URI. |
NFC etiketleri uygulamalara nasıl gönderilir?
Etiket dağıtım sistemi, NFC etiketini ve tanımlama bilgilerini kapsayan bir intent oluşturduktan sonra intent'i, intent'i filtreleyen ilgili bir uygulamaya gönderir. Birden fazla uygulama intent'i işleyebiliyorsa kullanıcının etkinliği seçebilmesi için Etkinlik Seçici gösterilir. Etiket dağıtım sistemi, en yüksek öncelikten en düşük önceliğe göre listelenen üç intent tanımlar:
-
ACTION_NDEF_DISCOVERED
: Bu intent, NDEF yükü içeren ve tanınan bir türde olan bir etiket tarandığında bir Etkinlik başlatmak için kullanılır. Bu, en yüksek öncelikli intent'tir ve etiket dağıtım sistemi mümkün olduğunda diğer intent'lerden önce bu intent ile bir etkinlik başlatmaya çalışır.Not: Android 16'dan itibaren, URL bağlantılarını (ör.URI şeması "htttps://" veya "http://") depolayan NFC etiketlerinin taranması,
ACTION_NDEF_DISCOVERED
intent'i yerineACTION_VIEW
intent'ini tetikler. ACTION_TECH_DISCOVERED
:ACTION_NDEF_DISCOVERED
intent'ini işlemek için hiçbir etkinlik kaydedilmezse etiket dağıtım sistemi bu intent ile bir uygulama başlatmaya çalışır. Taranan etiket, MIME türü veya URI ile eşlenemeyen NDEF verileri içeriyorsa ya da etiket NDEF verileri içermiyor ancak bilinen bir etiket teknolojisine sahipse bu intent doğrudan başlatılır (ACTION_NDEF_DISCOVERED
önce başlatılmadan).ACTION_TAG_DISCOVERED
:ACTION_NDEF_DISCOVERED
veyaACTION_TECH_DISCOVERED
amaçları hiçbir etkinlik tarafından yönetilmezse bu intent başlatılır.
Etiket dağıtım sisteminin temel işleyiş şekli şu şekildedir:
- NFC etiketi ayrıştırılırken etiket dağıtım sistemi tarafından oluşturulan intent ile bir etkinlik başlatmayı deneyin (
ACTION_NDEF_DISCOVERED
veyaACTION_TECH_DISCOVERED
). - Bu intent için hiçbir etkinlik filtrelenmiyorsa bir uygulama intent için filtre uygulayana veya etiket dağıtım sistemi tüm olası intent'leri deneyene kadar, bir uygulama başlatana kadar bir etkinlik başlatmayı deneyin.
ACTION_TECH_DISCOVERED
ACTION_TAG_DISCOVERED
- Hiçbir uygulama bu intent'lerden herhangi birini filtrelemiyor ise hiçbir işlem yapmayın.

Mümkün olduğunda NDEF mesajları ve ACTION_NDEF_DISCOVERED
intent'i kullanın. Bu intent, üçü arasında en spesifik olanıdır. Bu intent, uygulamanızı diğer iki intent'ten daha uygun bir zamanda başlatmanıza olanak tanır ve kullanıcıya daha iyi bir deneyim sunar.
Android manifest dosyasında NFC erişimi isteme
Bir cihazın NFC donanımına erişip NFC intent'lerini düzgün şekilde işleyebilmek için AndroidManifest.xml
dosyanızda aşağıdaki öğeleri tanımlamanız gerekir:
- 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 yalnızcaEXTRA_NDEF_MESSAGES
ekstrası üzerinden NDEF mesajlarına erişim sağlar. Diğer etiket özelliklerine veya G/Ç işlemlerine erişilemez. API düzeyi 10, ön planda NDEF itmenin yanı sıra kapsamlı okuyucu/yazar desteği içerir. API düzeyi 14 ise NDEF kaydı oluşturmak için ekstra kolaylık yöntemleri sağlar.<uses-sdk android:minSdkVersion="10"/>
- Uygulamanızın Google Play'de yalnızca NFC donanımına sahip cihazlarda görünmesi için
uses-feature
öğesi:<uses-feature android:name="android.hardware.nfc" android:required="true" />
Uygulamanız NFC işlevini kullanıyorsa ancak bu işlev uygulamanız için kritik öneme sahip değilse
uses-feature
öğesini atlayabilir vegetDefaultAdapter()
değerininnull
olup olmadığını kontrol ederek NFC'nin çalışma zamanında kullanılabilir olup olmadığını kontrol edebilirsiniz.
NFC intent'leri için filtreleme
Uygulamanız, işlemek istediğiniz bir NFC etiketi tarandığında başlatılmak için Android manifest dosyasında NFC intent'lerinden birini, ikisini veya üçünü filtreleyebilir. Ancak, uygulamanızın ne zaman başlayacağını en iyi şekilde kontrol etmek için genellikle ACTION_NDEF_DISCOVERED
intent'i filtrelemek istersiniz. ACTION_TECH_DISCOVERED
amacı, ACTION_NDEF_DISCOVERED
için filtre uygulanmayan uygulamalar olduğunda veya yük NDEF olmadığında ACTION_NDEF_DISCOVERED
için yedek olarak kullanılır. ACTION_TAG_DISCOVERED
için filtreleme yapmak genellikle filtrelenecek çok genel bir kategoridir. Birçok uygulama, ACTION_TAG_DISCOVERED
'den önce ACTION_NDEF_DISCOVERED
veya ACTION_TECH_DISCOVERED
için filtreleme yapar. Bu nedenle, uygulamanızın başlatılma olasılığı düşüktür. ACTION_TAG_DISCOVERED
, yalnızca ACTION_NDEF_DISCOVERED
veya ACTION_TECH_DISCOVERED
intent'ini işlemek için başka uygulama yüklenmemişse uygulamaların filtrelemesi 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ığı için bu her zaman mümkün değildir. Bu nedenle, gerektiğinde diğer iki amaca geçebilirsiniz. Etiket türleri ve yazılan veriler üzerinde kontrol sahibiyseniz etiketlerinizi biçimlendirmek için NDEF'yi kullanmanız önerilir. Aşağıdaki bölümlerde her tür intent için nasıl filtreleme yapılacağı açıklanmaktadır.
ACTION_NDEF_DISCOVERED
ACTION_NDEF_DISCOVERED
intent'lerine göre filtrelemek için intent filtresini, filtrelemek istediğiniz veri türüyle birlikte belirtin. Aşağıdaki örnek, text/plain
MIME türüne sahip ACTION_NDEF_DISCOVERED
intent'leri filtreler:
<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 örnekte, https://developer.android.com/index.html
biçiminde bir URI filtrelenir.
<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
Etkinliğiniz ACTION_TECH_DISCOVERED
intent'i filtreliyorsa etkinliğinizin tech-list
grubunda desteklediği teknolojileri belirten bir XML kaynak dosyası oluşturmanız gerekir. tech-list
kümesi, etiket tarafından desteklenen teknolojilerin alt kümesiyse (getTechList()
çağrısı yaparak elde edebilirsiniz) etkinliğiniz eşleşme olarak kabul edilir.
Örneğin, taranan etiket MifareClassic, NdefFormatable ve NfcA'yı destekliyorsa etkinliğinizin eşlenmesi için tech-list
ayarınızda bu teknolojilerin üçünü, ikisini veya birini (ve başka bir şey) belirtmeniz gerekir.
Aşağıdaki örnekte tüm teknolojiler tanımlanmaktadır. NFC etiketiniz tarafından desteklenmeyenleri kaldırmanız gerekir. Bu dosyayı (istediğiniz adı verebilirsiniz) <project-root>/res/xml
klasörüne kaydedin.
<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
grubu 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
semantiğine olanak tanır. Aşağıdaki örnek, NfcA ve Ndef teknolojilerini veya NfcB ve Ndef teknolojilerini destekleyebilecek etiketleri eşleştirir:
<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, yeni oluşturduğunuz kaynak dosyasını <activity>
öğesinin içindeki <meta-data>
öğesinde aşağıdaki örnekte gösterildiği 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 teknolojileri ve ACTION_TECH_DISCOVERED
intent'iyle çalışma hakkında daha fazla bilgi için Gelişmiş NFC belgesindeki Desteklenen Etiket Teknolojileriyle Çalışma bölümüne bakın.
ACTION_TAG_DISCOVERED
ACTION_TAG_DISCOVERED
için filtre uygulamak üzere aşağıdaki intent filtresini kullanın:
<intent-filter> <action android:name="android.nfc.action.TAG_DISCOVERED"/> </intent-filter>
ACTION_VIEW
Android 16'dan itibaren, URL bağlantılarını depolayan NFC etiketlerinin taranması ACTION_VIEW
intent'ini tetikler. ACTION_VIEW
değerine göre filtre uygulamak için this
bölümüne bakın. URL için uygulamanızı açmak üzere Android app links
simgesini kullanın.
Intent'lerden bilgi edinme
Bir etkinlik NFC intent'i nedeniyle başlatılırsa intent'ten taranan NFC etiketi hakkında bilgi edinebilirsiniz. Intent'ler, taranan etikete bağlı olarak aşağıdaki ekstraları içerebilir:
EXTRA_TAG
(zorunlu): Taranan etiketi temsil eden birTag
nesnesi.EXTRA_NDEF_MESSAGES
(isteğe bağlı): Etiketten ayrıştırılan bir dizi NDEF mesajı. Bu ekstra,ACTION_NDEF_DISCOVERED
intent'lerinde zorunludur.EXTRA_ID
(isteğe bağlı): Etiketin düşük düzey kimliği.
Bu ekstraları elde etmek için etkinliğinizin, bir etiketin tarandığından emin olmak amacıyla NFC intent'lerinden biriyle başlatılıp başlatılmadığını kontrol edin ve ardından intent'ten ekstraları alın. Aşağıdaki örnek, ACTION_NDEF_DISCOVERED
intent'ini kontrol eder ve NDEF mesajlarını bir intent ekstrasından 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, intent'ten bir Tag
nesnesi de alabilirsiniz. Bu nesne, yük verisini içerir ve etiketin teknolojilerini belirtmenize 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ürleri oluşturma
Bu bölümde, NFC etiketlerine yazarken size yardımcı olması için yaygın NDEF kaydı türlerinin nasıl oluşturulacağı açıklanmaktadır. Android 4.0 (API seviyesi 14) ve sonraki sürümlerde, 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ı olur. NDEF kayıtlarını manuel olarak oluştururken hata yapmamak için mümkün olduğunda bu yardımcı yöntemleri kullanın.
Bu bölümde, kayıt için ilgili intent filtresinin nasıl oluşturulacağı da açıklanmaktadır. Bu NDEF kaydı örneklerinin tümü, bir etikete 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ı aşağıdaki şekilde oluşturulabilir:
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 aşağıdaki gibi 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ı oluşturmak için aşağıdaki yöntemlerden birini kullanabilirsiniz:
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
öğesini manuel olarak oluşturma:
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 aşağıdaki gibi 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ı aşağıdaki şekilde oluşturulabilir:
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 aşağıdaki gibi 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ı oluşturmak için aşağıdaki yöntemlerden birini kullanabilirsiniz:
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
öğesini manuel olarak oluşturma:
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 aşağıdaki gibi 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
TNF_EXTERNAL_TYPE
NDEF kaydı aşağıdaki yöntemlerle oluşturulabilir:
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
öğesini manuel olarak oluşturma:
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 aşağıdaki gibi 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 hem de Android olmayan cihazları daha iyi desteklemek için daha genel NFC etiketi dağıtımları için TNF_EXTERNAL_TYPE
kullanın.
Not: TNF_EXTERNAL_TYPE
için URN'lerin standart biçimi urn:nfc:ext:example.com:externalType
'dır. Ancak NFC Forum RTD spesifikasyonu, URN'nin urn:nfc:ext:
kısmının NDEF kaydından çıkarılması gerektiğini belirtir. Dolayısıyla, sağlamanız gereken tek şey, iki nokta üst üste işaretiyle ayrılmış alan (örnekte example.com
) ve tür (örnekte externalType
) değerleridir.
Android, TNF_EXTERNAL_TYPE
'ü gönderirken urn:nfc:ext:example.com:externalType
URN'sini vnd.android.nfc://ext/example.com:externalType
URI'sine dönüştürür. Örnekteki intent filtresi de bunu belirtir.
Android uygulama kayıtları
Android 4.0'ta (API düzeyi 14) kullanıma sunulan Android Uygulama Kaydı (AAR), bir NFC etiketi tarandığında uygulamanızın başlatılacağı konusunda daha güçlü bir güvence sağlar. AAR, bir NDEF kaydının içine yerleştirilmiş bir uygulamanın paket adını içerir. Android, AAR'ler için NDEF mesajının tamamını aradığından NDEF mesajınızın herhangi bir NDEF kaydına AAR ekleyebilirsiniz. Bir AAR bulursa uygulamayı AAR'daki paket adına göre başlatır. Uygulama cihazda yoksa uygulamayı indirmek için Google Play açılır.
Diğer uygulamaların aynı intent için filtreleme yapmasını ve dağıttığınız belirli etiketleri işlemesini engellemek istiyorsanız AAR'lar kullanışlıdır. AAR'lar, paket adı kısıtlaması nedeniyle intent filtrelemede olduğu gibi etkinlik düzeyinde değil, yalnızca uygulama düzeyinde desteklenir. Bir niyeti etkinlik düzeyinde işlemek istiyorsanız intent filtrelerini kullanın.
Bir etiket AAR içeriyorsa etiket dağıtım sistemi aşağıdaki şekilde dağıtım yapar:
- Normal şekilde bir intent filtresi kullanarak etkinlik başlatmayı deneyin. Intent ile eşleşen etkinlik, AAR ile de eşleşiyorsa etkinliği başlatın.
- Intent için filtre uygulayan etkinlik AAR ile eşleşmiyorsa, intent'i birden fazla etkinlik işleyebiliyorsa veya intent'i hiçbir etkinlik işleyemiyorsa AAR tarafından belirtilen uygulamayı başlatın.
- AAR ile başlatılabilen bir uygulama yoksa AAR'a göre uygulamayı indirmek için Google Play'e gidin.
Not: AAR'ları ve intent dağıtım sistemini ön plan dağıtım sistemi ile geçersiz kılabilirsiniz. Bu sistem, NFC etiketi algılandığında ön plan etkinliğinin öncelikli olmasını sağlar. Bu yöntemde, AAR'ların ve intent dağıtım sisteminin geçersiz kılınması için etkinliğin ön planda olması gerekir.
Yine de AAR içermeyen taranan etiketleri filtrelemek istiyorsanız intent filtrelerini normal şekilde tanımlayabilirsiniz. Uygulamanız AAR içermeyen diğer etiketlerle ilgileniyorsa bu özellik faydalıdır. Örneğin, uygulamanızın dağıttığınız özel etiketlerin yanı sıra üçüncü taraflar tarafından dağıtılan genel etiketleri de işlemesini garanti etmek isteyebilirsiniz. AAR'ların Android 4.0 veya sonraki sürümlere özgü olduğunu unutmayın. Bu nedenle, etiketleri dağıtırken büyük olasılıkla en geniş cihaz yelpazesini desteklemek için AAR'lar ile MIME türleri/URI'lerin bir kombinasyonunu kullanmak istersiniz. Ayrıca, NFC etiketlerini dağıtırken çoğu cihaz (Android destekli ve diğer cihazlar) için destek sunmak üzere NFC etiketlerinizi nasıl yazmak istediğinizi düşünün. Bunu, uygulamaların ayırt etmesini kolaylaştırmak için nispeten benzersiz bir MIME türü veya URI tanımlayarak yapabilirsiniz.
Android, AAR oluşturmak için basit bir API sağlarcreateApplicationRecord()
. Tek yapmanız gereken AAR'ı NdefMessage
dosyanıza yerleştirmektir. AAR, NdefMessage
'daki tek kayıt değilse NdefMessage
'ün ilk kaydını kullanmak istemiyorsunuz. Bunun nedeni, Android sisteminin, uygulamaların filtrelemesi için intent oluşturmak amacıyla kullanılan etiketin MIME türünü veya URI'sini belirlemek için NdefMessage
öğesinin ilk kaydını kontrol etmesidir. Aşağıdaki kodda, AAR'ın nasıl oluşturulacağı gösterilmektedir:
Kotlin
val msg = NdefMessage( arrayOf( ..., NdefRecord.createApplicationRecord("com.example.android.beam") ) )
Java
NdefMessage msg = new NdefMessage( new NdefRecord[] { ..., NdefRecord.createApplicationRecord("com.example.android.beam")} ); )
NFC etiketi taraması için uygulama izin verilenler listesi
Android 16'dan itibaren, bir uygulama NFC etiketlerini taramak için ilk NFC intent'ini aldığında kullanıcılara bildirim gönderilir. Bildirimde, kullanıcıya uygulamanın NFC etiketi taramasına artık izin vermeme seçeneği sunulur.
- Uygulamalar,
NfcAdapter.isTagIntentAllowed()
kullanarak kullanıcının NFC etiketlerini taramasına izin verip vermediğini kontrol edebilir. - Uygulamalar,
ACTION_CHANGE_TAG_INTENT_PREFERENCE
intent'ini göndererek kullanıcıdan NFC etiketi taramasına tekrar izin vermesini isteyebilir.
Not: NFC etiketi tarama uygulaması izin listesine Settings > Apps > Special app access > Launch via NFC
bölümünden erişilebilir.