NFC ile ilgili temel bilgiler

Bu dokümanda, Android'de gerçekleştirdiğiniz temel NFC işlemleri açıklanmaktadır. Bu makalede, NFC verilerinin NDEF mesajları biçiminde nasıl gönderileceği ve alınacağı açıklanmakta, ayrıca bu özellikleri destekleyen Android çerçeve API'leri açıklanmaktadır. NDEF olmayan verilerle çalışma hakkında bilgi de dahil olmak üzere daha ileri düzey konular için İleri seviye NFC başlıklı makaleyi inceleyin.

NFC etiketindeki NDEF verilerinin okunması, keşfedilen NFC etiketlerini analiz eden, verileri uygun şekilde kategorilere ayıran ve kategorize edilmiş verilerle ilgilenen bir uygulamayı başlatan etiket dağıtım sistemi ile yönetilir. Taranan NFC etiketini işlemek isteyen bir uygulama intent filtresi tanımlayabilir ve verileri işleme isteğinde bulunabilir.

Etiket dağıtım sistemi

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

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

  1. NFC etiketini ayrıştırma ve etiketteki veri yükünü tanımlayan MIME türünü veya URI'yi belirleme.
  2. MIME türünü veya URI'yı ve yükü bir intent içine alma. İlk iki adım NFC etiketlerinin MIME türleri ve URI'lerle eşlenmesi bölümünde açıklanmıştır.
  3. Amaca dayalı bir etkinlik başlatır. Bu konu NFC Etiketlerinin Uygulamalara Gönderilmesi bölümünde açıklanmıştır.

NFC etiketlerinin MIME türleri ve URI'lerle eşlenmesi

NFC uygulamalarınızı yazmaya başlamadan önce, farklı NFC etiketi türlerini, etiket gönderme sisteminin NFC etiketlerini nasıl ayrıştırdığını ve etiket gönderme sisteminin bir NDEF mesajı algıladığında gerçekleştirdiği özel çalışmayı anlamanız önemlidir. NFC etiketleri çok çeşitli teknolojilerle gelebilir ve ayrıca bu etiketlere birçok farklı şekilde yazılabilir. Android, NFC Forum tarafından tanımlanan NDEF standardını en çok destekleyen platformdur.

NDEF verileri, bir veya daha fazla kayıt (NdefRecord) içeren bir ileti (NdefMessage) içine yerleştirilir. Her NDEF kaydı, oluşturmak istediğiniz kayıt türüne göre iyi biçimlendirilmiş olmalıdır. Android, NDEF verileri içermeyen diğer etiket türlerini de destekler. Bu etiketlerle çalışmak için android.nfc.tech paketindeki sınıfları kullanabilirsiniz. Bu teknolojiler hakkında daha fazla bilgi edinmek için İleri seviye NFC konusuna bakın. Bu diğer etiket türleriyle çalışmak, etiketlerle iletişim kurmak için kendi protokol yığınınızı yazmanızı gerektirir. Bu nedenle, geliştirme kolaylığı ve Android destekli cihazlar için maksimum destek sağlamak amacıyla mümkün olduğunda NDEF kullanmanızı öneririz.

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

NFC etiketleri hakkında bilgi sahibi olduğunuza göre, aşağıdaki bölümlerde Android'in NDEF biçimli etiketleri nasıl işlediği daha ayrıntılı olarak açıklanmaktadır. Android destekli bir cihaz, NDEF biçimli veriler içeren bir NFC etiketini taradığında mesajı ayrıştırır ve verilerin MIME türünü veya tanımlama URI'sini belirlemeye çalışır. Bunu yapmak için sistem, NDEF mesajının tamamının nasıl yorumlanacağını belirlemek üzere NdefMessage içindeki ilk NdefRecord'ü okur (NDEF mesajında birden fazla NDEF kaydı olabilir). Düzgün biçimlendirilmiş bir NDEF mesajında ilk NdefRecord aşağıdaki alanları içerir:

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

