NFC ile ilgili temel bilgiler

Bu dokümanda, Android'de gerçekleştirdiğiniz temel NFC görevleri açıklanmaktadır. Bu kılavuzda, NFC verilerinin NDEF mesajları biçiminde nasıl gönderip alınacağı ve bu özellikleri destekleyen Android çerçeve API'leri açıklanmaktadır. NDEF olmayan verilerle çalışma konuları da dahil olmak üzere daha ileri düzey konular için Gelişmiş NFC konusuna bakın.

NDEF verileriyle ve Android'le çalışırken başlıca iki 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ı, etiket dağıtım sistemi ile gerçekleştirilir. Bu sistem, keşfedilen NFC etiketlerini analiz eder, verileri uygun şekilde kategorilere ayırır ve kategorize edilmiş verilerle ilgilenen bir uygulamayı başlatır. Taranan NFC etiketini işlemek isteyen bir uygulama, amaç filtresi beyan edebilir ve verileri işlemeyi isteyebilir.

Android BeamTM özelliği, cihazların fiziksel olarak birbirine dokundurarak başka bir cihaza NDEF mesajı aktarmasına olanak tanır. NFC ile manuel cihaz keşfi veya eşleme işlemi gerekmediğinden bu etkileşim, veri göndermek için Bluetooth gibi diğer kablosuz teknolojilerden daha kolay bir yol sağlar. İki cihaz kapsama alanına girdiğinde bağlantı otomatik olarak başlatılır. Android Beam, bir dizi NFC API'si aracılığıyla kullanılabileceğinden tüm uygulamalar cihazlar arasında bilgi iletebilir. Örneğin, Kişiler, Tarayıcı ve YouTube uygulamaları kişileri, web sayfalarını ve videoları diğer cihazlarla paylaşmak için Android Beam'i kullanır.

Etiket gönderme sistemi

Android destekli cihazlar, cihazın Ayarlar menüsünde NFC devre dışı olmadığı sürece genellikle ekran kilidi açıkken NFC etiketleri arar. Android destekli bir cihaz bir NFC etiketi keşfettiğinde istenen davranış, 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 manuel olarak bir etkinlik seçmesi, cihazı etiketten uzaklaştırmaya ve bağlantıyı kesmeye zorlayabilir. Etkinliğinizi, yalnızca Etkinlik Seçici'nin görünmesini engellemek için önemli olduğu NFC etiketlerini işleyecek şekilde geliştirmeniz gerekir.

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

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

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

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

NDEF verileri, bir veya daha fazla kayıt (NdefRecord) içeren bir mesaja (NdefMessage) kapsüllenir. Her NDEF kaydı, oluşturmak istediğiniz kayıt türünün spesifikasyonuna göre doğru şekilde biçimlendirilmiş olmalıdır. Android, NDEF verileri içermeyen diğer etiket türlerini de destekler. Bunları, android.nfc.tech paketindeki sınıfları kullanarak çalışabilirsiniz. Bu teknolojiler hakkında daha fazla bilgi edinmek için Gelişmiş NFC konusuna bakın. Bu diğer tür etiketlerle çalışırken, etiketlerle iletişim kurmak için kendi protokol yığınınızı yazabilirsiniz. Bu nedenle, Android destekli cihazlar için geliştirme kolaylığı ve maksimum destek açısından mümkün olduğunda NDEF'yi kullanmanızı öneririz.

Not: Tüm NDEF teknik özelliklerini indirmek için NFC Forumu Spesifikasyonları ve Uygulama Belgeleri sitesine gidin ve NDEF kayıtlarının nasıl oluşturulacağına ilişkin örnekler için Yaygın NDEF kaydı türlerini oluşturma sayfasına göz atın.

Artık NFC etiketleri konusunda biraz 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ı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 bunun için bir kimlik oluşturabilirsiniz.
Değişken uzunlukta yük
Okumak veya yazmak istediğiniz gerçek veri yükü. Bir NDEF mesajı birden fazla NDEF kaydı içerebilir. Bu nedenle, tam yükün NDEF mesajının ilk NDEF kaydında olduğunu varsaymayın.

