NFC ile ilgili temel bilgiler

Bu dokümanda, Android'de gerçekleştirdiğiniz temel NFC görevleri açıklanmaktadır. Burada, NFC verilerinin NDEF mesajları biçiminde nasıl gönderilip alınacağı açıklanmakta ve bu özellikleri destekleyen Android Framework API'leri açıklanmaktadır. NDEF olmayan verilerle çalış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 iki temel kullanım alanı vardır:

  • Bir NFC etiketinden NDEF verilerini okuma
  • Android BeamTM ile bir cihazdan diğerine NDEF mesajları gönderme

Bir NFC etiketinden NDEF verilerinin okunması, keşfedilen NFC etiketlerini analiz eden, verileri uygun bir şekilde sınıflandıran ve kategorilere ayrılmış verilerle ilgilenen bir uygulamayı başlatan etiket gönderme sistemi ile gerçekleştirilir. Taranan NFC etiketini işlemek isteyen bir uygulama, bir amaç filtresi beyan edebilir ve verileri işlemesini isteyebilir.

Android IşınTM özelliği, cihazların fiziksel olarak birbirine dokundurarak başka bir cihaza NDEF mesajı iletmesini sağlar. NFC'de manuel cihaz keşfi veya eşlemesine gerek olmadığından bu etkileşim, Bluetooth gibi diğer kablosuz teknolojilere kıyasla veri göndermek için daha kolay bir yol sağlar. İki cihaz kapsama alanına girdiğinde bağlantı otomatik olarak başlatılır. Android Işınlama, bir dizi NFC API'si aracılığıyla kullanılabilir. Böylece tüm uygulamalar cihazlar arasında bilgi iletebilir. Örneğin, Kişiler, Tarayıcı ve YouTube uygulamaları; kişileri, web sayfalarını ve videoları diğer cihazlarla paylaşmak için Android ışını kullanır.

Etiket gönderme sistemi

Android destekli cihazlar, cihazın Ayarlar menüsünde NFC devre dışı bırakılmadığı sürece genellikle ekran kilidi açıkken NFC etiketlerini arar. Android destekli bir cihaz bir NFC etiketi bulduğunda, kullanıcıya hangi uygulamayı kullanacağını sormadan en uygun etkinliğin amacı ele almasını sağlamaktır. Cihazlar NFC etiketlerini çok kısa bir mesafeden taradığından, kullanıcıların bir etkinliği manuel olarak seçmeleri onları cihazı etiketten uzağa götürerek bağlantıyı kesmeye zorlayabilir. Etkinliğinizi, yalnızca Etkinlik Seçici'nin görünmesini engellemek için etkinliğinizin önem verdiği NFC etiketlerini işleyecek şekilde geliştirmelisiniz.

Android, bu hedefe ulaşmanıza yardımcı olmak için taranan NFC etiketlerini analiz eden, bunları ayrıştıran ve taranan verilerle ilgilenen uygulamaları bulmaya çalışan özel bir etiket dağıtma sistemi sağlar. Bunu şu şekilde yapar:

  1. NFC etiketini ayrıştırma ve MIME türünü veya etiketteki veri yükünü tanımlayan bir URI'yi bulma.
  2. MIME türü veya URI'sını ve yükü bir intent'e dahil etme. Bu ilk iki adım, NFC etiketleri MIME türleri ve URI'lerle nasıl eşlenir? başlıklı makalede açıklanmıştır.
  3. Amaca göre bir etkinlik başlatır. Bu, NFC Etiketlerinin Uygulamalara Nasıl Gönderilir? bölümünde açıklanmıştır.

NFC etiketleri MIME türleri ve URI'lerle nasıl eşlenir?

NFC uygulamalarınızı yazmaya başlamadan önce, farklı NFC etiket türlerini, etiket dağıtım sisteminin NFC etiketlerini nasıl ayrıştırdığını ve etiket gönderme sisteminin bir NDEF mesajı algıladığında yaptığı özel işi anlamanız önemlidir. NFC etiketleri çok çeşitli teknolojilerden oluşur ve bu etiketlere çok farklı şekillerde yazılmış veriler de olabilir. Android, NFC Forumu tarafından tanımlanan NDEF standardını en fazla destekleyen platformdur.

NDEF verileri, bir veya daha fazla kayıt (NdefRecord) içeren bir mesajın (NdefMessage) içine yerleştirilir. Her NDEF kaydı, oluşturmak istediğiniz kayıt türünün spesifikasyonuna uygun şekilde biçimlendirilmiş olmalıdır. Android, android.nfc.tech paketindeki sınıfları kullanarak bunlarla çalışabileceğiniz NDEF verileri içermeyen diğer etiket türlerini de destekler. Bu teknolojiler hakkında daha fazla bilgi edinmek için Gelişmiş NFC konusuna bakın. Bu diğer etiket türleriyle çalışmak, etiketlerle iletişim kurmak için kendi protokol yığınınızı yazmayı içerir. Bu nedenle, geliştirme kolaylığı ve Android destekli cihazlar için maksimum destek sağlamak amacıyla mümkün olduğunda NDEF'yi kullanmanızı öneririz.

