NFC ile ilgili temel bilgiler

Bu belgede, Android'de gerçekleştirdiğiniz temel NFC görevleri açıklanmaktadır. NDEF mesajları biçiminde NFC verilerinin nasıl gönderileceğini ve alınacağını açıklar ve bu özellikleri destekleyen Android çerçeve API'lerini tanımlar. NDEF olmayan verilerle çalışma konusunun da ele alındığı daha ileri düzey konular için Gelişmiş NFC başlıklı makaleyi inceleyin.

Bir NFC etiketinden NDEF verilerini okuma işlemi, keşfedilen NFC etiketlerini analiz eden, verileri uygun şekilde kategorize eden ve kategorize edilmiş verilerle ilgilenen bir uygulamayı başlatan etiket dağıtım sistemi ile gerçekleştirilir. Taranan NFC etiketini işlemek isteyen bir uygulama, amaç filtresi bildirebilir ve verileri işlemeyi isteyebilir.

Etiket gönderme sistemi

Android destekli cihazlarda, cihazın Ayarlar menüsünde NFC devre dışı bırakılmadığı sürece ekranın kilidi açıkken genellikle NFC etiketleri aranır. Android destekli bir cihaz NFC etiketini algıladığında, kullanıcının hangi uygulamayı kullanacağını sormadan en uygun etkinliğin amacı işlemesi istenir. Cihazlar NFC etiketlerini çok kısa bir mesafede taradığından, kullanıcıların bir etkinliği manuel olarak seçmesini istemek cihazı etiketten uzaklaştırmalarına ve bağlantıyı kesmelerine neden olabilir. Etkinlik Seçici'nin görünmesini önlemek için etkinliğinizi yalnızca ilgilendiği NFC etiketlerini işleyecek şekilde geliştirmeniz gerekir.

Android, bu hedefinize 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 gönderme sistemi sunar. Bu işlem şu şekilde yapılır:

  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'yi ve yükü bir amaç içinde kapsülleme. Bu ilk iki adım, NFC etiketleri MIME türleri ve URI'lerle nasıl eşlenir? başlıklı makalede açıklanmıştır.
  3. İşleme dayalı bir etkinlik başlatır. Bu durum, NFC Etiketleri Uygulamalara Nasıl Gönderilir? başlıklı makalede açıklanmaktadır.

NFC etiketleri, MIME türleriyle 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 teknolojilerle birlikte gelir ve üzerlerine birçok farklı şekilde veri yazılabilir. Android, NFC Forum tarafından tanımlanan NDEF standardını en çok destekleyen işletim sistemidir.

NDEF verileri, bir veya daha fazla kayıt (NdefRecord) içeren bir mesaj (NdefMessage) içinde kapsüllenir. Her NDEF kaydı, oluşturmak istediğiniz kayıt türünün spesifikasyonuna göre iyi biçimlendirilmiş olmalıdır. Android, NDEF verileri içermeyen diğer etiket türlerini de destekler. Bu etiketlerle android.nfc.tech paketindeki sınıfları kullanarak çalışabilirsiniz. Bu teknolojiler hakkında daha fazla bilgi edinmek için İleri düzey NFC konusuna bakın. Bu diğer etiket türleriyle çalışmak, etiketlerle iletişim kurmak için kendi protokol yığını 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: Tam NDEF spesifikasyonlarını indirmek için NFC Forum Specifications & Application Documents sitesine gidin ve NDEF kayıtlarının nasıl oluşturulacağıyla ilgili örnekler için Creating common types of NDEF records (Yaygın NDEF kayıt türleri oluşturma) bölümüne bakın.