Etiket gönderme sistemi, bir MIME türünü veya URI'yı NDEF mesajıyla eşlemeye çalışmak için TNF ve tür alanlarını kullanır. Başarılı olursa bu bilgileri gerçek yük ile birlikte bir ACTION_NDEF_DISCOVERED amacının içine dahil eder. Bununla birlikte, etiket dağıtım sisteminin veri türünü ilk NDEF kaydına göre belirleyemediği durumlar vardır. Bu durum, NDEF verileri bir MIME türü veya URI ile eşlenemediğinde ya da NFC etiketi başlangıçta NDEF verisi içermediğinde ortaya çıkar. Böyle 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 dağıtım sisteminin TNF ve tür alanlarını MIME türleri veya URI'lerle nasıl eşlediği açıklanmaktadır. Ayrıca, hangi TNF'lerin bir MIME türü veya URI ile eşlenemeyeceğini 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 amacının veri alanındaki URI'yı etiketle ilgili yük gibi diğer bilgileri de 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 göre MIME türü.
TNF_UNCHANGED İlk kayıtta geçersiz olduğu için ACTION_TECH_DISCOVERED değerine geri döner.
TNF_UNKNOWN ACTION_TECH_DISCOVERED değerine geri döner.
TNF_WELL_KNOWN Tür alanında ayarladığınız Kayıt Türü Tanımı'na (RTD) bağlı olarak MIME türü veya URI. Mevcut 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 etiketleri 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, niyeti, amaca göre 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üksek önceliğe sahip olandan en düşük öncelikli olana doğru sıralanmış üç amaç tanımlar:

  1. ACTION_NDEF_DISCOVERED: Bu amaç, 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 amaçtır ve etiket dağıtma sistemi, mümkün olduğunda başka 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. Taranan etiket bir MIME türü veya URI ile eşlenemeyen NDEF verileri içeriyorsa ya da etiket NDEF verisi içermiyorsa ancak bilinen bir etiket teknolojisine sahipse bu amaç doğrudan başlatılır (önce ACTION_NDEF_DISCOVERED başlatılmadan).
  3. ACTION_TAG_DISCOVERED: ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED amaçlarını hiçbir etkinlik gerçekleştirmezse 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 bir Etkinlik başlatmayı deneyin.
  2. Söz konusu amaç için hiçbir etkinlik filtrelenmiyorsa bir uygulama amaca göre filtrelenene veya etiket dağıtma 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çların hiçbiri için hiçbir uygulama filtrelenmiyorsa hiçbir şey yapmayın.
Şekil 1. Etiket Gönderme 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 sağlar 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şmeden ve NFC amaçlarını düzgün bir şekilde işlemeden önce AndroidManifest.xml dosyanızda şu öğeleri tanımlayın:

  • 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, ACTION_TAG_DISCOVERED aracılığıyla yalnızca sınırlı etiket dağıtımını destekler ve NDEF mesajlarına yalnızca EXTRA_NDEF_MESSAGES ekstrası üzerinden erişim verir. Başka etiket özelliklerine veya G/Ç işlemlerine erişilemez. API düzeyi 10, ön plan NDEF aktarmanın yanı sıra kapsamlı okuyucu/yazar desteği içerir. API düzeyi 14 ise Android Beam ile NDEF mesajlarını diğer cihazlara aktarmak için daha kolay bir yol 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 çıkarabilir ve çalışma zamanında getDefaultAdapter() öğesinin 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ının birini, ikisini veya üçüne göre filtreleme yapabilir. Ancak uygulamanızın ne zaman başlayacağını en iyi şekilde kontrol edebilmek için genellikle ACTION_NDEF_DISCOVERED amacına göre filtreleme yapmak istersiniz. ACTION_TECH_DISCOVERED amacı, hiçbir uygulama ACTION_NDEF_DISCOVERED için filtre uygulamadığında veya yük NDEF olmadığında ACTION_NDEF_DISCOVERED için 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 filtrelendiğinden uygulamanızın başlama olasılığı düşüktür. ACTION_TAG_DISCOVERED, yalnızca ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED amacını yerine getirecek başka bir uygulamanın yüklenmediği 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 geri dönebilirsiniz. Yazılan etiketlerin ve verilerin türünü kontrolünüz altında olduğunda etiketlerinizi biçimlendirmek için NDEF'yi kullanmanız önerilir. Aşağıdaki bölümlerde, her amaç türü için nasıl filtreleme yapacağınız 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 örnekte ACTION_NDEF_DISCOVERED amaçları text/plain MIME türünde 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 örnek, https://developer.android.com/index.html biçimindeki bir URI için filtre uygular.

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

ACTION_TECH_DISCOVERED (İşlem)

Etkinliğiniz ACTION_TECH_DISCOVERED amacı için filtre uyguluyorsa bir tech-list grubunda etkinliğinizin desteklediği teknolojileri belirten bir XML kaynak dosyası oluşturmanız gerekir. Bir tech-list grubu, etiket tarafından desteklenen teknolojilerin bir alt kümesiyse ve getTechList() yöntemini çağırarak etkinliğiniz eşleşme olarak kabul edilir.

Örneğin, taranan etiket Mifare Classic, NdefFormatable ve NfcA'yı destekliyorsa tech-list ayarınız, etkinliğinizin eşleştirilebilmesi için bu teknolojilerden üçünü, ikisini veya birini (ve başka hiçbir şeyi değil) belirtmelidir.