Not: Tüm NDEF teknik özelliklerini indirmek için NFC Forumu Spesifikasyonları ve Başvuru Belgeleri sitesine gidin ve NDEF kayıtlarının nasıl oluşturulduğuna dair örnekler için Yaygın NDEF kaydı türlerini oluşturma başlıklı makaleyi inceleyin.

Artık NFC etiketleri konusunda biraz bilgi sahibi olduğunuza göre, aşağıdaki bölümlerde Android'in NDEF biçimindeki etiketleri nasıl işlediği daha ayrıntılı 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ımlayıcı URI'yı bulmaya çalışır. Sistem bunu yapmak için NDEF mesajının tamamının nasıl yorumlanacağını belirlemek üzere NdefMessage içindeki ilk NdefRecord öğesini okur (bir NDEF mesajında birden fazla NDEF kaydı olabilir). İyi biçimlendirilmiş bir NDEF mesajında ilk NdefRecord, aşağıdaki alanları içerir:

3 bit TNF (Tür Adı Biçimi)
Değişken uzunluk türü alanının nasıl yorumlanacağını gösterir. Geçerli değerler Tablo 1'de açıklanmıştır.
Değişken uzunluk türü
Kaydın türünü açıklar. TNF_WELL_KNOWN kullanıyorsanız Kayıt Türü Tanımı'nı (RTD) belirtmek için bu alanı kullanın. Geçerli RTD değerleri Tablo 2'de açıklanmıştır.
Değişken uzunluk kimliği
Kayıt için benzersiz bir tanımlayıcı. Bu alan sık kullanılmaz ancak bir etiketi benzersiz bir şekilde tanımlamanız gerekiyorsa bu alan için kimlik oluşturabilirsiniz.
Değişken uzunlukta yük
Okumak veya yazmak istediğiniz gerçek veri yükü. Bir NDEF mesajı birden fazla NDEF kaydı içerebilir. Bu nedenle tam yükün, NDEF mesajının ilk NDEF kaydında olduğunu varsaymayın.

Etiket gönderme sistemi, bir MIME türünü veya URI'yı 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ük ile birlikte ACTION_NDEF_DISCOVERED amacının içine dahil edilir. 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üyle veya URI'sıyla eşlenemediğinde ya da NFC etiketi başlangıçta NDEF verisi içermediğinde meydana gelir. Bu gibi durumlarda, etiketin teknolojileri ve yük hakkında bilgi içeren bir Tag nesnesi, bunun yerine bir ACTION_TECH_DISCOVERED amacının içine yerleştirilir.

Tablo 1'de, etiket gönderme sisteminin TNF ve tür alanlarını MIME türleri veya URI'lerle nasıl eşleştirdiği açıklanmaktadır. Ayrıca, hangi TNF'lerin bir MIME türüyle veya URI'sıyla eşlenemeyeceğini de açıklar. Bu durumlarda, etiket gönderme sistemi ACTION_TECH_DISCOVERED değerine geri döner.

Örneğin, etiket gönderme sistemi TNF_ABSOLUTE_URI türünde bir kayıtla karşılaşırsa bu kaydın değişken uzunluk türü alanını bir URI ile eşler. Etiket gönderme sistemi, ACTION_NDEF_DISCOVERED niyetinin veri alanında bu URI'yı etiketle ilgili yük gibi diğer bilgilerle birlikte içerir. Diğer yandan, TNF_UNKNOWN türünde bir kayıtla karşılaşırsa bunun yerine etiketin teknolojilerini kapsayan bir amaç oluşturur.

Tablo 1. Desteklenen TNF'ler ve eşlemeleri

Tür Adı Biçimi (TNF) Eşleme
TNF_ABSOLUTE_URI Tür alanına dayalı URI.
TNF_EMPTY ACTION_TECH_DISCOVERED değerine geri döner.
TNF_EXTERNAL_TYPE Tür alanındaki URN'yi temel alan URI. URN, NDEF türü alanına kısaltılmış bir 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 dayalı 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ı 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 ve eşlemeleri için desteklenen RTD'ler

Kayıt Türü Tanımı (RTD) Eşleme
RTD_ALTERNATIVE_CARRIER ACTION_TECH_DISCOVERED değerine geri döner.
RTD_HANDOVER_CARRIER ACTION_TECH_DISCOVERED değerine geri döner.
RTD_HANDOVER_REQUEST ACTION_TECH_DISCOVERED değerine geri döner.
RTD_HANDOVER_SELECT ACTION_TECH_DISCOVERED değerine geri döner.
RTD_SMART_POSTER Yükün ayrıştırılmasına dayalı URI.
RTD_TEXT text/plain MIME türü.
RTD_URI Yüke dayalı URI.

NFC etiketlerinin uygulamalara nasıl dağıtılır?

