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, NFC cihazın Ayarlar menüsünde devre dışı bırakılmadığı sürece ekran kilidi açıkken genellikle NFC etiketleri arar. Android destekli bir cihaz bir NFC etiketi bulduğunda, istenen davranış, kullanıcıya hangi uygulamayı kullanacağını sormadan niyeti en uygun etkinliğin işlemesini 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 zorlayabilir. 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, 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'yı ve yükü bir intent içine alma. İlk iki adım NFC etiketlerinin MIME türleri ve URI'lerle eşlenmesi bölümünde açıklanmıştır.
- Amaca dayalı 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 gönderme sisteminin NFC etiketlerini nasıl ayrıştırdığını ve etiket gönderme sisteminin bir NDEF mesajı algıladığında gerçekleştirdiği özel çalışmayı anlamanız önemlidir. NFC etiketleri çok çeşitli teknolojilerle gelebilir ve ayrıca bu etiketlere birçok farklı şekilde yazılabilir. Android, NFC Forum tarafından tanımlanan NDEF standardını en çok destekleyen platformdur.
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 belirlemeye ç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çıklanmıştı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 bilgiler, gerçek yükle birlikte bir ACTION_NDEF_DISCOVERED
amacının içinde bulunur. 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ştan NDEF verileri içermediğinde ortaya çıkar. Bu gibi durumlarda, etiketin teknolojileri ve yük hakkında bilgi içeren bir Tag
nesnesi, bunun yerine bir ACTION_TECH_DISCOVERED
niyetinin içine kapsüllenir.
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 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 kayda rastlarsa 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. Diğer yandan, TNF_UNKNOWN
türünde bir kayıtla karşılaşırsa bunun yerine etiketin teknolojilerini kapsayan bir amaç oluşturur.
Tür Adı Biçimi (TNF) | Eşleme |
---|---|
TNF_ABSOLUTE_URI |
Tür alanına göre URI. |
TNF_EMPTY |
Şu değere geri döner: ACTION_TECH_DISCOVERED . |
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çimde 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, bu nedenle ACTION_TECH_DISCOVERED değerine geri dönüyor. |
TNF_UNKNOWN |
Şu değere geri döner: ACTION_TECH_DISCOVERED . |
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. |
Kayıt Türü Tanımı (RTD) | Eşleme |
---|---|
RTD_ALTERNATIVE_CARRIER |
Şu değere geri döner: ACTION_TECH_DISCOVERED . |
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 gönderme sistemi, NFC etiketini ve tanımlayıcı bilgilerini içeren bir amaç oluşturmayı tamamladığında niyeti, niyeti 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. 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 etiketini ayrıştırırken etiket gönderme sistemi tarafından oluşturulan amaçla (
ACTION_NDEF_DISCOVERED
veyaACTION_TECH_DISCOVERED
) bir Etkinlik başlatmayı deneyin. - 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, intentlerden herhangi biri için filtreleme yapmıyorsa 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 belirgin 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 şu öğeleri tanımlamanız gerekir:
- NFC donanımına erişmek için kullanılan 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 yalnızca NFC donanımına sahip cihazlarda Google Play'de 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 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 her üçü için filtre uygulayabilir. Ancak, uygulamanızın ne zaman başlayacağını en iyi şekilde kontrol edebilmek için genellikle ACTION_NDEF_DISCOVERED
amacını 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. Yazılan etiket türleri ve veriler üzerinde kontrol sahibi olduğunuzda, etiketlerinizi biçimlendirmek için NDEF kullanmanız önerilir. Aşağıdaki bölümlerde, her amaç türü için nasıl filtre uygulayacağınız açıklanmaktadır.
ACTION_NDEF_DISCOVERED
ACTION_NDEF_DISCOVERED
amaçlarına göre filtrelemek için amaç filtresini ve filtrelemek istediğiniz verilerin türünü bildirin. Aşağıdaki örnek, MIME türü text/plain
olan 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
grubu, etiket tarafından desteklenen teknolojilerin bir alt kümesiyse etkinliğiniz eşleşme olarak kabul edilir ve getTechList()
işlevini çağırarak bu bilgilere ulaşabilirsiniz.
Ö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ı <project-root>/res/xml
klasörüne kaydedin (istediğiniz gibi adlandırabilirsiniz).
<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
amacı ile ç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_KEŞİF
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>
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 NDEF mesajları dizisi. Bu ek,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, amaçtan bir Tag
nesnesi alabilirsiniz. Bu nesne, yükü içerir ve etiketin teknolojilerini sıralamanı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ü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
Aşağıdaki yöntemleri kullanarak TNF_WELL_KNOWN
NDEF kaydı 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
öğ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
Aşağıdaki yöntemleri kullanarak 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
öğ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
şeklindedir. 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 bir 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.
AAR içermeyen taranmış etiketleri yine de filtrelemek istiyorsanız amaç filtrelerini normal olarak bildirebilirsiniz. Uygulamanız, AAR içermeyen diğer etiketlerle ilgileniyorsa bu yöntem yararlı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. Uygulamaların ayırt etmesini kolaylaştırmak için görece benzersiz bir MIME türü veya URI tanımlayarak bunu yapabilirsiniz.
Android, AAR oluşturmak için basit bir API sunar
createApplicationRecord()
. Tek yapmanız gereken AAR'ı NdefMessage
'ünüze 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")} ); )