Aşağıdaki örnekte tüm teknolojiler tanımlanmaktadır. NFC etiketinizin desteklemediğini kaldırmanız gerekir. Bu dosyayı <project-root>/res/xml klasörüne kaydedin (istediğiniz adı verebilirsiniz).

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

Ayrıca 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ı 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 dosyayı 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 elde etme

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

Bu ekstraları 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 intent'den alır.

Kotlin

override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)
    ...
    if (NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action) {
        intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)?.also { rawMessages ->
            val messages: List<NdefMessage> = rawMessages.map { it as NdefMessage }
            // Process the messages array.
            ...
        }
    }
}

Java

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    ...
    if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())) {
        Parcelable[] rawMessages =
            intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
        if (rawMessages != null) {
            NdefMessage[] messages = new NdefMessage[rawMessages.length];
            for (int i = 0; i < rawMessages.length; i++) {
                messages[i] = (NdefMessage) rawMessages[i];
            }
            // Process the messages array.
            ...
        }
    }
}

Alternatif olarak amaçtan bir Tag nesnesi elde edebilirsiniz. Bu nesne, yükü içerir ve etiketin teknolojilerini numaralandırmanıza olanak tanır:

Kotlin

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

Java

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

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

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

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

TNF_ABSOLUTE_URI

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

TNF_ABSOLUTE_URI NDEF kaydını aşağıdaki şekilde oluşturabilirsiniz:

Kotlin

val uriRecord = ByteArray(0).let { emptyByteArray ->
    NdefRecord(
            TNF_ABSOLUTE_URI,
            "https://developer.android.com/index.html".toByteArray(Charset.forName("US-ASCII")),
            emptyByteArray,
            emptyByteArray
    )
}

Java

NdefRecord uriRecord = new NdefRecord(
    NdefRecord.TNF_ABSOLUTE_URI ,
    "https://developer.android.com/index.html".getBytes(Charset.forName("US-ASCII")),
    new byte[0], new byte[0]);

Önceki NDEF kaydının 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

TNF_MIME_MEDIA NDEF kaydını aşağıdaki yöntemlerle oluşturabilirsiniz:

createMime() yöntemini kullanarak:

Kotlin

val mimeRecord = NdefRecord.createMime(
        "application/vnd.com.example.android.beam",
        "Beam me up, Android".toByteArray(Charset.forName("US-ASCII"))
)

Java

NdefRecord mimeRecord = NdefRecord.createMime("application/vnd.com.example.android.beam",
    "Beam me up, Android".getBytes(Charset.forName("US-ASCII")));

NdefRecord öğesi 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

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

Kotlin

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

Java

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

Önceki NDEF kaydının 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

TNF_WELL_KNOWN NDEF kaydını aşağıdaki yöntemlerle oluşturabilirsiniz:

createUri(String) yöntemini kullanarak:

Kotlin

val rtdUriRecord1 = NdefRecord.createUri("https://example.com")

Java

NdefRecord rtdUriRecord1 = NdefRecord.createUri("https://example.com");

createUri(Uri) yöntemini kullanarak:

Kotlin

val rtdUriRecord2 = Uri.parse("https://example.com").let { uri ->
    NdefRecord.createUri(uri)
}

Java

Uri uri = Uri.parse("https://example.com");
NdefRecord rtdUriRecord2 = NdefRecord.createUri(uri);

NdefRecord öğesi 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

TNF_EXTERNAL_TYPE NDEF kaydını aşağıdaki yöntemlerle 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 öğesi 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'lerin standart biçimi urn:nfc:ext:example.com:externalType şeklindedir 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ürdür (örnekte externalType). 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), bir NFC etiketi tarandığında uygulamanızın başlatıldığına dair daha güçlü bir kesinlik sağlar. AAR, NDEF kaydı içine yerleştirilmiş bir uygulamanın paket adını içerir. Android, NDEF mesajının tamamında AAR'leri aradığı için NDEF mesajınızın herhangi bir NDEF kaydına AAR ekleyebilirsiniz. Bir AAR bulursa uygulamayı AAR'deki paket adına göre başlatır. Uygulama cihazda yoksa Google Play başlatılır ve uygulamanın indirilmesi sağlanı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 kullanışlıdır. AAR'ler, paket adı kısıtlaması nedeniyle yalnızca uygulama düzeyinde desteklenir. Amaç filtrelemesinde 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önderir:

  1. Normalde amaç 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 filtreleyen Etkinlik AAR ile eşleşmiyorsa, amacı birden fazla Etkinlik gerçekleştirebiliyorsa veya niyeti hiçbir Etkinlik gerçekleştirmiyorsa 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 dağıtım sistemi ile geçersiz kılabilirsiniz. Bu sistem, bir NFC etiketi bulunduğunda ön plan etkinliğine öncelik verilmesini sağlar. Bu yöntemle, AAR'leri ve niyet gönderme sistemini geçersiz kılmak için etkinliğin ön planda olması gerekir.