Etiket gönderme sistemi, NFC etiketini ve tanımlayıcı bilgilerini kapsayan bir niyet oluşturmayı tamamladığında amacı, amaç için filtreleyen ilgili bir uygulamaya gönderir. Amacı birden fazla uygulama gerçekleştirebiliyorsa kullanıcının Etkinliği seçebilmesi için Etkinlik Seçici sunulur. Etiket gönderme sistemi, en yüksekten en düşüğe doğru sıralanmış üç amaç tanımlar:

  1. ACTION_NDEF_DISCOVERED: Bu amaç, NDEF yükü içeren bir etiket tarandığında ve tanınan türde olduğunda bir Etkinlik başlatmak için kullanılır. Bu, en yüksek öncelikli amaçtır ve etiket gönderme sistemi, mümkün olduğunda diğer herhangi bir amaçtan önce bu amaçla bir Etkinlik başlatmaya çalışır.
  2. ACTION_TECH_DISCOVERED: ACTION_NDEF_DISCOVERED amacını işlemek için hiçbir etkinlik kaydedilmemişse etiket dağıtım sistemi bu amaçla bir uygulama başlatmaya çalışır. Bu amaç, taranan etiket bir MIME türü veya URI'si ile eşlenemeyen NDEF verileri içeriyorsa ya da etiket NDEF verileri içermiyorsa ancak bilinen bir etiket teknolojisine sahipse doğrudan (önce ACTION_NDEF_DISCOVERED başlatılmadan) başlatılır.
  3. ACTION_TAG_DISCOVERED: ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED amaçlarını hiçbir etkinlik işlemediği takdirde bu amaç başlatılır.

Etiket gönderme sisteminin temel çalışma şekli şöyledir:

  1. NFC etiketini ayrıştırırken etiket gönderme sistemi (ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED) tarafından oluşturulan amaçla bir Etkinlik başlatmayı deneyin.
  2. Bu amaç için hiçbir etkinlik filtrelenmiyorsa bir uygulama amaç için filtrelenene veya etiket gönderme sistemi olası tüm amaçları deneyene kadar sonraki en düşük öncelikli niyetle (ACTION_TECH_DISCOVERED veya ACTION_TAG_DISCOVERED) bir Etkinlik başlatmayı deneyin.
  3. Amaçlardan herhangi biri için filtre uygulayan uygulama yoksa işlem yapmayın.
Şekil 1. Etiket Sevkiyatı Sistemi

Mümkün olduğunda NDEF mesajları ve ACTION_NDEF_DISCOVERED amacı ile çalışın. Çünkü bu, üçü arasından en spesifik olanıdır. Bu amaç, uygulamanızı diğer iki amaçtan daha uygun bir zamanda başlatmanıza olanak tanır ve kullanıcıya daha iyi bir deneyim sunar.

Android manifest dosyasında NFC erişimi isteğinde bulunma

Bir cihazın NFC donanımına erişmeden ve NFC amaçlarını doğru şekilde işlemeden önce AndroidManifest.xml dosyanızda aşağıdaki öğeleri beyan edin:

  • NFC donanımına erişmek için NFC <uses-permission> öğesi:
    <uses-permission android:name="android.permission.NFC" />
    
  • Uygulamanızın destekleyebileceği minimum SDK sürümü. API düzey 9, yalnızca ACTION_TAG_DISCOVERED aracılığıyla sınırlı etiket dağıtımını destekler ve yalnızca EXTRA_NDEF_MESSAGES ekstrası üzerinden NDEF mesajlarına erişim sağlar. Başka hiçbir etiket özelliği veya G/Ç işlemine erişilemez. API düzeyi 10, kapsamlı okuyucu/yazar desteğinin yanı sıra ön plandaki NDEF aktarma özelliğini içerir. API düzeyi 14 ise Android Beam ile NDEF mesajlarını diğer cihazlara aktarmanın daha kolay bir yolunu ve NDEF kayıtları oluşturmak için ekstra kolaylık yöntemleri sunar.
    <uses-sdk android:minSdkVersion="10"/>
    
  • Uygulamanızın Google Play'de yalnızca NFC donanımına sahip cihazlarda gösterilmesini sağlayan uses-feature öğesi:
    <uses-feature android:name="android.hardware.nfc" android:required="true" />
    

    Uygulamanız NFC işlevini kullanıyorsa ancak bu işlev, uygulamanız için önemli değilse uses-feature öğesini atlayabilir ve çalışma zamanında getDefaultAdapter() null olup olmadığını kontrol ederek NFC kullanılabilirliğini kontrol edebilirsiniz.

NFC amaçları için filtrele

İşlemek istediğiniz bir NFC etiketi tarandığında uygulamanızı başlatmak için uygulamanız, Android manifest dosyasındaki NFC amaçlarından birini, ikisini veya üçüne göre filtreleme yapabilir. Ancak uygulamanızın ne zaman başlayacağını en iyi şekilde kontrol edebilmek için genellikle ACTION_NDEF_DISCOVERED amacına göre filtreleme yapmak istersiniz. ACTION_TECH_DISCOVERED niyeti, ACTION_NDEF_DISCOVERED için hiçbir uygulama filtresi uygulamadığında veya yük NDEF olmadığında ACTION_NDEF_DISCOVERED için bir yedektir. ACTION_TAG_DISCOVERED için yapılan filtreleme, genellikle filtre uygulayamayacak kadar genel bir kategoridir. Birçok uygulama ACTION_TAG_DISCOVERED tarihinden önce ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED için filtre uygulayacağından uygulamanızın başlama olasılığı düşük. ACTION_TAG_DISCOVERED, yalnızca ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED amacını işleyecek başka hiçbir uygulamanın yüklü olmadığı durumlarda, uygulamaların filtrelenmesi 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üz altında olmadığından bu her zaman mümkün değildir. Bu nedenle, gerektiğinde diğer iki amaca dönebilirsiniz. Etiketlerin türlerini ve yazılan verileri kontrol edebildiğinizde, etiketlerinizi biçimlendirmek için NDEF'yi kullanmanız önerilir. Aşağıdaki bölümlerde, her amaç türü için nasıl filtreleneceği açıklanmaktadır.

