NFC ile ilgili temel bilgiler

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

NDEF verileri ve Android ile çalışırken başlıca iki kullanım alanı vardır:

  • 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 şekilde sınıflandıran ve kategorilere ayrılmış verilerle ilgilenen bir uygulamayı başlatan etiket gönderme sistemi ile gerçekleştirilir. Taranmış NFC etiketini işlemek isteyen bir uygulama, bir amaç filtresi beyan edebilir ve verileri işlemeyi isteyebilir.

Android BeamTM özelliği, cihazların fiziksel olarak birbirine dokundurularak başka bir cihaza NDEF mesajı iletmesine olanak tanır. Bu etkileşim, Bluetooth gibi diğer kablosuz teknolojilere kıyasla veri göndermek için daha kolay bir yol sağlar. Çünkü NFC'de manuel cihaz keşfi veya eşleme gerekmez. İki cihaz kapsama alanına girdiğinde bağlantı otomatik olarak başlatılır. Android Beam, bir dizi NFC API'si üzerinden 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 Beam'i kullanır.

Etiket gönderme sistemi

Android destekli cihazlar, cihazın Ayarlar menüsünde NFC devre dışı bırakılmamışsa genellikle ekran kilidi açıkken NFC etiketleri arar. Android destekli bir cihaz bir NFC etiketi bulduğunda, istenen davranış, kullanıcıya hangi uygulamanın kullanılacağını sormadan en uygun etkinliğin amacı ele almasını sağlamaktır. Cihazlar NFC etiketlerini çok kısa bir aralıkta taradığından kullanıcıların manuel olarak bir etkinlik seçmesi, cihazı etiketten uzağa taşımaya ve bağlantıyı kesmeye zorlanabilir. Etkinliğinizi, Etkinlik Seçici'nin görünmesini önlemek için yalnızca etkinliğinizin önem verdiği NFC etiketlerini işleyecek şekilde geliştirmeniz gerekir.

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

  1. NFC etiketini ayrıştırma ve MIME türünü veya etiketteki veri yükünü tanımlayan bir URI'yi anlama.
  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 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 gönderme sisteminin NFC etiketlerini nasıl ayrıştırdığını ve etiket gönderme sisteminin bir NDEF mesajı algıladığında yaptığı özel çalışmayı anlamanız önemlidir. NFC etiketleri çok çeşitli teknolojilerden oluşur ve bu etiketlere birçok farklı şekilde yazılabilir. NFC Forumu tarafından tanımlanan NDEF standardını en fazla Android destekler.

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 göre doğru şekilde biçimlendirilmiş olmalıdır. Android, android.nfc.tech paketindeki sınıfları kullanarak üzerinde çalışabileceğiniz NDEF verisi 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ı gerektirir. Bu nedenle, Android destekli cihazlar için geliştirme kolaylığı ve maksimum destek sağlamak amacıyla mümkün olduğunda NDEF'yi kullanmanızı öneririz.

Not: Tam NDEF spesifikasyonlarını indirmek için NFC Forum Spesifikasyonları ve Uygulama Belgeleri sitesine gidin ve NDEF kayıtlarının nasıl oluşturulduğuna dair örnekler için Yaygın NDEF kaydı türleri oluşturma bölümüne bakın.

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ı bir şekilde açıklanmaktadır. Android destekli bir cihaz, NDEF biçimli veriler içeren bir NFC etiketini tararken mesajı ayrıştırır ve verilerin MIME türünü veya URI'yı tanımlamaya çalışır. Bunu yapmak için sistem, NDEF mesajının tamamının nasıl yorumlanacağını belirlemek üzere NdefMessage içindeki ilk NdefRecord öğ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
Kaydın benzersiz tanımlayıcısıdır. 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'yi NDEF mesajıyla eşlemeye çalışmak için TNF ve tür alanlarını kullanır. Başarılı olursa bu bilgileri gerçek yükle birlikte bir ACTION_NDEF_DISCOVERED amacının içine dahil eder. Bununla birlikte, etiket gönderme sisteminin ilk NDEF kaydına göre veri türünü belirleyemediği durumlar vardır. Bu durum, NDEF verileri bir MIME türü veya URI ile eşlenemediğinde ya da NFC etiketi başlangıçta NDEF verileri 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ü veya URI ile eşlenemediğ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, bir ACTION_NDEF_DISCOVERED amacının veri alanındaki URI'yı etiket hakkındaki 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ında URN'yi temel alan URI. URN, NDEF türü alanına kısaltılmış bir biçimde kodlanmıştı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 bağlı 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 için desteklenen RTD'ler ve eşlemeleri