Etiket dağıtım sistemi, bir MIME türünü veya URI'yi NDEF mesajıyla eşlemeye çalışmak için TNF ve tür alanlarını kullanır. Başarılı olursa bu bilgiler, gerçek yükle birlikte bir ACTION_NDEF_DISCOVERED amacının içinde bulunur. Bununla birlikte, etiket gönderme sisteminin ilk NDEF kaydına göre veri türünü belirleyemediği durumlar vardır. Bu durum, NDEF verileri bir MIME türü veya URI ile eşlenemediğinde ya da NFC etiketi baştan NDEF verileri içermediğinde ortaya çıkar. Bu gibi durumlarda, etiketin teknolojileri ve yük hakkında bilgi içeren bir Tag nesnesi, bunun yerine bir ACTION_TECH_DISCOVERED niyetinin içine kapsüllenir.

Tablo 1'de, etiket dağıtım sisteminin TNF ve tür alanlarını MIME türleriyle veya URI'lerle nasıl eşlediği açıklanmaktadır. Ayrıca, hangi TNF'lerin MIME türü veya URI ile eşlenemeyeceği de açıklanır. Bu durumlarda etiket dağıtım sistemi ACTION_TECH_DISCOVERED değerini kullanır.

Örneğin, etiket dağıtım sistemi TNF_ABSOLUTE_URI türündeki bir kayda rastlarsa bu kaydın değişken uzunluktaki tür alanını bir URI ile eşler. Etiket dağıtım sistemi, bu URI'yi etiketle ilgili diğer bilgilerle (ör. yük) birlikte bir ACTION_NDEF_DISCOVERED intent'inin veri alanına yerleştirir. Diğer yandan, TNF_UNKNOWN türünde bir kayıtla karşılaşırsa bunun yerine etiketin teknolojilerini kapsayan bir amaç oluşturur.

Tablo 1. Desteklenen TNF'ler ve eşlemeleri

Tür Adı Biçimi (TNF) Eşleme
TNF_ABSOLUTE_URI Tür alanına göre URI.
TNF_EMPTY Şu değere geri döner: ACTION_TECH_DISCOVERED.
TNF_EXTERNAL_TYPE Tür alanındaki URN'ye dayalı URI. URN, NDEF tür alanına kısaltılmış biçimde kodlanır: <domain_name>:<service_name>. Android bunu şu biçimde bir URI ile eşler: vnd.android.nfc://ext/<domain_name>:<service_name>.
TNF_MIME_MEDIA Tür alanına göre MIME türü.
TNF_UNCHANGED İlk kayıtta geçersiz, bu nedenle ACTION_TECH_DISCOVERED değerine geri dönüyor.
TNF_UNKNOWN Şu değere geri döner: ACTION_TECH_DISCOVERED.
TNF_WELL_KNOWN Tür alanında ayarladığınız Kayıt Türü Tanımı'na (RTD) bağlı olarak MIME türü veya URI. Kullanılabilir RTD'ler ve eşlemeleri hakkında daha fazla bilgi için Tablo 2'ye bakın.

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 Şu değere geri döner: ACTION_TECH_DISCOVERED.
RTD_HANDOVER_CARRIER ACTION_TECH_DISCOVERED değerine geri döner.
RTD_HANDOVER_REQUEST ACTION_TECH_DISCOVERED değerine geri döner.
RTD_HANDOVER_SELECT ACTION_TECH_DISCOVERED değerine geri döner.
RTD_SMART_POSTER Yükün ayrıştırılmasına dayalı URI.
RTD_TEXT text/plain öğesinin MIME türü.
RTD_URI Yüke dayalı URI.

NFC etiketleri uygulamalara nasıl gönderilir?

Etiket gönderme sistemi, NFC etiketini ve tanımlayıcı bilgilerini içeren bir amaç oluşturmayı tamamladığında niyeti, niyeti filtreleyen ilgili bir uygulamaya gönderir. Birden fazla uygulama intent'i işleyebiliyorsa kullanıcının etkinliği seçebilmesi için Etkinlik Seçici gösterilir. Etiket dağıtım sistemi, en yüksek öncelikten en düşük önceliğe göre listelenen üç intent tanımlar:

  1. ACTION_NDEF_DISCOVERED: Bu intent, NDEF yükü içeren ve tanınan bir türde olan bir etiket tarandığında bir Etkinlik başlatmak için kullanılır. Bu, en yüksek öncelikli intent'tir ve etiket dağıtım sistemi, mümkün olduğunda diğer intent'lerden önce bu intent ile bir etkinlik başlatmaya çalışır.
  2. ACTION_TECH_DISCOVERED: ACTION_NDEF_DISCOVERED intent'ini işlemek için hiçbir etkinlik kaydedilmezse etiket dağıtım sistemi bu intent ile bir uygulama başlatmaya çalışır. Taranan etiket, MIME türü veya URI ile eşlenemeyen NDEF verileri içeriyorsa ya da etiket NDEF verileri içermiyor ancak bilinen bir etiket teknolojisine sahipse bu intent doğrudan başlatılır (ACTION_NDEF_DISCOVERED önce başlatılmadan).
  3. ACTION_TAG_DISCOVERED: ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED amaçları hiçbir etkinlik tarafından yönetilmezse bu intent başlatılır.