NFC etiketleri hakkında temel bilgiler edindiğinize 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'sini bulmaya çalışır. Bunu yapmak için sistem, NdefMessage içindeki ilk NdefRecord karakterini okuyarak NDEF mesajının tamamının nasıl yorumlanacağını belirler (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 uzunluklu tür alanının nasıl yorumlanacağını gösterir. Geçerli değerler 1. Tablo'da 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 uzunluklu kimlik
Kaydın benzersiz tanımlayıcısı. Bu alan sık kullanılmaz ancak bir etiketi benzersiz olarak tanımlamanız gerekiyorsa etiket için bir kimlik oluşturabilirsiniz.
Değişken uzunluklu 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 yerleştirir. Ancak, etiket gönderme sisteminin ilk NDEF kaydına göre veri türünü belirleyemediği durumlar olabilir. Bu durum, NDEF verileri bir MIME türü veya URI ile eşlenemediğinde ya da NFC etiketinde başlangıçta NDEF verileri bulunmadığında ortaya çıkar. 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, etiket gönderme sisteminin TNF ve tür alanlarını MIME türleriyle veya URI'lerle nasıl eşlediğini açıklar. Ayrıca, hangi TNF'lerin MIME türü veya URI ile eşleştirilemeyeceğ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 kayda rastlarsa bu kaydın değişken uzunluklu tür alanını bir URI'ye eşler. Etiket gönderme sistemi, bu URI'yi ACTION_NDEF_DISCOVERED amacının veri alanında, etiketin diğer bilgileriyle (ör. yük) birlikte kapsar. Diğer yandan, TNF_UNKNOWN türünde bir kayıtla karşılaşırsa 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'ya geri döner.
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'ye 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ğundan ACTION_TECH_DISCOVERED değerine geri dönülür.
TNF_UNKNOWN ACTION_TECH_DISCOVERED'ya 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. Kullanılabilir RTD'ler ve bunların 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 bunların eşlemeleri

Kayıt Türü Tanımı (RTD) Eşleme
RTD_ALTERNATIVE_CARRIER ACTION_TECH_DISCOVERED'ya geri döner.
RTD_HANDOVER_CARRIER ACTION_TECH_DISCOVERED'ya geri döner.
RTD_HANDOVER_REQUEST ACTION_TECH_DISCOVERED'ya geri döner.
RTD_HANDOVER_SELECT ACTION_TECH_DISCOVERED'ya geri döner.
RTD_SMART_POSTER Yükü ayrıştırmaya dayalı URI.
RTD_TEXT text/plain öğesinin MIME türü.
RTD_URI Yük tabanlı URI.

NFC etiketleri uygulamalara nasıl gönderilir?

Etiket gönderme sistemi, NFC etiketini ve tanımlayıcı bilgilerini kapsayan bir amaç oluşturmayı tamamladığında bu amacı, amaç için filtreleme yapan ilgili bir uygulamaya gönderir. Niyeti birden fazla uygulama işleyebiliyorsa kullanıcı, etkinliği seçebilmesi için Etkinlik Seçici gösterilir. Etiket gönderme sistemi üç amaç tanımlar. Bu amaçlar, en yüksek öncelikten en düşük önceliğe doğru sıralanır:

  1. ACTION_NDEF_DISCOVERED: Bu amaç, NDEF yükü içeren bir etiket tarandığında ve tanınan bir türde olduğunda bir Etkinliği 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 tüm amaçlardan önce bu amaçla bir Etkinlik başlatmaya çalışır.

    Not: Android 16'dan itibaren, URL bağlantılarını depolayan NFC etiketlerinin (ör.URI şeması "https://" veya "http://") taranması, ACTION_NDEF_DISCOVERED amacı yerine ACTION_VIEW amacını tetikleyecektir.

  2. ACTION_TECH_DISCOVERED: ACTION_NDEF_DISCOVERED amacını işlemek için herhangi bir etkinlik kaydedilmezse etiket gönderme sistemi, bu amaçla bir uygulamayı başlatmaya çalışır. Taranan etiket, MIME türü veya URI ile eşlenemeyen NDEF verileri içeriyorsa ya da etiket NDEF verileri içermiyorsa ancak bilinen bir etiket teknolojisine aitse bu amaç doğrudan (önce ACTION_NDEF_DISCOVERED başlatılmadan) da başlatılır.
  3. ACTION_TAG_DISCOVERED: Bu amaç, ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED amaçlarını işleyen etkinlik yoksa başlatılır.