ACTION_NDEF_DISCOVERED

ACTION_NDEF_DISCOVERED amaçlarını filtrelemek için filtre uygulamak istediğiniz veri türüyle birlikte amaç filtresini de bildirin. Aşağıdaki örnekteki ACTION_NDEF_DISCOVERED filtresi, text/plain MIME türünde:

<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çimindeki 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 amacı için filtre uyguluyorsa etkinliğinizin bir tech-list grubu içinde desteklediği teknolojileri belirten bir XML kaynak dosyası oluşturmanız gerekir. tech-list kümesi, etiket tarafından desteklenen teknolojilerin alt kümesiyse etkinliğiniz eşleşme olarak kabul edilir. Bu teknolojileri getTechList() çağırarak edinebilirsiniz.

Örneğin, taranan etiket MifareKlasik, NdefFormatable ve NfcA'yı destekliyorsa etkinliğinizin eşleştirilmesi için tech-list kümenizin üç, iki veya bu teknolojilerden birini de belirtmesi (ve başka hiçbir şeyi belirtmemesi) 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 (dilediğ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 kümesi getTechList() tarafından döndürülen teknolojilerin alt kümesiyse etkinliğiniz eşleşme olarak kabul edilir. Bu, eşleştirme teknolojileri için AND ve OR anlamlarını sağlar. Aşağıdaki örnek, NfcA ve Ndef teknolojilerini destekleyebilen veya NfcB ve Ndef teknolojilerini destekleyebilen etiketlerle eşleşmektedir:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcB</tech>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>
</resources>

AndroidManifest.xml dosyanızda, aşağıdaki örnekte gösterildiği gibi <activity> öğesinin içindeki <meta-data> öğesinde oluşturduğunuz kaynak dosyasını belirtin:

<activity>
...
<intent-filter>
    <action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter>

<meta-data android:name="android.nfc.action.TECH_DISCOVERED"
    android:resource="@xml/nfc_tech_filter" />
...
</activity>

Etiket teknolojileriyle çalışma ve ACTION_TECH_DISCOVERED amacı hakkında daha fazla bilgi için Gelişmiş NFC dokümanındaki Desteklenen Etiket Teknolojileriyle Çalışma bölümüne bakın.

ACTION_TAG_DISCOVERED

ACTION_TAG_DISCOVERED için filtreleme yapmak üzere aşağıdaki amaç filtresini kullanın:

<intent-filter>
    <action android:name="android.nfc.action.TAG_DISCOVERED"/>
</intent-filter>

Amaçlardan bilgi edinme

Bir NFC amacı nedeniyle bir etkinlik başlarsa amaçtan, taranan NFC etiketi hakkında bilgi edinebilirsiniz. Intent'ler, taranan etikete bağlı olarak aşağıdaki ekstraları içerebilir:

Bu ekstra bilgileri elde etmek için etkinliğinizin NFC amaçlarından biriyle başlatılıp başlatılmadığını kontrol ederek bir etiketin tarandığından emin olun ve ardından ekstraları amaçtan çıkarın. Aşağıdaki örnek, ACTION_NDEF_DISCOVERED amacını kontrol eder ve NDEF mesajlarını ekstra bir niyetten 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, niyetten bir Tag nesnesi elde edebilirsiniz. Bu nesne, yükü içerir ve etiketin teknolojilerini numaralandırmanıza olanak tanır:

Kotlin

val tag: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)

Java

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);

Yaygın NDEF kaydı türlerini oluşturma

Bu bölümde, NFC etiketlerine yazma veya Android Beam ile veri gönderme sırasında size yardımcı olacak, yaygın olarak kullanılan NDEF kaydı türlerinin nasıl oluşturulacağı açıklanmaktadır. Android 4.0 (API düzeyi 14) sürümünden başlayarak, URI kayıtlarını otomatik olarak oluşturmanıza yardımcı olmak için createUri() yöntemi kullanılabilir. Android 4.1'den (API düzeyi 16) itibaren createExternal() ve createMime(), MIME ve harici NDEF türü kayıtları oluşturmanıza yardımcı olabilir. NDEF kayıtlarını manuel olarak oluştururken hatalardan kaçınmak için mümkün olduğunda bu yardımcı yöntemleri kullanın.