Kayıt Türü Tanımı (RTD) Eşleme
RTD_ALTERNATIVE_CARRIER ACTION_TECH_DISCOVERED değerine geri döner.
RTD_HANDOVER_CARRIER ACTION_TECH_DISCOVERED değerine geri döner.
RTD_HANDOVER_REQUEST ACTION_TECH_DISCOVERED değerine geri döner.
RTD_HANDOVER_SELECT ACTION_TECH_DISCOVERED değerine geri döner.
RTD_SMART_POSTER Yükün ayrıştırılmasına dayalı URI.
RTD_TEXT text/plain 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 amaç oluşturmayı tamamladığında, niyeti amaca göre filtreleyen ilgili bir uygulamaya gönderir. Amacı birden fazla uygulama işleyebiliyorsa kullanıcının Etkinliği seçebilmesi için Etkinlik Seçici sunulur. Etiket gönderme sistemi, önceliği en yüksekten en düşüğe doğru sıralanmış üç amaç tanımlar:

  1. ACTION_NDEF_DISCOVERED: Bu intent, NDEF yükü içeren ve tanınan türde bir etiket tarandığında 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 gönderme sistemi bu amaçla bir uygulama başlatmaya çalışır. Bu amaç, taranan etiket bir MIME türü veya URI 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 gerçekleştirmiyorsa bu amaç başlatılır.

Etiket gönderme sisteminin çalışma şekli temel olarak şu şekildedir:

  1. NFC etiketini ayrıştırırken etiket dağıtım 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çların hiçbiri için hiçbir uygulama filtrelenmiyorsa hiçbir şey yapmayın.
Şekil 1. Etiket Sevkiyat Sistemi

Mümkün olduğunda NDEF mesajları ve ACTION_NDEF_DISCOVERED amacı ile çalışın. Bu amaç, üçü 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ıyarak kullanıcıya daha iyi bir deneyim sunmanızı sağlar.

Android manifest dosyasında NFC erişimi isteme

Bir cihazın NFC donanımına erişebilmek ve NFC amaçlarını doğru şekilde işleyebilmek için ö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üzeyi 9, yalnızca ACTION_TAG_DISCOVERED üzerinden sınırlı etiket dağıtımını destekler ve NDEF mesajlarına yalnızca EXTRA_NDEF_MESSAGES ekstrası üzerinden erişim sağlar. Başka hiçbir etiket özelliğine veya G/Ç işlemine erişilemez. API düzeyi 10, kapsamlı okuyucu/yazar desteğinin yanı sıra ön planda NDEF aktarma özelliğini içerir. API düzeyi 14 ise NDEF mesajlarını Android Beam ile 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şlevi kullanıyorsa ancak bu işlev uygulamanız için önemli değilse uses-feature öğesini atlayabilir 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ı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 amacı, hiçbir uygulamanın ACTION_NDEF_DISCOVERED için filtrelediği veya yük NDEF olmadığında ACTION_NDEF_DISCOVERED için yedektir. ACTION_TAG_DISCOVERED için filtreleme, genellikle filtre uygulayamayacak kadar fazla 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şlatılma olasılığı düşük olur. ACTION_TAG_DISCOVERED, yalnızca ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED amacını yerine getirecek başka bir uygulamanın yüklü olmadığı durumlarda filtreleme yapılacak uygulamalar için son çare olarak kullanılabilir.

NFC etiketi dağıtımları değişiklik gösterdiği ve çoğu zaman sizin kontrolünüzde olmadığından bu her zaman mümkün değildir. Bu nedenle, gerektiğinde diğer iki amacı kullanabilirsiniz. Etiket türlerinin ve yazılan verilerin kontrolü sizde olduğunda etiketlerinizi biçimlendirmek için NDEF 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 (İŞLEM)

ACTION_NDEF_DISCOVERED amaçlarını filtrelemek için amaç filtresini, filtrelemek istediğiniz veri türüyle birlikte bildirin. Aşağıdaki örnek, ACTION_NDEF_DISCOVERED için text/plain MIME türüyle ilişkilidir:

<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 grubu içinde etkinliğinizin 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 tech-list kümenizin etkinliğinizin eşleştirilebilmesi için üç, iki veya teknolojilerden birini de belirtmesi (ve başka hiçbir şeyi belirtmemesi) gerekir.

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>

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şen teknolojiler 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, <activity> öğesinin içindeki <meta-data> öğesinde yeni oluşturduğunuz kaynak dosyasını aşağıdaki örnekte olduğu gibi belirtin:

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

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

Etiket 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 şu amaç filtresini kullanın:

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

Amaçlardan bilgi edinme