Etiket gönderme sisteminin temel işleyiş şekli şöyledir:

  1. NFC etiketi ayrıştırılırken (ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED) etiket gönderme sistemi tarafından oluşturulan amaçla bir etkinlik başlatmaya çalışın.
  2. Bu amaç için etkinlik filtresi yoksa bir uygulama amacı filtreleyene veya etiket gönderme sistemi olası tüm amaçları deneyene kadar bir sonraki en düşük öncelikli amaçla (ACTION_TECH_DISCOVERED veya ACTION_TAG_DISCOVERED) bir etkinlik başlatmayı deneyin.
  3. Niyetlerden herhangi biri için uygulama filtresi yoksa herhangi bir işlem yapmayın.
Şekil 1. Etiket Gönderme Sistemi

Mümkün olduğunda, üçü arasında en spesifik olan ACTION_NDEF_DISCOVERED niyeti ve NDEF mesajlarıyla çalışın. 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 sunar.

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

Bir cihazın NFC donanımına erişip NFC amaçlarını düzgün şekilde işleyebilmek için AndroidManifest.xml dosyanızda aşağıdaki öğeleri bildirin:

  • 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 aracılığıyla sınırlı etiket göndermeyi destekler ve yalnızca EXTRA_NDEF_MESSAGES ekstrası aracılığıyla NDEF mesajlarına erişim sağlar. Diğer etiket özelliklerine veya G/Ç işlemlerine erişilemez. API düzeyi 10, kapsamlı okuyucu/yazıcı desteğinin yanı sıra ön planda NDEF gönderme özelliğini içerir. API düzeyi 14 ise NDEF kayıtları oluşturmak için ek 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örünmesi için uses-feature öğesi:
    <uses-feature android:name="android.hardware.nfc" android:required="true" />

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

NFC amaçları için filtreleme

Uygulamanızın, işlemek istediğiniz bir NFC etiketi tarandığında başlatılması için Android manifestindeki bir, iki veya üç NFC intent'ini filtreleyebilir. Ancak, uygulamanızın ne zaman başlayacağını en iyi şekilde kontrol etmek için genellikle ACTION_NDEF_DISCOVERED amacına göre filtre uygulamak istersiniz. ACTION_TECH_DISCOVERED amacı, ACTION_NDEF_DISCOVERED için uygulama filtresi olmadığında veya yük NDEF olmadığında ACTION_NDEF_DISCOVERED için yedek olarak kullanılır. ACTION_TAG_DISCOVERED için filtreleme genellikle filtrelemek için ç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 amacını işlemek için başka uygulama yüklenmediği durumlarda uygulamaların filtrelemesi için son çare olarak kullanılabilir.

NFC etiketi dağıtımları değişiklik gösterdiğinden 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 amaca geri dönebilirsiniz. Yazılan etiket ve veri türleri üzerinde kontrol sahibi olduğunuzda, etiketlerinizi biçimlendirmek için NDEF'i kullanmanız önerilir. Aşağıdaki bölümlerde her bir amaç türüne göre nasıl filtreleme yapacağınız açıklanmaktadır.

ACTION_NDEF_DISCOVERED

ACTION_NDEF_DISCOVERED amaçları için filtre uygulamak üzere, filtrelemek istediğiniz veri türüyle birlikte amaç filtresini bildirin. Aşağıdaki örnek, ACTION_NDEF_DISCOVERED MIME türüne sahip text/plain amaçlarını 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'yi filtreler.

<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 niyeti için filtreleniyorsa tech-list kümesi içinde etkinliğinizin desteklediği teknolojileri belirten bir XML kaynak dosyası oluşturmanız gerekir. Etkinliğiniz, tech-list kümesi, etiketin desteklediği teknolojilerin bir alt kümesi ise eşleşme olarak kabul edilir. Bu kümeyi getTechList() çağırarak elde edebilirsiniz.