Bu bölümde, kayıt için ilgili amaç filtresinin nasıl oluşturulacağı da açıklanmaktadır. Bu NDEF kayıt örneklerinin tümü, bir etikete veya ışınlamaya yazdığınız NDEF mesajının ilk NDEF kaydında olmalıdır.

TNF_ABSOLUTE_URI

Not: Daha verimli olduğu için TNF_ABSOLUTE_URI yerine RTD_URI türünü kullanmanızı öneririz.

Aşağıdaki şekilde 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ının amaç 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öntemlerle 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ının amaç 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

Aşağıdaki şekilde TNF_WELL_KNOWN NDEF kaydı oluşturabilirsiniz:

Kotlin

fun createTextRecord(payload: String, locale: Locale, encodeInUtf8: Boolean): NdefRecord {
    val langBytes = locale.language.toByteArray(Charset.forName("US-ASCII"))
    val utfEncoding = if (encodeInUtf8) Charset.forName("UTF-8") else Charset.forName("UTF-16")
    val textBytes = payload.toByteArray(utfEncoding)
    val utfBit: Int = if (encodeInUtf8) 0 else 1 shl 7
    val status = (utfBit + langBytes.size).toChar()
    val data = ByteArray(1 + langBytes.size + textBytes.size)
    data[0] = status.toByte()
    System.arraycopy(langBytes, 0, data, 1, langBytes.size)
    System.arraycopy(textBytes, 0, data, 1 + langBytes.size, textBytes.size)
    return NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, ByteArray(0), data)
}

Java

public NdefRecord createTextRecord(String payload, Locale locale, boolean encodeInUtf8) {
    byte[] langBytes = locale.getLanguage().getBytes(Charset.forName("US-ASCII"));
    Charset utfEncoding = encodeInUtf8 ? Charset.forName("UTF-8") : Charset.forName("UTF-16");
    byte[] textBytes = payload.getBytes(utfEncoding);
    int utfBit = encodeInUtf8 ? 0 : (1 << 7);
    char status = (char) (utfBit + langBytes.length);
    byte[] data = new byte[1 + langBytes.length + textBytes.length];
    data[0] = (byte) status;
    System.arraycopy(langBytes, 0, data, 1, langBytes.length);
    System.arraycopy(textBytes, 0, data, 1 + langBytes.length, textBytes.length);
    NdefRecord record = new NdefRecord(NdefRecord.TNF_WELL_KNOWN,
    NdefRecord.RTD_TEXT, new byte[0], data);
    return record;
}

Önceki NDEF kaydının amaç 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öntemlerle 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ının amaç filtresi şöyle görünür:

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="https"
        android:host="example.com"
        android:pathPrefix="" />
</intent-filter>

TNF_EXTERNAL_TYPE

Aşağıdaki yöntemlerle TNF_EXTERNAL_TYPE NDEF kaydı oluşturabilirsiniz:

createExternal() yöntemini kullanarak:

Kotlin

var payload: ByteArray //assign to your data
val domain = "com.example" //usually your app's package name
val type = "externalType"
val extRecord = NdefRecord.createExternal(domain, type, payload)

Java

byte[] payload; //assign to your data
String domain = "com.example"; //usually your app's package name
String type = "externalType";
NdefRecord extRecord = NdefRecord.createExternal(domain, type, payload);

NdefRecord manuel olarak oluşturuluyor:

Kotlin

var payload: ByteArray
...
val extRecord = NdefRecord(
        NdefRecord.TNF_EXTERNAL_TYPE,
        "com.example:externalType".toByteArray(Charset.forName("US-ASCII")),
        ByteArray(0),
        payload
)

Java

byte[] payload;
...
NdefRecord extRecord = new NdefRecord(
    NdefRecord.TNF_EXTERNAL_TYPE, "com.example:externalType".getBytes(Charset.forName("US-ASCII")),
    new byte[0], payload);

Önceki NDEF kaydının amaç filtresi şöyle görünür:

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="vnd.android.nfc"
        android:host="ext"
        android:pathPrefix="/com.example:externalType"/>
</intent-filter>

Hem Android destekli hem de Android olmayan cihazları daha iyi desteklemek amacıyla daha genel NFC etiketi dağıtımları için TNF_EXTERNAL_TYPE kullanın.

Not: TNF_EXTERNAL_TYPE için URN'ler standart biçimde urn:nfc:ext:example.com:externalType olur, ancak NFC Forum RTD spesifikasyonunda URN'nin urn:nfc:ext: bölümünün NDEF kaydından çıkarılması gerektiği belirtilmektedir. Yani yalnızca iki nokta ile ayrılmış alan adı (örnekte example.com) ve tür (örnekte externalType) olacaktır. TNF_EXTERNAL_TYPE gönderilirken Android, urn:nfc:ext:example.com:externalType URN'sini vnd.android.nfc://ext/example.com:externalType URI'sına dönüştürür. Bu, örnekteki amaç filtresinde belirtildiği şekildedir.

Android uygulaması kayıtları