Etiket dağıtım sisteminin temel işleyiş şekli şu şekildedir:

  1. NFC etiketini ayrıştırırken etiket gönderme sistemi tarafından oluşturulan amaçla (ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED) bir Etkinlik başlatmayı deneyin.
  2. Bu intent için hiçbir etkinlik filtrelenmiyorsa bir uygulama intent için filtre uygulayana veya etiket dağıtım sistemi tüm olası intent'leri deneyene kadar, bir uygulama başlatana kadar bir etkinlik başlatmayı deneyin.ACTION_TECH_DISCOVEREDACTION_TAG_DISCOVERED
  3. Hiçbir uygulama, intentlerden herhangi biri için filtreleme yapmıyorsa hiçbir işlem yapmayın.
Şekil 1. Etiket Sevk Sistemi

Mümkün olduğunda NDEF mesajları ve ACTION_NDEF_DISCOVERED intent'i kullanın. Bu intent, üçü arasında en belirgin olanıdır. Bu intent, uygulamanızı diğer iki intent'ten daha uygun bir zamanda başlatmanıza olanak tanır ve kullanıcıya daha iyi bir deneyim sunar.

Android manifest dosyasında NFC erişimi isteme

Bir cihazın NFC donanımına erişip NFC intent'lerini düzgün şekilde işleyebilmek için AndroidManifest.xml dosyanızda şu öğeleri tanımlamanız gerekir:

  • NFC donanımına erişmek için kullanılan NFC <uses-permission> öğesi:
    <uses-permission android:name="android.permission.NFC" />
    
  • Uygulamanızın destekleyebileceği minimum SDK sürümü. API düzeyi 9 yalnızca ACTION_TAG_DISCOVERED üzerinden sınırlı etiket dağıtımını destekler ve yalnızca EXTRA_NDEF_MESSAGES ekstrası üzerinden NDEF mesajlarına erişim sağlar. Diğer etiket özelliklerine veya G/Ç işlemlerine erişilemez. API düzeyi 10, ön planda NDEF itmenin yanı sıra kapsamlı okuyucu/yazar desteği içerir. API düzeyi 14 ise NDEF kaydı oluşturmak için ekstra kolaylık yöntemleri sağlar.
    <uses-sdk android:minSdkVersion="10"/>
    
  • Uygulamanızın yalnızca NFC donanımına sahip cihazlarda Google Play'de görünmesi için uses-feature öğesi:
    <uses-feature android:name="android.hardware.nfc" android:required="true" />
    

    Uygulamanız NFC işlevini kullanıyorsa ancak bu işlev uygulamanız için kritik öneme sahip değilse uses-feature öğesini atlayabilir ve getDefaultAdapter() değerinin null olup olmadığını kontrol ederek NFC'nin çalışma zamanında kullanılabilir olup olmadığını kontrol edebilirsiniz.

NFC amaçları için filtrele