Örneğin, taranan etiket MifareClassic, NdefFormatable ve NfcA'yı destekliyorsa etkinliğinizin eşleştirilmesi için tech-list kümenizin bu teknolojilerin üçünü, ikisini veya birini (başka bir şey değil) belirtmesi gerekir.

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

<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 kümesi de belirtebilirsiniz. tech-list kümelerinin her biri bağımsız olarak değerlendirilir ve herhangi bir tech-list kümesi, getTechList() tarafından döndürülen teknolojilerin bir alt kümesi ise etkinliğiniz eşleşme olarak kabul edilir. Bu, eşleşme teknolojileri için AND ve OR anlamlarını sağlar. Aşağıdaki örnek, NfcA ve Ndef teknolojilerini veya NfcB ve Ndef teknolojilerini destekleyebilen etiketlerle eşleşir:

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

AndroidManifest.xml dosyanızda, az önce oluşturduğunuz kaynak dosyasını <activity> öğesinin içindeki <meta-data> öğesinde aşağıdaki örnekteki 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 belgesindeki Desteklenen Etiket Teknolojileriyle Çalışma başlıklı makaleyi inceleyin.

ACTION_TAG_DISCOVERED

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

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

ACTION_VIEW

Android 16'dan itibaren, URL bağlantılarını depolayan NFC etiketlerinin taranması ACTION_VIEW amacını tetikleyecektir. ACTION_VIEW için filtreleme yapmak istiyorsanız this bölümüne bakın. URL için uygulamanızı açmak üzere Android app links öğesini kullanın.

Amaçlardan bilgi edinme

Bir etkinlik NFC intent'i nedeniyle başlatılırsa taranan NFC etiketiyle ilgili bilgileri intent'ten alabilirsiniz. Niyetler, taranan etikete bağlı olarak aşağıdaki ekstraları içerebilir:

Bu ekstraları almak 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 alın. Aşağıdaki örnekte ACTION_NDEF_DISCOVERED intent'i kontrol edilir ve intent extra'dan NDEF mesajları alını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 de alabilirsiniz. Bu nesne, yükü içerir ve etiketin teknolojilerini listelemenize 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'dan (API seviyesi 14) 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ür NDEF kayıtları oluşturmanıza yardımcı olmak için kullanılabilir. 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 amaç filtresinin nasıl oluşturulacağı da açıklanmaktadır. Bu NDEF kaydı örneklerinin tümü, 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.

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

Kotlin

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

Java

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

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

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

createMime() yöntemini kullanarak:

Kotlin

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

Java

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

NdefRecord öğ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 amaç 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>

TNF_WELL_KNOWN with RTD_TEXT

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

Kotlin

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

Java

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

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

TNF_WELL_KNOWN with RTD_URI

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

createUri(String) yöntemini kullanarak:

Kotlin

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

Java

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

createUri(Uri) yöntemini kullanarak:

Kotlin

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

Java

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

NdefRecord öğ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 amaç 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ö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 öğ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 amaç 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 destekli hem de Android destekli olmayan cihazları daha iyi desteklemek için daha genel NFC etiketi dağıtımlarında TNF_EXTERNAL_TYPE kullanın.

Not: TNF_EXTERNAL_TYPE için URN'ler urn:nfc:ext:example.com:externalType biçimindedir. Ancak NFC Forum RTD spesifikasyonu, URN'nin urn:nfc:ext: bölümünün NDEF kaydından çıkarılması gerektiğini belirtir. Bu nedenle, iki nokta üst üste ile ayrılmış alan (örnekte example.com) ve tür (örnekte externalType) bilgilerini sağlamanız yeterlidir. 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, örnekteki amaç filtresinin bildirdiği URI'dir.

Android uygulama 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ılacağına dair daha güçlü bir kesinlik sağlar. AAR'de, NDEF kaydına yerleştirilmiş bir uygulamanın paket adı bulunur. Android, AAR'ler için NDEF mesajının tamamında arama yaptığından NDEF mesajınızın herhangi bir NDEF kaydına AAR ekleyebilirsiniz. Bir AAR bulursa uygulamayı AAR'nin içindeki paket adına göre başlatır. Uygulama cihazda yoksa Google Play başlatılarak uygulama indirilir.