Android 4.0'da (API düzeyi 14) kullanıma sunulan Android Uygulama Kaydı (AAR), uygulamanızın NFC etiketi tarandığında başlatıldığına dair daha kesin bir kesinlik sağlar. AAR, NDEF kaydı içine yerleştirilmiş bir uygulamanın paket adına sahiptir. Android, NDEF mesajının tamamında AAR'leri aradığından, NDEF mesajınızın herhangi bir NDEF kaydına AAR ekleyebilirsiniz. AAR bulursa uygulamayı AAR'deki paket adına göre başlatır. Uygulama cihazda yoksa, uygulamanın indirilmesi için Google Play başlatılır.

AAR'ler, diğer uygulamaların aynı amaç için filtreleme yapmasını ve dağıttığınız belirli etiketleri potansiyel olarak işlemesini önlemek istiyorsanız yararlıdır. AAR'ler, paket adı kısıtlaması nedeniyle yalnızca uygulama düzeyinde desteklenir. Amaç filtrelemede olduğu gibi Etkinlik düzeyinde desteklenmez. Bir 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 gönderilir:

  1. Normal şekilde intent filtresi kullanarak bir Etkinlik başlatmayı deneyin. Amaçla eşleşen Etkinlik AAR ile de eşleşiyorsa Etkinliği başlatın.
  2. Niyet için filtrelenen Etkinlik AAR ile eşleşmiyorsa, amacı birden fazla Etkinlik gerçekleştirebiliyorsa veya niyeti hiçbir Etkinlik işleme koymuyorsa AAR tarafından belirtilen uygulamayı başlatın.
  3. Hiçbir uygulama AAR ile başlayamazsa Google Play'e giderek AAR'ye dayanan uygulamayı indirin.

Not: AAR'leri ve niyet gönderme sistemini ön plan gönderme sistemiyle geçersiz kılabilirsiniz. Bu sistem, NFC etiketi keşfedildiğinde ön plan etkinliğine öncelik verilmesini sağlar. Bu yöntemle, AAR'leri ve amaç dağıtım sistemini geçersiz kılmak için etkinliğin ön planda olması gerekir.

AAR içermeyen taranmış etiketleri yine de filtrelemek istiyorsanız amaç filtrelerini normal olarak belirtebilirsiniz. Bu, uygulamanız AAR içermeyen diğer etiketlerle ilgileniyorsa kullanışlıdır. Örneğin, uygulamanızın dağıttığınız özel etiketlerin yanı sıra üçüncü taraflarca dağıtılan genel etiketleri de işleyeceğini garanti etmek isteyebilirsiniz. AAR'lerin, Android 4.0 veya sonraki sürümlere özel olduğunu unutmayın. Bu nedenle, etiketleri dağıtırken en geniş cihaz yelpazesini desteklemek için AAR'ler ve MIME türleri/URI'lerin bir kombinasyonunu kullanmak isteyebilirsiniz. Buna ek olarak, NFC etiketlerini dağıtırken çoğu cihazda (Android destekli ve diğer cihazlar) destek sağlamak için NFC etiketlerinizi nasıl yazmak istediğinizi düşünün. Uygulamaların ayırt etmesini kolaylaştırmak için bunu, nispeten benzersiz bir MIME türü veya URI tanımlayarak yapabilirsiniz.

Android, AAR oluşturmak için basit bir API (createApplicationRecord()) sağlar. Tek yapmanız gereken AAR'yi NdefMessage etiketinizde herhangi bir yere yerleştirmektir. NdefMessage içindeki tek kayıt AAR olmadığı sürece NdefMessage işleminizin ilk kaydını kullanmak istemezsiniz. Bunun nedeni, Android sisteminin etiketin MIME türünü veya URI'sını belirlemek için ilk NdefMessage kaydını kontrol etmesidir. Etiketin URI'si, uygulamaların filtrelenmesi için niyet oluşturur. Aşağıdaki kod, AAR'nin nasıl oluşturulacağını göstermektedir:

Kotlin

val msg = NdefMessage(
        arrayOf(
                ...,
                NdefRecord.createApplicationRecord("com.example.android.beam")
        )
)

Java

NdefMessage msg = new NdefMessage(
        new NdefRecord[] {
            ...,
            NdefRecord.createApplicationRecord("com.example.android.beam")}
        );
)

NDEF mesajlarını diğer cihazlara gönderme

Android Işınlama, Android destekli iki cihaz arasında eşler arası basit bir veri alışverişi sağlar. Verileri başka bir cihaza ışınlamak isteyen uygulama ön planda olmalı ve verileri alan cihaz kilitli olmamalıdır. Işınlama cihazı, alma cihazıyla yeterince dokunduğunda ışınlama cihazı "Dokun Gönderme" kullanıcı arayüzünü görüntüler. Daha sonra kullanıcı, mesajın alıcı cihaza ışınlanıp gönderilmeyeceğini seçebilir.

Not: Ön plan NDEF aktarma özelliği, Android Beam'e benzer işlevler sunan API düzeyi 10'da sunulmaktaydı. Bu API'ler o zamandan beri kullanımdan kaldırılmış olsa da eski cihazları desteklemek için kullanılabilir. Daha fazla bilgi için enableForegroundNdefPush() dokümanına bakın.