İşlemek istediğiniz bir NFC etiketi tarandığında uygulamanızı başlatmak için uygulamanız, Android manifest dosyasındaki NFC amaçlarından birini, ikisini veya her üçü için filtre uygulayabilir. Ancak, uygulamanızın ne zaman başlayacağını en iyi şekilde kontrol edebilmek için genellikle ACTION_NDEF_DISCOVERED amacını filtrelemek istersiniz. ACTION_TECH_DISCOVERED amacı, ACTION_NDEF_DISCOVERED için filtre uygulanmayan uygulamalar olduğunda veya yük NDEF olmadığında ACTION_NDEF_DISCOVERED için yedek olarak kullanılır. ACTION_TAG_DISCOVERED için filtreleme yapmak genellikle filtrelenecek çok genel bir kategoridir. Birçok uygulama, ACTION_TAG_DISCOVERED'den önce ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED için filtreleme yapar. Bu nedenle, uygulamanızın başlatılma olasılığı düşüktür. ACTION_TAG_DISCOVERED, yalnızca ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED intent'ini işlemek için başka uygulama yüklenmemişse uygulamaların filtrelemesi için son çare olarak kullanılabilir.

NFC etiketi dağıtımları değişiklik gösterdiği ve çoğu zaman sizin kontrolünüzde olmadığı için bu her zaman mümkün değildir. Bu nedenle, gerektiğinde diğer iki amaca geçebilirsiniz. Yazılan etiket türleri ve veriler üzerinde kontrol sahibi olduğunuzda, etiketlerinizi biçimlendirmek için NDEF kullanmanız önerilir. Aşağıdaki bölümlerde, her amaç türü için nasıl filtre uygulayacağınız açıklanmaktadır.

ACTION_NDEF_DISCOVERED

ACTION_NDEF_DISCOVERED amaçlarına göre filtrelemek için amaç filtresini ve filtrelemek istediğiniz verilerin türünü bildirin. Aşağıdaki örnek, MIME türü text/plain olan ACTION_NDEF_DISCOVEREDintent'leri filtreler:

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="text/plain" />
</intent-filter>

Aşağıdaki örnekte, https://developer.android.com/index.html biçiminde bir URI filtrelenir.

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

ACTION_TECH_DISCOVERED

Etkinliğiniz ACTION_TECH_DISCOVERED intent'i filtreliyorsa etkinliğinizin tech-list grubunda desteklediği teknolojileri belirten bir XML kaynak dosyası oluşturmanız gerekir. tech-list grubu, etiket tarafından desteklenen teknolojilerin bir alt kümesiyse etkinliğiniz eşleşme olarak kabul edilir ve getTechList() işlevini çağırarak bu bilgilere ulaşabilirsiniz.

Örneğin, taranan etiket MifareClassic, NdefFormatable ve NfcA'yı destekliyorsa etkinliğinizin eşlenmesi için tech-list ayarınızda bu teknolojilerin üçünü, ikisini veya birini (ve başka bir şey) belirtmeniz gerekir.

Aşağıdaki örnekte tüm teknolojiler tanımlanmaktadır. NFC etiketiniz tarafından desteklenmeyenleri kaldırmanız gerekir. Bu dosyayı <project-root>/res/xml klasörüne kaydedin (istediğiniz gibi adlandırabilirsiniz).

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

Birden fazla tech-list grubu da belirtebilirsiniz. tech-list gruplarının her biri bağımsız olarak değerlendirilir ve tek bir tech-list grubu getTechList() tarafından döndürülen teknolojilerin alt kümesiyse etkinliğiniz eşleşme olarak kabul edilir. Bu, eşleşen teknolojiler için AND ve OR semantiğine olanak tanır. Aşağıdaki örnek, NfcA ve Ndef teknolojilerini veya NfcB ve Ndef teknolojilerini destekleyebilecek etiketleri eşleştirir:

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

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

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

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

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

ACTION_TAG_KEŞİF

ACTION_TAG_DISCOVERED için filtre uygulamak üzere aşağıdaki intent filtresini kullanın:

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

Intent'lerden bilgi edinme

Bir etkinlik NFC intent'i nedeniyle başlatılırsa intent'ten taranan NFC etiketi hakkında bilgi edinebilirsiniz. Intent'ler, taranan etikete bağlı olarak aşağıdaki ekstraları içerebilir:

Bu ekstraları elde etmek için etkinliğinizin, bir etiketin tarandığından emin olmak amacıyla NFC intent'lerinden biriyle başlatılıp başlatılmadığını kontrol edin ve ardından intent'ten ekstraları alın. Aşağıdaki örnek, ACTION_NDEF_DISCOVERED intent'ini kontrol eder ve NDEF mesajlarını bir intent ekstrasından alır.

Kotlin

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

Java

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