Bir etkinlik NFC amacı nedeniyle 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 özelliklere erişmek için, bir etiketin tarandığından emin olmak amacıyla etkinliğinizin NFC amaçlarından biriyle başlatılıp başlatılmadığını kontrol edin ve ardından ekstraları amaçtan çıkarın. Aşağıdaki örnek, ACTION_NDEF_DISCOVERED amacını kontrol eder ve ekstra bir intent'den NDEF mesajlarını 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 yazma veya Android Beam ile veri gönderme konusunda size yardımcı olması için 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 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 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.

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 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

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 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 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ının 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

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 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 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 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 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>

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çimdir: urn:nfc:ext:example.com:externalType 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 üst üste 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'sine dönüştürür. Bu URL, örnekteki amaç filtresinde belirtilmiştir.

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 yüksek bir kesinlik sağlar. AAR, NDEF kaydına yerleştirilmiş bir uygulamanın paket adını içerir. 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 Google Play başlatılır ve uygulama indirilir.

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 istediğinizde 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 amacı Etkinlik düzeyinde işlemek istiyorsanız amaç filtrelerini kullanın.

Bir etiket bir AAR içeriyorsa etiket gönderme sistemi aşağıdaki şekilde gönderir:

  1. Normalde amaç filtresi kullanarak 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 işleyebiliyorsa 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 dayalı uygulamayı indirin.

Not: AAR'leri ve amaç dağıtım sistemini ön plan gönderim sistemiyle geçersiz kılabilirsiniz. Bu sistem, bir 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 şekilde bildirebilirsiniz. Bu, uygulamanız AAR içermeyen diğer etiketlerle ilgileniyorsa yararlı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şlediğinden emin olmak 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ürlerinin/URI'lerinin bir kombinasyonunu kullanmak isteyebilirsiniz. Buna ek olarak, NFC etiketlerini dağıtırken çoğu cihazda (Android destekli ve diğer cihazlar) desteği etkinleştirmek için NFC etiketlerinizi nasıl yazmak istediğinizi düşünün. Bunu, uygulamaların daha kolay ayırt etmesini sağlamak için 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 içindeki herhangi bir yere yerleştirmektir. AAR, NdefMessage içindeki tek kayıt olmadığı sürece NdefMessage cihazınızın 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'sı, uygulamaların filtrelenmesi amacıyla bir amaç oluşturmak için kullanılır. Aşağıdaki kod, bir 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 Beam, 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ı, bir alma cihazıyla yeterince yakın olduğunda ışın veren 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 aktarması, Android Beam ile benzer işlev sağlayan API düzeyi 10'da kullanılabiliyordu. Bu API'ler o zamandan beri kullanımdan kaldırılmış olsa da 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(): 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 ayarlanmışsa setNdefPushMessageCallback(), setNdefPushMessage() mesajına 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 ekranlarının kilidi açık olmalıdır.
  • Işınladığınız verileri bir NdefMessage nesnesine kapsüllemeniz gerekir.
  • Işınlamalı verileri alan NFC cihazı, com.android.npp NDEF aktarma protokolünü veya NFC Forumu'nun SNEP'sini (Basit NDEF Değişim 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 zorunludur. 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önderimini de etkinleştiriyorsa ön plan gönderiminde ayarlanan amaç 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() öğesini NdefMessage ile çağırın veya etkinliğinizin onCreate() yöntemindeki bir NfcAdapter.CreateNdefMessageCallback nesnesinde geçen setNdefPushMessageCallback işlevini ç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 etkinliklerin isteğe bağlı bir listesini gerektirir.

    Genel olarak, Etkinliğinizin yalnızca her zaman aynı NDEF mesajını aktarması gerekiyorsa, iki cihaz iletişim kuracak kapsama alanındayken setNdefPushMessage() kullanmanız gerekir. Uygulamanız, uygulamanın mevcut bağlamını önemsediğinde ve kullanıcının uygulamanızda ne yaptığına bağlı olarak bir NDEF mesajı aktarmak istediğinde setNdefPushMessageCallback kullanırsınız.

Aşağıdaki örnek, basit bir etkinliğin bir etkinliğin onCreate() yönteminde NfcAdapter.CreateNdefMessageCallback yöntemini nasıl çağırdığını gösterir (örneğin tamamı 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 açıkladığını unutmayın. Bu 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 üzeri 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 veya com.example.android.beam türünde AAR içeren bir Android Beam aldığında ya da NDEF biçimindeki 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 intent filtreleri önerilir. Çünkü 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ğlar. AAR'lerin etkinlik düzeyi ayrıntı düzeyi yoktur. Ayrıca, Android destekli bazı cihazlar AAR'leri desteklemediğinden, her ihtimale karşı NDEF mesajlarınızın ilk NDEF kaydına kimlik bilgilerini yerleştirmeniz ve bu bilgiler için filtreleme yapmanız 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.