Şu iki yöntemden birini çağırarak uygulamanız için Android Beam'i etkinleştirebilirsiniz:

  • setNdefPushMessage(): Işınlanacak mesaj olarak ayarlamak için NdefMessage kabul eder. İki cihaz yeterince yakın olduğunda mesajı otomatik olarak ışınlar.
  • setNdefPushMessageCallback(): createNdefMessage() içeren bir geri çağırmayı kabul eder. Bu geri çağırma, bir cihaz veri ışınlanacak kapsama alanında olduğunda çağrılır. Geri çağırma, NDEF mesajını yalnızca gerektiğinde oluşturmanıza olanak tanır.

Bir etkinlik aynı anda yalnızca bir NDEF mesajı aktarabilir. Bu nedenle, her ikisi de ayarlanırsa setNdefPushMessageCallback(), setNdefPushMessage() değerine göre öncelikli olur. Android Beam'i kullanmak için aşağıdaki genel yönergelere uyulması gerekir:

  • Verileri ışınlayan etkinlik ön planda olmalıdır. Her iki cihazın da ekranı kilit açılmış olmalıdır.
  • ışınladığınız verileri bir NdefMessage nesnesine kapsüllemeniz gerekir.
  • Işınlanan verileri alan NFC cihazı, com.android.npp NDEF aktarma protokolünü veya NFC Forumu'nun SNEP'sini (Basit NDEF Değişimi Protokolü) desteklemelidir. com.android.npp protokolü, API düzeyi 9 (Android 2.3) ile API düzeyi 13 (Android 3.2) arasındaki cihazlar için gereklidir. com.android.npp ve SNEP, API düzeyi 14 (Android 4.0) ve sonraki sürümlerde gereklidir.

Not: Etkinliğiniz Android Beam'i etkinleştiriyorsa ve ön plandaysa standart amaç dağıtım sistemi devre dışı bırakılır. Bununla birlikte, etkinliğiniz ön plan gönderim'i de etkinleştiriyorsa ön plan gönderme işleminde ayarlanan intent filtreleriyle eşleşen etiketleri taramaya devam edebilir.

Android Beam'i etkinleştirmek için:

  1. Diğer cihaza aktarmak istediğiniz NdefRecord öğelerini içeren bir NdefMessage oluşturun.
  2. setNdefPushMessage() yöntemini NdefMessage ile çağırın veya etkinliğinizin onCreate() yöntemindeki NfcAdapter.CreateNdefMessageCallback nesnesinde geçen setNdefPushMessageCallback yöntemini çağırın. Bu yöntemler, Android Beam ile etkinleştirmek istediğiniz en az bir etkinliğin yanı sıra etkinleştirilecek diğer etkinlikleri içeren isteğe bağlı bir listeyi gerektirir.

    Genel olarak, Etkinliğinizin yalnızca her zaman aynı NDEF mesajını iletmesi gerekiyorsa, yani iki cihaz iletişim kapsama alanında olduğunda normalde setNdefPushMessage() kullanırsınız. Uygulamanız, uygulamanın mevcut bağlamına önem veriyorsa ve kullanıcının uygulamanızda ne yaptığına bağlı olarak bir NDEF mesajı aktarmak istiyorsa setNdefPushMessageCallback kullanırsınız.

Aşağıdaki örnekte basit bir etkinliğin, bir etkinliğin onCreate() yönteminde NfcAdapter.CreateNdefMessageCallback yöntemini nasıl çağırdığı gösterilmektedir (örnek için AndroidBeamDemo'ya bakın). Bu örnekte, MIME kaydı oluşturmanıza yardımcı olacak yöntemler de bulunmaktadır:

Kotlin

package com.example.android.beam

import android.app.Activity
import android.content.Intent
import android.nfc.NdefMessage
import android.nfc.NdefRecord
import android.nfc.NfcAdapter
import android.nfc.NfcAdapter.CreateNdefMessageCallback
import android.nfc.NfcEvent
import android.os.Bundle
import android.os.Parcelable
import android.widget.TextView
import android.widget.Toast
import java.nio.charset.Charset

class Beam : Activity(), NfcAdapter.CreateNdefMessageCallback {
    
    private var nfcAdapter: NfcAdapter? = null
    private lateinit var textView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main)
        textView = findViewById(R.id.textView)
        // Check for available NFC Adapter
        nfcAdapter = NfcAdapter.getDefaultAdapter(this)
        if (nfcAdapter == null) {
            Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show()
            finish()
            return
        }
        // Register callback
        nfcAdapter?.setNdefPushMessageCallback(this, this)
    }

    override fun createNdefMessage(event: NfcEvent): NdefMessage {
        val text = "Beam me up, Android!\n\n" +
                "Beam Time: " + System.currentTimeMillis()
        return NdefMessage(
                arrayOf(
                        createMime("application/vnd.com.example.android.beam", text.toByteArray())
                )
                /**
                 * The Android Application Record (AAR) is commented out. When a device
                 * receives a push with an AAR in it, the application specified in the AAR
                 * is guaranteed to run. The AAR overrides the tag dispatch system.
                 * You can add it back in to guarantee that this
                 * activity starts when receiving a beamed message. For now, this code
                 * uses the tag dispatch system.
                 *///,NdefRecord.createApplicationRecord("com.example.android.beam")
        )
    }

    override fun onResume() {
        super.onResume()
        // Check to see that the Activity started due to an Android Beam
        if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) {
            processIntent(intent)
        }
    }

    override fun onNewIntent(intent: Intent) {
        // onResume gets called after this to handle the intent
        setIntent(intent)
    }

    /**
     * Parses the NDEF Message from the intent and prints to the TextView
     */
    private fun processIntent(intent: Intent) {
        textView = findViewById(R.id.textView)
        // only one message sent during the beam
        intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMsgs ->
            (rawMsgs[0] as NdefMessage).apply {
                // record 0 contains the MIME type, record 1 is the AAR, if present
                textView.text = String(records[0].payload)
            }
        }
    }
}