Alternatif olarak, amaçtan bir Tag nesnesi alabilirsiniz. Bu nesne, yükü içerir ve etiketin teknolojilerini sıralamanıza olanak tanır:

Kotlin

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

Java

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

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

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

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

TNF_ABSOLUTE_URI

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

TNF_ABSOLUTE_URI NDEF kaydı aşağıdaki şekilde oluşturulabilir:

Kotlin

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

Java

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

Önceki NDEF kaydının intent filtresi aşağıdaki gibi görünür:

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

TNF_MIME_MEDIA

TNF_MIME_MEDIA NDEF kaydı oluşturmak için aşağıdaki yöntemlerden birini kullanabilirsiniz:

createMime() yöntemini kullanarak:

Kotlin

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

Java

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

NdefRecord öğesini manuel olarak oluşturma:

Kotlin

val mimeRecord = Charset.forName("US-ASCII").let { usAscii ->
    NdefRecord(
            NdefRecord.TNF_MIME_MEDIA,
            "application/vnd.com.example.android.beam".toByteArray(usAscii),
            ByteArray(0),
            "Beam me up, Android!".toByteArray(usAscii)
    )
}

Java

NdefRecord mimeRecord = new NdefRecord(
    NdefRecord.TNF_MIME_MEDIA ,
    "application/vnd.com.example.android.beam".getBytes(Charset.forName("US-ASCII")),
    new byte[0], "Beam me up, Android!".getBytes(Charset.forName("US-ASCII")));

Önceki NDEF kaydının intent filtresi aşağıdaki gibi görünür:

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

RTD_TEXT ile TNF_WELL_KNOWN

TNF_WELL_KNOWN NDEF kaydı aşağıdaki şekilde oluşturulabilir:

Kotlin

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

Java

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

Önceki NDEF kaydının intent filtresi aşağıdaki gibi görünür:

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="text/plain" />
</intent-filter>

RTD_URI ile TNF_WELL_KNOWN

Aşağıdaki yöntemleri kullanarak TNF_WELL_KNOWN NDEF kaydı oluşturabilirsiniz:

createUri(String) yöntemini kullanarak:

Kotlin

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

Java

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

createUri(Uri) yöntemini kullanarak:

Kotlin

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

Java

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

NdefRecord öğesini manuel olarak oluşturma:

Kotlin

val uriField = "example.com".toByteArray(Charset.forName("US-ASCII"))
val payload = ByteArray(uriField.size + 1)                   //add 1 for the URI Prefix
payload [0] = 0x01                                           //prefixes https://www. to the URI
System.arraycopy(uriField, 0, payload, 1, uriField.size)     //appends URI to payload
val rtdUriRecord = NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, ByteArray(0), payload)

Java

byte[] uriField = "example.com".getBytes(Charset.forName("US-ASCII"));
byte[] payload = new byte[uriField.length + 1];              //add 1 for the URI Prefix
payload[0] = 0x01;                                           //prefixes https://www. to the URI
System.arraycopy(uriField, 0, payload, 1, uriField.length);  //appends URI to payload
NdefRecord rtdUriRecord = new NdefRecord(
    NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, new byte[0], payload);

Önceki NDEF kaydının intent filtresi aşağıdaki gibi görünür:

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

TNF_EXTERNAL_TYPE

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

createExternal() yöntemini kullanarak:

Kotlin

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

Java

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

NdefRecord öğesini manuel olarak oluşturma:

Kotlin

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

Java

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

Önceki NDEF kaydının intent filtresi aşağıdaki gibi görünür:

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

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

Not: TNF_EXTERNAL_TYPE için URN'lerin standart biçimi urn:nfc:ext:example.com:externalType şeklindedir. Ancak NFC Forum RTD spesifikasyonu, URN'nin urn:nfc:ext: kısmının NDEF kaydından çıkarılması gerektiğini belirtir. Dolayısıyla, sağlamanız gereken tek şey, iki nokta üst üste işaretiyle ayrılmış alan (örnekte example.com) ve tür (örnekte externalType) değerleridir. Android, TNF_EXTERNAL_TYPE'ü gönderirken urn:nfc:ext:example.com:externalType URN'sini bir vnd.android.nfc://ext/example.com:externalType URI'sine dönüştürür. Örnekteki intent filtresi de bunu belirtir.