Diğer uygulamaların aynı amaç için filtreleme yapmasını ve dağıttığınız belirli etiketleri işlemesini önlemek istiyorsanız AAR'ler kullanışlıdır. Paket adı kısıtlaması nedeniyle AAR'ler yalnızca uygulama düzeyinde desteklenir ve amaç filtresinde olduğu gibi etkinlik düzeyinde desteklenmez. Bir amaca etkinlik düzeyinde yanıt vermek istiyorsanız amaç filtrelerini kullanın.

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

  1. Normal şekilde bir amaç filtresi kullanarak Etkinlik başlatmayı deneyin. Amaca uygun Etkinlik, AAR ile de eşleşiyorsa Etkinliği başlatın.
  2. Amacı filtreleyen Etkinlik, AAR ile eşleşmiyorsa, birden fazla Etkinlik amacı işleyebiliyorsa veya hiçbir Etkinlik amacı işlemiyorsa AAR tarafından belirtilen uygulamayı başlatın.
  3. AAR ile hiçbir uygulama başlatılamıyorsa Google Play'e giderek AAR'ye dayalı uygulamayı indirin.

Not: NFC etiketi keşfedildiğinde ön plan etkinliğinin öncelikli olmasını sağlayan ön plan gönderme sistemi ile AAR'leri ve amaç gönderme sistemini geçersiz kılabilirsiniz. Bu yöntemde, AAR'leri ve amaç gönderme sistemini geçersiz kılmak için etkinliğin ön planda olması gerekir.

Yine de AAR içermeyen taranmış etiketleri 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 tescilli etiketlerin yanı sıra üçüncü taraflarca dağıtılan genel etiketleri de işlemesini garanti etmek isteyebilirsiniz. AAR'lerin Android 4.0 veya sonraki sürümlerdeki cihazlara özel olduğunu unutmayın. Bu nedenle, etiketleri dağıtırken en geniş cihaz aralığını desteklemek için büyük olasılıkla AAR'ler ile MIME türleri/URI'lerin bir kombinasyonunu kullanmak isteyeceksiniz. Ayrıca, NFC etiketlerini dağıtırken en çok cihazın (Android destekli ve diğer cihazlar) desteklenmesini sağlamak için NFC etiketlerinize nasıl yazmak istediğinizi düşünün. Bunu, uygulamaların ayırt etmesini kolaylaştırmak için nispeten benzersiz bir MIME türü veya URI tanımlayarak yapabilirsiniz.

Android, AAR oluşturmak için basit bir API sağlar: createApplicationRecord(). Tek yapmanız gereken AAR'yi NdefMessage'nize yerleştirmek. NdefMessage içinde tek kayıt AAR değilse NdefMessage ilk kaydını kullanmak istemiyorsunuz. Bunun nedeni, Android sisteminin, uygulamaların filtrelemesi için bir amaç oluşturmak üzere kullanılan etiketin MIME türünü veya URI'sini belirlemek amacıyla NdefMessage öğesinin ilk kaydını kontrol etmesidir. 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")}
        );
)

NFC etiketi taraması için uygulamaların izin verilenler listesi

Android 16'dan itibaren, bir uygulama NFC etiketlerini taramak için ilk NFC amacını aldığında kullanıcılar bilgilendirilir. Kullanıcıya, bildirimde uygulamanın artık NFC etiketlerini taramasına izin vermeme seçeneği sunulur.

Not: NFC etiketi tarama uygulaması izin verilenler listesine Settings > Apps > Special app access > Launch via NFC bölümünden erişilebilir.

Bu mekanizma, kullanıcıların NFC etiketi amaçları için kayıtlı amaç filtreleri olan bazı uygulamaların, telefonu bir NFC etiketinin (kredi kartı, başka bir telefon/saat vb.) yanına yerleştirdiklerinde tekrar tekrar ön plana çıkarılmasıyla ilgili endişelerini gidermek için eklenmiştir.