Bu dokümanda, Android'de gerçekleştirdiğiniz temel NFC görevleri açıklanmaktadır. Bu kısımda e-posta göndermek için NFC verilerini NDEF mesajları biçiminde alır ve aşağıdakileri destekleyen Android çerçevesi API'lerini açıklar: özellikler. NDEF olmayan verilerle çalışma konulu bir tartışma da dahil olmak üzere daha ileri düzey konular için Gelişmiş NFC konusuna bakın.
NDEF verileri ve Android ile çalışırken başlıca iki kullanım alanı vardır:
- NFC etiketinden NDEF verilerini okuma
- NDEF mesajlarını bir cihazdan diğerine Android ile ışınlama BeamTM
Bir NFC etiketinden NDEF verilerinin okunması, etiket gönderme sistemi kullanabilir. kategorize edilmiş verilerle ilgilenen bir uygulamadır. Bu uygulamada taranan NFC etiketi amaç filtresi bildirebilir istek üzerine geçerlidir.
Android BeamTM özelliği, cihazın bir NDEF mesajını başka bir cihaza aktarabilirsiniz. Bu etkileşim, ilişkilendirmenin Bluetooth gibi diğer kablosuz teknolojilerden daha veri gönderebiliyor. Çünkü NFC ile gereklidir. İki cihaz geldiğinde bağlantı otomatik olarak başlatılır içine ekleyebilirsiniz. Android Beam bir dizi NFC API'si aracılığıyla kullanılabilir. Böylece tüm uygulamalar veri iletimi yapabilir. bilgileri kontrol edebilirsiniz. Ö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.
Etiket gönderme sistemi
Android destekli cihazlar genellikle ekran kilitliyken NFC etiketlerini arar. Cihazın Ayarlar menüsünde NFC devre dışı bırakılmadığı sürece kilidi açıldığında. Android destekli bir cihaz bir NFC etiketi bulduğunda, istenen davranış kullanıcıya hangi uygulamanın yapılacağını sormadan amacı en uygun tıklayın. Cihazlar NFC etiketlerini çok kısa bir aralıkta taradığından, kullanıcıları muhtemelen manuel olarak bir etkinlik seçerseniz cihazı etiketten uzaklaştırıp bağlantıyı koparmaya zorlarlar. Etkinliğinizi yalnızca etkinliğinizin önem verdiği NFC etiketlerini işleyecek şekilde geliştirmelisiniz Etkinlik Seçici'nin görünmesini engelleyebilir.
Android, bu hedefe ulaşmanıza yardımcı olmak için taranan taramaları analiz eden özel bir etiket dağıtma sistemi sunar. NFC etiketlerini kullanır, ayrıştırır ve taranan verilerle ilgilenen uygulamaları bulmaya çalışır. Google bunu aşağıdakileri yaparak yapar:
- NFC etiketinin ayrıştırılması ve MIME türünü veya veri yükünü tanımlayan bir URI'nin belirlenmesi ekleyin.
- MIME türünü veya URI'yı ve yükü bir intent içine alma. Bu ilk iki ilgili adımlar NFC etiketlerinin MIME türleri ve URI'leriyle nasıl eşlenir? başlıklı makalede açıklanmıştır.
- Amaca dayalı bir etkinlik başlatır. Bu konu NFC Etiketlerinin Uygulamalara Nasıl Dağıtılır?
NFC etiketleri MIME türleri ve URI'lerle nasıl eşlenir?
NFC uygulamalarınızı yazmaya başlamadan önce, uygulamanız gereken farklı NFC etiketlerinin türleri, etiket gönderme sisteminin NFC etiketlerini nasıl ayrıştırdığı ve etiketin sistem bir NDEF mesajı algıladığında bunu yapar. NFC etiketleri farklı şekillerde yazabiliyor. Android, NFC Forumu tarafından tanımlanan NDEF standardını en çok destekleyen NDEF standardını destekler.
NDEF verileri, şunu içeren bir mesaj (NdefMessage
) içinde kapsüllenir:
veya daha fazla kayıt (NdefRecord
). Her NDEF kaydı,
oluşturmak istediğiniz kaydın türünü belirtin. Android
Ayrıca, NDEF verilerini içermeyen diğer etiket türlerini de destekler. Bu etiketlerle çalışırken
android.nfc.tech
paketindeki sınıflarla ilişkilidir. Daha fazla bilgi edinmek için
daha fazla bilgi için Gelişmiş NFC konusuna bakın. Bu diğer etiket türleriyle çalışmak için
Bu nedenle, etiketlerle iletişim kurmak için kendi protokol yığınınızı yazmanızı öneririz. Bu nedenle,
mümkün olduğunca hızlı ve kolay bir şekilde geliştirilebilir ve Android destekli cihazlarda maksimum destek sağlayabilirsiniz.
Not: Tüm NDEF özelliklerini indirmek için NFC Forum Özellikleri'ne ve Uygulama Belgeleri sitesine göz atın ve Nasıl yapıldığını gösteren örnekler için yaygın NDEF kaydı türlerini oluşturma oluşturma konusunda destek alın.
Artık NFC etiketleriyle ilgili biraz bilgi edindiğinize göre aşağıdaki bölümlerde nasıl
Android, NDEF biçimindeki etiketleri işler. Android destekli bir cihaz, NDEF içeren bir NFC etiketini taradığında
iletiyi ayrıştırır ve verilerin MIME türünü veya bu veri türünü tanımlamaya
URI. Sistem bunu yapmak için, NDEF mesajının tamamını nasıl yorumlayacağını belirlemek üzere NdefMessage
içindeki ilk NdefRecord
öğesini okur (NDEF mesajı
birden fazla NDEF kaydına sahip olmalıdır). İyi biçimlendirilmiş bir NDEF mesajında, ilk NdefRecord
şu 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 bu alanı kullanarak Kayıt Türü Tanımı'nı (RTD) belirtebilirsiniz. Geçerli RTD değerleri Tablo 2'de açıklanmıştır. - Değişken uzunluk kimliği
- Kayıt için benzersiz bir tanımlayıcı. Bu alan sık kullanılmasa da Bir etiketi benzersiz şekilde tanımlamanız gerekiyorsa etiket için bir kimlik oluşturabilirsiniz.
- Değişken uzunlukta yük
- Okumak veya yazmak istediğiniz gerçek veri yükü. NDEF mesaj birden fazla NDEF kaydı içerebilir. Bu nedenle, tam yükün ilk NDEF'de olduğunu varsaymayın ve NDEF mesajının kaydını tutmalısınız.
Etiket gönderme sistemi, bir MIME türünü veya URI'yı
NDEF mesajı. Başarılı olursa bu bilgiler, gerçek yükle birlikte bir ACTION_NDEF_DISCOVERED
amacının içinde bulunur. Ancak,
etiket gönderme sisteminin, veri türünü ilk NDEF'ye göre belirleyemediği durumlardır
kullanabilirsiniz. Bu durum, NDEF verileri bir MIME türü veya URI ile eşlenemediğinde ya da
NFC etiketi başlangıçta NDEF verisi içermiyor. Bu gibi durumlarda, etiketin teknolojileri ve yükü hakkında bilgi içeren bir Tag
nesnesi
bir ACTION_TECH_DISCOVERED
niyetinin içine kapsüllenir.
Tablo 1'de, etiket gönderme sisteminin TNF ve türü nasıl eşleştirdiği açıklanmaktadır.
MIME türlerine veya URI'lere otomatik olarak eklenir. Ayrıca, hangi TNF'lerin MIME türü veya URI ile eşlenemeyeceği de açıklanmaktadır.
Bu durumlarda, etiket gönderme sistemi
ACTION_TECH_DISCOVERED
Ö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ı eşler.
URI'ya gönderebilirsiniz. Etiket gönderme sistemi, ACTION_NDEF_DISCOVERED
amacının veri alanındaki bu URI'yı, etiketle ilgili diğer bilgilerle birlikte içerir.
önemli ölçüde ilişkilidir. Diğer yandan TNF_UNKNOWN
türünde bir kayıtla karşılaşırsa 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ış bir biçim: <domain_name>:<service_name> .
Android, bunu formdaki 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 |
TNF_UNKNOWN |
Şu değere geri döner: ACTION_TECH_DISCOVERED . |
TNF_WELL_KNOWN |
MIME türü veya URI'si tür alanına ekleyin. Aşağıdakilerle ilgili daha fazla bilgi için Tablo 2'ye bakın: mevcut RTD'ler ve eşlemeleri. |
Kayıt Türü Tanımı (RTD) | Eşleme |
---|---|
RTD_ALTERNATIVE_CARRIER |
Şu değere geri döner: ACTION_TECH_DISCOVERED . |
RTD_HANDOVER_CARRIER |
Şu değere geri döner: ACTION_TECH_DISCOVERED . |
RTD_HANDOVER_REQUEST |
Şu değere geri döner: ACTION_TECH_DISCOVERED . |
RTD_HANDOVER_SELECT |
Şu değere geri döner: ACTION_TECH_DISCOVERED . |
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 gönderilir?
Etiket gönderme sistemi NFC etiketini ve veya böyle bir istek ile ilgisi olmayan bir uygulamaya filtreler oluşturabilirsiniz. Amacı birden fazla uygulama işleyebilirse Etkinlik Seçici kullanıcının Etkinliği seçebilmesi için sunulur. Etiket gönderme sistemi üç amaç tanımlar: öncelikler en yüksekten en düşüğe doğru sıralanır:
-
ACTION_NDEF_DISCOVERED
: Bu amaç aşağıdakileri başlatmak için kullanılır: NDEF yükü içeren ve tanınan türde bir etiket tarandığında gerçekleşen etkinlik. Bu bir Etkinlik başlatmaya çalışır ve etiket gönderme sistemi bu diğer amaçlardan önce bir amaca hizmet eder. ACTION_TECH_DISCOVERED
:ACTION_NDEF_DISCOVERED
işleyicisi bu amaçla bir uygulama başlatmaya çalışır. Bu taranan etiket varsa intent de doğrudan başlatılır (önceACTION_NDEF_DISCOVERED
başlatılmadan) MIME türü veya URI'siyle eşlenemeyen NDEF verileri içeriyorsa ya da etiket NDEF içermiyorsa bilinen bir etiket teknolojisine sahiptir.ACTION_TAG_DISCOVERED
: Bu amaç başlatıldıACTION_NDEF_DISCOVERED
veyaACTION_TECH_DISCOVERED
öğesini hiçbir etkinlik desteklemiyorsa amaçlar.
Etiket gönderme sisteminin çalışma şekli temelde şöyledir:
- Etiket gönderme sistemi tarafından oluşturulan amaçla bir Etkinlik başlatmayı deneyin
NFC etiketini ayrıştırırken (veya
ACTION_NDEF_DISCOVERED
veyaACTION_TECH_DISCOVERED
). - Bu amaç için filtre uygulanmış bir etkinlik yoksa sonraki
bir uygulama filtreleyene kadar en düşük öncelikli intent (
ACTION_TECH_DISCOVERED
veyaACTION_TAG_DISCOVERED
) intent'e veya etiket gönderme sistemi tüm olası amaçları deneyene kadar kullanılabilir. - 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
niyetiyle çalışın, çünkü bu, en spesifik olan NDEF mesajlarıdır
üçü de var. Bu amaç, uygulamanızı 30 dakikadan daha uygun bir zamanda
kullanıcıya daha iyi bir deneyim
sunmak için birlikte çalışır.
Android manifest dosyasında NFC erişimi isteğinde bulunma
Bir cihazın NFC donanımına erişip NFC amacını düzgün şekilde işlemeden önce bunları beyan edin
AndroidManifest.xml
dosyanızdaki öğeler:
- 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ü. Yalnızca API düzeyi 9 desteklenir
ACTION_TAG_DISCOVERED
aracılığıyla sınırlı etiket gönderir ve yalnızca NDEF mesajlarınaEXTRA_NDEF_MESSAGES
ekstra aracılığıyla erişim. Sıra No: diğer etiket özelliklerine veya G/Ç işlemlerine erişilebilir. API düzeyi 10 kapsamlı okuyucu/yazar desteği, ön plan NDEF aktarma ve API düzeyi özelliklerini içerir 14, Android Beam ve ekstraları kullanarak NDEF mesajlarını diğer cihazlara aktarmanın daha kolay bir yolunu sunar. pratik yöntemleri kullanarak NDEF kayıtlarını oluşturabilirsiniz.<uses-sdk android:minSdkVersion="10"/>
- Uygulamanızın Google Play'de gösterilebilmesi için
uses-feature
öğesi yalnızca NFC donanımı olan cihazlar için:<uses-feature android:name="android.hardware.nfc" android:required="true" />
Uygulamanızda NFC işlevi kullanılıyorsa ancak bu işlev cihazınız için çok önemli değilse, uygulamasında
uses-feature
öğesini çıkarıp NFC kullanılabilirliğini şurada kontrol edebilirsiniz: olup olmadığını kontrol ederekgetDefaultAdapter()
şu andanull
.
NFC amaçları için filtrele
İşlemek istediğiniz bir NFC etiketi tarandığında uygulamanızı başlatmak için uygulamanız
Android manifest'teki NFC amaçlarının biri, ikisi veya üçü için de filtre uygulayabilir. Ancak,
genellikle ACTION_NDEF_DISCOVERED
niyetine göre filtrelemek
uygulamanızın ne zaman başlayacağı konusunda en fazla kontrolü sağlar. ACTION_TECH_DISCOVERED
intent, ACTION_NDEF_DISCOVERED
için hiçbir uygulama filtresi olmadığında
ACTION_NDEF_DISCOVERED
veya yük olmadığında
NDEF ACTION_TAG_DISCOVERED
için filtreleme genellikle
seçin. Birçok uygulama ACTION_TAG_DISCOVERED
tarihinden önce ACTION_NDEF_DISCOVERED
veya ACTION_TECH_DISCOVERED
için filtreleneceğinden başvurunuzun yayınlanma olasılığı düşük
başlatılıyor. ACTION_TAG_DISCOVERED
yalnızca son çare olarak sunuluyor
kullanmak üzere başka hiçbir uygulamanın yüklenmediği durumlarda filtreleme yapmak için
ACTION_NDEF_DISCOVERED
veya ACTION_TECH_DISCOVERED
amacı.
NFC etiketi dağıtımları değişiklik gösterdiği ve çoğu zaman sizin kontrolünüz altında olmadığı için bu durum her zaman Bu nedenle, gerektiğinde diğer iki amaca yönelebilirsiniz. türleri üzerinde kontrol sahibi olsanız da, verilerinizi biçimlendirmek için NDEF etiketleri arasında yer alır. Aşağıdaki bölümlerde, her amaç türü için nasıl filtre uygulayacağınız açıklanmaktadır.
İŞLEM_NDEF_KEŞFEDİLDİ
ACTION_NDEF_DISCOVERED
intent'i filtrelemek için şunu tanımlayın:
intent filtresine ve filtrelemek istediğiniz veri türüyle birlikte İlgili içeriği oluşturmak için kullanılan
ACTION_NDEF_DISCOVERED
için aşağıdaki örnek filtreler
text/plain
MIME türüne sahip amaçlar:
<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, şu biçimde bir URI için filtre uygular:
https://developer.android.com/index.html
<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>
İŞLEM_TEKNOLOJİSİ_KEŞFETME
Etkinliğiniz ACTION_TECH_DISCOVERED
amacına göre filtreliyorsa
etkinliğinizin desteklediği teknolojileri belirten bir XML kaynak dosyası oluşturmanız gerekir
bir tech-list
kümesi içinde. Etkinliğiniz
tech-list
kümesi, reklamı yapılan teknolojilerin alt kümesiyse
etiket tarafından desteklenir. Bunu getTechList()
çağrısıyla alabilirsiniz.
Örneğin, taranan etiket Mifare Classic, NdefFormatable ve NfcA'yı destekliyorsa,
tech-list
kümesi, teknolojilerden üçünü, ikisini veya birini belirtmelidir (ve
else) kullanabilirsiniz.
Aşağıdaki örnekte tüm teknolojiler tanımlanmaktadır. Anahtar kelimeleri kaldırmayanları
NFC etiketi tarafından desteklendiğini unutmayın. Bu dosyayı (istediğinize ad verebilirsiniz)
<project-root>/res/xml
klasör.
<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>
Ayrıca birden fazla tech-list
grubu belirtebilirsiniz. tech-list
öğelerinin her biri
bağımsız olarak değerlendirilir ve tek bir anahtar kelime varsa etkinliğinizin eşleşme olarak
tech-list
grubu, getTechList()
tarafından döndürülen teknolojilerin bir alt kümesidir. Bu, AND
ve OR
sağlar
semantiği hakkında daha fazla bilgi sahibi olmanızı sağlar. Aşağıdaki örnek,
NfcA ve Ndef teknolojileri ya da NfcB ve Ndef teknolojilerini destekleyebilir:
<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, az önce oluşturduğunuz kaynak dosyayı belirtin.
<activity>
içindeki <meta-data>
öğesinde
öğesini kullanın:
<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 Desteklenen Etiketle Çalışma
Technologies (Gelişmiş NFC) dokümanını inceleyin.
ACTION_TAG_KEŞİF
ACTION_TAG_DISCOVERED
için filtrelemek üzere aşağıdaki niyeti kullanın
filtrele:
<intent-filter> <action android:name="android.nfc.action.TAG_DISCOVERED"/> </intent-filter>
Amaçlardan bilgi edinme
NFC amacı nedeniyle bir etkinlik başlarsa taranan NFC hakkında bilgi edinebilirsiniz etiketinden almalısınız. Amaçlar, taranan etikete bağlı olarak aşağıdaki ekstraları içerebilir:
EXTRA_TAG
(gerekli):Tag
nesnesi temsil eder.EXTRA_NDEF_MESSAGES
(isteğe bağlı): NDEF mesajları dizisi ayrıştırılır. Bu ekstra,ACTION_NDEF_DISCOVERED
niyet.EXTRA_ID
(isteğe bağlı): Etiketin alt düzey kimliği.
Bu ekstraları edinmek için etkinliğinizin aşağıdakilerden biriyle başlatılıp başlatılmadığını kontrol edin:
emin olmak için NFC'nin amacı, bir etiketin tarandığından emin olmak ve daha sonra
isteyebilirsiniz. Aşağıdaki örnekte ACTION_NDEF_DISCOVERED
kontrol edilir
NDEF mesajlarını bir intent ekstradan 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 işlem
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 etiketleri veya Android Beam ile veri gönderme. Android 4.0 (API düzeyi 14) sürümünden itibaren
Oluşturmanıza yardımcı olmak için createUri()
yöntemi kullanılabilir
URI otomatik olarak kaydedilir. Android 4.1 (API düzeyi 16) sürümünden itibaren
createExternal()
.
ve createMime()
, oluşturmanıza yardımcı olur
MIME ve harici NDEF kayıtları. Hatalardan kaçınmak için mümkün olduğunda bu yardımcı yöntemleri kullanın
NDEF kayıtlarını manuel olarak oluştururken.
Bu bölümde ayrıca ilgili intent filtresini kullanın. Bu NDEF kaydı örneklerinin tümü, ilk NDEF'de olmalıdır (etikete yazdığınız veya ışınladığınız NDEF mesajının kaydı).
TNF_ABSOLUTE_URI
Not:
Bunun yerine RTD_URI
yazın
TNF_ABSOLUTE_URI
arasında paylaştırır.
Aşağıdaki şekilde bir TNF_ABSOLUTE_URI
NDEF kaydı 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ı için 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
Aşağıdaki yöntemleri kullanarak TNF_MIME_MEDIA
NDEF kaydı 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ı için 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ı için 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
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
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ı için 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 uygulamalarda TNF_EXTERNAL_TYPE
NDEF kaydı oluşturabilirsiniz:
yöntemler:
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ı için 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>
Her ikisini de daha iyi desteklemek amacıyla daha genel NFC etiketi dağıtımları için TNF_EXTERNAL_TYPE
kullanın
Android destekli ve Android olmayan cihazlar.
Not: TNF_EXTERNAL_TYPE
için URN'ler standart biçimdedir:
urn:nfc:ext:example.com:externalType
(ancak NFC Forum RTD spesifikasyonu)
URN'nin urn:nfc:ext:
bölümünün
NDEF kaydı. Bu nedenle, yalnızca alan adını (örnekte example.com
) sağlamanız yeterlidir
ve tür (örnekte externalType
) ile ayrılmalıdır.
TNF_EXTERNAL_TYPE
URN'yi gönderirken, Android urn:nfc:ext:example.com:externalType
URN'yi vnd.android.nfc://ext/example.com:externalType
URI'ye dönüştürür. Bu URI
intent filtresine sahip olması gerekir.
Android uygulaması kayıtları
Android 4.0 (API düzeyi 14) sürümünde sunulan Android Uygulama Kaydı (AAR), NFC etiketi tarandığında uygulamanızın başlatılma olasılığını belirler. AAR, NDEF kaydı içine yerleştirilmiş bir uygulamanın yüklü olması gerekir. NDEF'inizin herhangi bir NDEF kaydına AAR ekleyebilirsiniz mesajı gösterilir. Çünkü Android, NDEF mesajının tamamında AAR'ları arar. AAR bulunursa AAR'deki paket adına göre uygulamaya çalışın. Uygulama, uygulamayı indirmek için Google Play başlatılır.
AAR'ler, diğer uygulamaların aynı amaca yönelik filtreleme yapmasını önlemek ve potansiyel olarak dağıttığınız belirli etiketleri işleme alabilir. AAR'ler yalnızca paket adı kısıtlaması nedeniyle uygulama düzeyinde değil, amaç filtrelemeyi kullanın. Bir niyeti Etkinlik düzeyinde işlemek istiyorsanız amaç filtrelerini kullanın.
Bir etiket AAR içeriyorsa etiket gönderme sistemi aşağıdaki şekilde dağıtım yapar:
- Normalde bir intent filtresi kullanarak Etkinlik başlatmayı deneyin. Eşleşen Etkinlik etkinliği başlatın.
- Amaca göre filtrelenen Etkinlik AAR'yi kullanıyorsanız, amacı birden fazla Etkinlik gerçekleştirebiliyorsa veya amacı gerçekleştirecek bir Etkinlik yoksa AAR tarafından belirtilen uygulama.
- Hiçbir uygulama AAR ile başlayamazsa Google Play'e giderek gerekli yetkiye sahipsiniz demektir.
Not: AAR'leri ve intent dağıtım sistemini ön plan dağıtım sistemi; bu sistem, bir NFC etiketi etkin olduğunda ön plan etkinliğinin öncelikli olmasını sağlar keşfedilebilir. Bu yöntemle, AAR'leri geçersiz kılmak için etkinlik ön planda olmalıdır. intent dağıtım sisteminden çok daha fazlasıdır.
AAR içermeyen taranmış etiketleri yine de filtrelemek istiyorsanız intent filtrelerine uygulanır. Bu, uygulamanız başka etiketlerle ilgileniyorsa yararlıdır AAR içermez. Örneğin, uygulamanızın, Yeşil Ofis’in web sitesine girip üçüncü taraflarca dağıtılan genel etiketlerin yanı sıra dağıttığınız özel etiketler. Unutmamanız gereken noktalar Bu nedenle, etiketleri dağıtırken büyük olasılıkla . İçinde Ayrıca, NFC etiketlerini dağıtırken daha iyi performans göstermesi için NFC etiketlerinizi nasıl çoğu cihaz (Android destekli ve diğer cihazlar) için desteklenir. Bu işlemi gerçekleştirebilirsiniz: uygulamaların ayırt etmesini kolaylaştırmak için nispeten benzersiz bir MIME türü veya URI tanımlamaktır.
Android, AAR oluşturmak için basit bir API sunar.
createApplicationRecord()
Yapmanız gerekenler
AAR'yi NdefMessage
içinde herhangi bir yere yerleştirmektir. Şunu yapmak istemiyorsunuz:
AAR'yi kullanmamanız durumunda, NdefMessage
cihazınızın ilk kaydını kullanmak için
NdefMessage
içine kaydedin. Bunun nedeni, Android'in
sistem, MIME türünü veya çözümü belirlemek için NdefMessage
etiketinin ilk kaydını kontrol eder
Uygulamaların filtreleme amacı oluşturmak için kullanılan etiket URI'si. Aşağıdaki kod
AAR'nin nasıl oluşturulacağını gösterir:
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 basit bir eşler arası veri alışverişine olanak tanır. İlgili içeriği oluşturmak için kullanılan Başka bir cihaza veri ışınlamak isteyen uygulama ön planda olmalı ve cihazın verileri almak kilitlenmiş olmamalıdır. Işın eden cihaz, alıcı ile yeterince temas ettiğinde alıcı cihazda, ışın veren cihazda "Dokunmak için Işınlama" Kullanıcı arayüzü. Kullanıcı daha sonra mesajın alıcı cihaza ışınlanıp iletilmeyeceğini belirler.
Not: Ön plan NDEF aktarma işlemi API düzeyi 10,
Android Beam'e benzer işlevler sunar. Bu API'ler kullanımdan kaldırıldı ancak
eski cihazları desteklemek için mevcuttur. 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()
: Şunları kabul eder: Göndermek için mesaj olarak ayarlanacakNdefMessage
. Mesajı otomatik olarak ışınlar iki cihaz birbirine yeterince yakın mesafede olduğunda.setNdefPushMessageCallback()
: Şunu içeren bir geri çağırmayı kabul eder:createNdefMessage()
Buna, bir cihaz veri ışınlamak için kapsama alanında olduğunda çağrılır. Geri çağırma işlevi, NDEF mesajını yalnızca gerektiğinde.
Bir etkinlik aynı anda yalnızca bir NDEF mesajı aktarabilir. Bu nedenle setNdefPushMessageCallback()
öncelikli olur
değeri setNdefPushMessage()
değerinin üzerindedir. Kullanılacak
aşağıdaki genel yönergelere uyulmalıdır:
- Verileri yayan etkinlik ön planda olmalıdır. Her iki cihazda da kullanmaya devam edebilir.
- Işınladığınız verileri bir
NdefMessage
içine almalısınız nesnesini tanımlayın. - Işınlanmış verileri alan NFC cihazı
com.android.npp
NDEF push protokolü veya NFC Forum'un SNEP'si (Basit NDEF Exchange) Protokol).com.android.npp
protokolü, API düzeyi 9'daki (Android) cihazlar için gereklidir 2.3)'ten API düzeyi 13'e (Android 3.2) çevirin. Hemcom.android.npp
hem de SNEP şurada gereklidir: API düzeyi 14 (Android 4.0) ve sonraki sürümler.
Not: Etkinliğiniz Android Beam'i etkinleştirmişse arka planda standart intent dağıtım sistemi devre dışı bırakılır. Ancak etkinliğiniz aynı zamanda özelliğini etkinleştirir ön planda gönderim özelliğini kullanarak, ön plan sevkiyatı.
Android Beam'i etkinleştirmek için:
NdefRecord
öğelerini içeren birNdefMessage
oluşturun etmek istediğiniz bir ekran resmi oluşturmanız gerekir.NdefMessage
ilesetNdefPushMessage()
çağrısı yapın veyaonCreate()
yöntemindeNfcAdapter.CreateNdefMessageCallback
nesnesindesetNdefPushMessageCallback
çağrısı yapın yararlı olabilir. Bu yöntemler, Android ile etkinleştirmek istediğiniz en az bir etkinlik gerektirir Etkinleştirilecek diğer etkinliklerin isteğe bağlı listesiyle birlikte Işınlama.Genel olarak, Etkinliğinizin yalnızca şunları yapması gerektiğinde
setNdefPushMessage()
kullanılır: iki cihaz iletişim kurmak için kapsama alanında olduğunda her zaman aynı NDEF mesajını gönderir. KullandığınızsetNdefPushMessageCallback
uygulamanın mevcut bağlamına önem veriyor ve bir NDEF mesajı ve kullanıcının uygulamanızda ne yaptığına bağlı olarak.
Aşağıdaki örnek, basit bir etkinliğin onCreate()
yönteminde NfcAdapter.CreateNdefMessageCallback
işlevini nasıl çağırdığını gösterir.
etkinliği (bkz. AndroidBeamDemo)
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, kaldırabileceğiniz bir AAR'yi yorumladığını unutmayın. AAR'yi etkinleştirirseniz AAR'de belirtilen uygulama her zaman Android Beam mesajını alır. Uygulama Google Play uygulamayı indirmeye başlar. Bu nedenle, aşağıdaki niyet filtresi, AAR kullanılıyorsa Android 4.0 veya sonraki sürümleri çalıştıran cihazlar için 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 başlatılabilir
bir NFC etiketini taradığında veya AAR'ye sahip bir Android
com.example.android.beam
yazın veya NDEF biçimli bir ileti MIME kaydı içerdiğinde
application/vnd.com.example.android.beam
türünde.
AAR'ler bir uygulamanın başlatıldığını veya indirildiğini garanti etse de intent filtreleri Çünkü Google Analytics 4'te seçtiğiniz bir Etkinliği her zaman ana Etkinliği başlatmak yerine, bir AAR tarafından belirtilen paketteki ana Etkinliği başlatır. AAR'larda etkinlik düzeyi ayrıntı düzeyi yoktur. Ayrıca, bazı Android destekli cihazlar için kimlik bilgilerini NDEF'nizin ilk NDEF kaydına yerleştirmeniz gerekir. bunları da filtreleyebilirsiniz. Ortak Oluşturma Aracı NDEF kaydı türleri başlıklı makaleyi inceleyin.