AAR içermeyen taranmış etiketleri yine de filtrelemek istiyorsanız niyet filtrelerini normal olarak tanımlayabilirsiniz. Uygulamanız AAR içermeyen diğer etiketlerle ilgileniyorsa bu yararlı olur. Ö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ümlerin yüklü olduğu cihazlara özel olduğunu unutmayın. Bu nedenle, etiketleri dağıtırken en geniş cihaz yelpazesini desteklemek için AAR'ler ve MIME türlerinin/URI'larının bir kombinasyonunu kullanmak isteyebilirsiniz. Buna ek olarak, NFC etiketlerini dağıtırken çoğu cihazda (Android destekli ve diğer cihazlar) desteği sağlamak için NFC etiketlerinizi nasıl yazmak istediğinizi düşünün. Uygulamaların ayırt etmesini kolaylaştırmak için nispeten benzersiz bir MIME türü veya URI tanımlayarak bunu yapabilirsiniz.

Android, AAR oluşturmak için basit bir API (createApplicationRecord()) sağlar. Tek yapmanız gereken AAR'yi NdefMessage içinde 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 filtreleneceği bir amaç oluşturur. Aşağıdaki kodda AAR'nin 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")}
        );
)

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

Android Beam, Android destekli iki cihaz arasında eşler arası basit veri alışverişi yapılmasına olanak tanır. 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 yakın olduğunda, ışın verme cihazı "Touch to Işınlama" kullanıcı arayüzünü görüntüler. Kullanıcı bunun ardından mesajın alıcı cihaza ışınlanıp gönderilmeyeceğini seçebilir.

Not: Ön plan NDEF aktarma işlemi, Android Beam'e benzer işlevler sağlayan API düzeyi 10'da kullanılabiliyordu. Bu API'ler artık kullanımdan kaldırılmıştır, ancak eski cihazları desteklemek için kullanılabilirler. Daha fazla bilgi için enableForegroundNdefPush() dokümanına bakın.

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

  • setNdefPushMessage(): Işınlanacak mesaj olarak ayarlamak için bir NdefMessage kabul eder. İki cihaz yeterince yakında olduğunda mesajı otomatik olarak ışınlar.
  • setNdefPushMessageCallback(): Bir cihaz, verilerin ışınlanacağı kapsama alanında olduğunda çağrılan createNdefMessage() ifadesini içeren bir geri çağırmayı kabul eder. Geri çağırma, NDEF mesajını yalnızca gerektiğinde oluşturmanızı sağlar.

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

  • Verileri ışınlayan etkinlik ön planda olmalıdır. Her iki cihazın da ekranlarının kilidi açık olmalıdır.
  • Işınladığınız verileri bir NdefMessage nesnesine kapsüllemeniz gerekir.
  • Işınlama verilerini alan NFC cihazı, com.android.npp NDEF aktarma protokolünü veya NFC Forumu'nun SNEP'sini (Basit NDEF Değişim Protokolü) desteklemelidir. API düzeyi 9 (Android 2.3) ile API düzeyi 13 (Android 3.2) arasındaki cihazlar için com.android.npp protokolü gereklidir. Hem com.android.npp hem de 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 özelliğini de etkinleştirse bile, ön plan dağıtımında ayarlanan amaç filtreleriyle eşleşen etiketleri tarayabilir.

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 bir NdefMessage ile çağırın veya etkinliğinizin onCreate() yöntemindeki bir NfcAdapter.CreateNdefMessageCallback nesnesinde geçen setNdefPushMessageCallback yöntemini çağırın. Bu yöntemlerde, Android Beam ile etkinleştirmek istediğiniz en az bir etkinlik ve etkinleştirilecek diğer etkinliklerin isteğe bağlı bir listesi gerekir.

    Normalde, Etkinliğinizin yalnızca her zaman aynı NDEF mesajını, iki cihaz iletişim kurmak için kapsama alanındayken aktarması gerekiyorsa 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 (tam örnek için AndroidBeamDemo bölümüne 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. Bunu kaldırabilirsiniz. AAR'yi etkinleştirirseniz AAR'de belirtilen uygulama her zaman Android Beam mesajını alır. Uygulama mevcut değilse Google Play tarafından indirilmeye başlanır. 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 Beam aldığında ya da NDEF biçimli bir mesaj application/vnd.com.example.android.beam türünde MIME kaydı içerdiğinde başlatılabilir.

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