Java

package com.example.android.beam;

import android.app.Activity;
import android.content.Intent;
import android.nfc.NdefMessage;
import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.nfc.NfcAdapter.CreateNdefMessageCallback;
import android.nfc.NfcEvent;
import android.os.Bundle;
import android.os.Parcelable;
import android.widget.TextView;
import android.widget.Toast;
import java.nio.charset.Charset;


public class Beam extends Activity implements CreateNdefMessageCallback {
    NfcAdapter nfcAdapter;
    TextView textView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        TextView textView = (TextView) findViewById(R.id.textView);
        // Check for available NFC Adapter
        nfcAdapter = NfcAdapter.getDefaultAdapter(this);
        if (nfcAdapter == null) {
            Toast.makeText(this, "NFC is not available", Toast.LENGTH_LONG).show();
            finish();
            return;
        }
        // Register callback
        nfcAdapter.setNdefPushMessageCallback(this, this);
    }

    @Override
    public NdefMessage createNdefMessage(NfcEvent event) {
        String text = ("Beam me up, Android!\n\n" +
                "Beam Time: " + System.currentTimeMillis());
        NdefMessage msg = new NdefMessage(
                new NdefRecord[] { createMime(
                        "application/vnd.com.example.android.beam", text.getBytes())
         /**
          * The Android Application Record (AAR) is commented out. When a device
          * receives a push with an AAR in it, the application specified in the AAR
          * is guaranteed to run. The AAR overrides the tag dispatch system.
          * You can add it back in to guarantee that this
          * activity starts when receiving a beamed message. For now, this code
          * uses the tag dispatch system.
          */
          //,NdefRecord.createApplicationRecord("com.example.android.beam")
        });
        return msg;
    }

    @Override
    public void onResume() {
        super.onResume();
        // Check to see that the Activity started due to an Android Beam
        if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(getIntent().getAction())) {
            processIntent(getIntent());
        }
    }

    @Override
    public void onNewIntent(Intent intent) {
        // onResume gets called after this to handle the intent
        setIntent(intent);
    }

    /**
     * Parses the NDEF Message from the intent and prints to the TextView
     */
    void processIntent(Intent intent) {
        textView = (TextView) findViewById(R.id.textView);
        Parcelable[] rawMsgs = intent.getParcelableArrayExtra(
                NfcAdapter.EXTRA_NDEF_MESSAGES);
        // only one message sent during the beam
        NdefMessage msg = (NdefMessage) rawMsgs[0];
        // record 0 contains the MIME type, record 1 is the AAR, if present
        textView.setText(new String(msg.getRecords()[0].getPayload()));
    }
}

Bu kodun bir AAR'yi yorumladığını unutmayın. AAR'yi kaldırabilirsiniz. AAR'yi etkinleştirirseniz AAR'de belirtilen uygulama her zaman Android Beam mesajını alır. Uygulama mevcut değilse Google Play uygulamayı indirmeye başlar. Bu nedenle, AAR kullanılıyorsa Android 4.0 veya sonraki sürümlerin yüklü olduğu cihazlar için aşağıdaki intent filtresi teknik olarak gerekli değildir:

<intent-filter>
  <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:mimeType="application/vnd.com.example.android.beam"/>
</intent-filter>

Bu intent filtresiyle, com.example.android.beam uygulaması artık bir NFC etiketini taradığında, com.example.android.beam türünde AAR'ye sahip bir Android ışında aldığında ya da NDEF biçimli bir mesaj application/vnd.com.example.android.beam türünde bir MIME kaydı içerdiğinde başlatılabilir.

AAR'ler bir uygulamanın başlatılmasını veya indirilmesini garanti etse de, ana Etkinliği her zaman bir AAR tarafından belirtilen paket içinde başlatmak yerine, uygulamanızda istediğiniz bir Etkinliği başlatmanızı sağladığı için intent filtreleri önerilir. AAR'ler, Etkinlik düzeyinde ayrıntı düzeyine sahip değildir. Ayrıca, Android destekli bazı cihazlar AAR'leri desteklemediğinden, her ihtimale karşı NDEF mesajlarınızın ilk NDEF kaydına tanımlayıcı bilgiler yerleştirmeniz ve bunları da filtrelemeniz gerekir. Kayıt oluşturma hakkında daha fazla bilgi için Yaygın NDEF kaydı Türlerini Oluşturma bölümüne bakın.