Android uygulama kayıtları

Android 4.0'ta (API düzeyi 14) kullanıma sunulan Android Uygulama Kaydı (AAR), bir NFC etiketi tarandığında uygulamanızın başlatılacağı konusunda daha güçlü bir güvence sağlar. AAR, bir NDEF kaydının içine yerleştirilmiş bir uygulamanın paket adını içerir. Android, AAR'ler için NDEF mesajının tamamını aradığından NDEF mesajınızın herhangi bir NDEF kaydına AAR ekleyebilirsiniz. Bir AAR bulursa uygulamayı AAR'daki paket adına göre başlatır. Uygulama cihazda yoksa uygulamayı indirmek için Google Play açılır.

Diğer uygulamaların aynı intent için filtreleme yapmasını ve dağıttığınız belirli etiketleri işlemesini engellemek istiyorsanız AAR'lar kullanışlıdır. AAR'lar, paket adı kısıtlaması nedeniyle intent filtrelemede olduğu gibi etkinlik düzeyinde değil, yalnızca uygulama düzeyinde desteklenir. Bir niyeti etkinlik düzeyinde işlemek istiyorsanız intent filtrelerini kullanın.

Bir etiket AAR içeriyorsa etiket dağıtım sistemi aşağıdaki şekilde dağıtım yapar:

  1. Normal şekilde bir intent filtresi kullanarak etkinlik başlatmayı deneyin. Intent ile eşleşen etkinlik, AAR ile de eşleşiyorsa etkinliği başlatın.
  2. Intent için filtre uygulayan etkinlik AAR ile eşleşmiyorsa, intent'i birden fazla etkinlik işleyebiliyorsa veya intent'i hiçbir etkinlik işleyemiyorsa AAR tarafından belirtilen uygulamayı başlatın.
  3. AAR ile başlatılabilen bir uygulama yoksa AAR'a göre uygulamayı indirmek için Google Play'e gidin.

Not: AAR'ları ve intent dağıtım sistemini ön plan dağıtım sistemi ile geçersiz kılabilirsiniz. Bu sistem, NFC etiketi algılandığında ön plan etkinliğinin öncelikli olmasını sağlar. Bu yöntemde, AAR'ların ve intent dağıtım sisteminin geçersiz kılınması için etkinliğin ön planda olması gerekir.

AAR içermeyen taranmış etiketleri yine de filtrelemek istiyorsanız amaç filtrelerini normal olarak bildirebilirsiniz. Uygulamanız, AAR içermeyen diğer etiketlerle ilgileniyorsa bu yöntem yararlıdır. Örneğin, uygulamanızın dağıttığınız özel etiketlerin yanı sıra üçüncü taraflar tarafından dağıtılan genel etiketleri de işlemesini garanti etmek isteyebilirsiniz. AAR'ların Android 4.0 veya sonraki sürümlere özgü olduğunu unutmayın. Bu nedenle, etiketleri dağıtırken büyük olasılıkla en geniş cihaz yelpazesini desteklemek için AAR'lar ile MIME türleri/URI'lerin bir kombinasyonunu kullanmak istersiniz. Ayrıca, NFC etiketlerini dağıtırken çoğu cihaz (Android destekli ve diğer cihazlar) için destek sunmak üzere NFC etiketlerinizi nasıl yazmak istediğinizi düşünün. Uygulamaların ayırt etmesini kolaylaştırmak için görece benzersiz bir MIME türü veya URI tanımlayarak bunu yapabilirsiniz.

Android, AAR oluşturmak için basit bir API sunar createApplicationRecord(). Tek yapmanız gereken AAR'ı NdefMessage'ünüze yerleştirmektir. AAR, NdefMessage'daki tek kayıt değilse NdefMessage'ün ilk kaydını kullanmak istemiyorsunuz. Bunun nedeni, Android sisteminin, uygulamaların filtrelemesi için intent oluşturmak amacıyla kullanılan etiketin MIME türünü veya URI'sini belirlemek için NdefMessage öğesinin ilk kaydını kontrol etmesidir. Aşağıdaki kodda, AAR'ın nasıl oluşturulacağı gösterilmektedir:

Kotlin

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

Java

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