NFC ile ilgili temel bilgiler

Bu dokümanda, Android'de gerçekleştirdiğiniz temel NFC görevleri açıklanmaktadır. Bu kısımda e-posta göndermek için NFC verilerini NDEF mesajları biçiminde alır ve aşağıdakileri destekleyen Android çerçevesi API'lerini açıklar: özellikler. NDEF olmayan verilerle çalışma konulu bir tartışma da dahil olmak üzere daha ileri düzey konular için Gelişmiş NFC konusuna bakın.

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

Bir NFC etiketinden NDEF verilerinin okunması, etiket gönderme sistemi kullanabilir. kategorize edilmiş verilerle ilgilenen bir uygulamadır. Bu uygulamada taranan NFC etiketi amaç filtresi bildirebilir istek üzerine geçerlidir.

Android BeamTM özelliği, cihazın bir NDEF mesajını başka bir cihaza aktarabilirsiniz. Bu etkileşim, ilişkilendirmenin Bluetooth gibi diğer kablosuz teknolojilerden daha veri gönderebiliyor. Çünkü NFC ile gereklidir. İki cihaz geldiğinde bağlantı otomatik olarak başlatılır içine ekleyebilirsiniz. Android Beam bir dizi NFC API'si aracılığıyla kullanılabilir. Böylece tüm uygulamalar veri iletimi yapabilir. bilgileri kontrol edebilirsiniz. Ö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.

Etiket gönderme sistemi

Android destekli cihazlar genellikle ekran kilitliyken NFC etiketlerini arar. Cihazın Ayarlar menüsünde NFC devre dışı bırakılmadığı sürece kilidi açıldığında. Android destekli bir cihaz bir NFC etiketi bulduğunda, istenen davranış kullanıcıya hangi uygulamanın yapılacağını sormadan amacı en uygun tıklayın. Cihazlar NFC etiketlerini çok kısa bir aralıkta taradığından, kullanıcıları muhtemelen manuel olarak bir etkinlik seçerseniz cihazı etiketten uzaklaştırıp bağlantıyı koparmaya zorlarlar. Etkinliğinizi yalnızca etkinliğinizin önem verdiği NFC etiketlerini işleyecek şekilde geliştirmelisiniz Etkinlik Seçici'nin görünmesini engelleyebilir.

Android, bu hedefe ulaşmanıza yardımcı olmak için taranan taramaları analiz eden özel bir etiket dağıtma sistemi sunar. NFC etiketlerini kullanır, ayrıştırır ve taranan verilerle ilgilenen uygulamaları bulmaya çalışır. Google bunu aşağıdakileri yaparak yapar:

  1. NFC etiketinin ayrıştırılması ve MIME türünü veya veri yükünü tanımlayan bir URI'nin belirlenmesi ekleyin.
  2. MIME türünü veya URI'yı ve yükü bir intent içine alma. Bu ilk iki ilgili adımlar NFC etiketlerinin MIME türleri ve URI'leriyle nasıl eşlenir? başlıklı makalede açıklanmıştır.
  3. Amaca dayalı bir etkinlik başlatır. Bu konu NFC Etiketlerinin Uygulamalara Nasıl Dağıtılır?

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

NFC uygulamalarınızı yazmaya başlamadan önce, uygulamanız gereken farklı NFC etiketlerinin türleri, etiket gönderme sisteminin NFC etiketlerini nasıl ayrıştırdığı ve etiketin sistem bir NDEF mesajı algıladığında bunu yapar. NFC etiketleri farklı şekillerde yazabiliyor. Android, NFC Forumu tarafından tanımlanan NDEF standardını en çok destekleyen NDEF standardını destekler.

NDEF verileri, şunu içeren bir mesaj (NdefMessage) içinde kapsüllenir: veya daha fazla kayıt (NdefRecord). Her NDEF kaydı, oluşturmak istediğiniz kaydın türünü belirtin. Android Ayrıca, NDEF verilerini içermeyen diğer etiket türlerini de destekler. Bu etiketlerle çalışırken android.nfc.tech paketindeki sınıflarla ilişkilidir. Daha fazla bilgi edinmek için daha fazla bilgi için Gelişmiş NFC konusuna bakın. Bu diğer etiket türleriyle çalışmak için Bu nedenle, etiketlerle iletişim kurmak için kendi protokol yığınınızı yazmanızı öneririz. Bu nedenle, mümkün olduğunca hızlı ve kolay bir şekilde geliştirilebilir ve Android destekli cihazlarda maksimum destek sağlayabilirsiniz.

Not: Tüm NDEF özelliklerini indirmek için NFC Forum Özellikleri'ne ve Uygulama Belgeleri sitesine göz atın ve Nasıl yapıldığını gösteren örnekler için yaygın NDEF kaydı türlerini oluşturma oluşturma konusunda destek alın.

Artık NFC etiketleriyle ilgili biraz bilgi edindiğinize göre aşağıdaki bölümlerde nasıl Android, NDEF biçimindeki etiketleri işler. Android destekli bir cihaz, NDEF içeren bir NFC etiketini taradığında iletiyi ayrıştırır ve verilerin MIME türünü veya bu veri türünü tanımlamaya URI. Sistem bunu yapmak için, NDEF mesajının tamamını nasıl yorumlayacağını belirlemek üzere NdefMessage içindeki ilk NdefRecord öğesini okur (NDEF mesajı birden fazla NDEF kaydına sahip olmalıdır). İyi biçimlendirilmiş bir NDEF mesajında, ilk NdefRecord şu 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 bu alanı kullanarak Kayıt Türü Tanımı'nı (RTD) belirtebilirsiniz. Geçerli RTD değerleri Tablo 2'de açıklanmıştır.
Değişken uzunluk kimliği
Kayıt için benzersiz bir tanımlayıcı. Bu alan sık kullanılmasa da Bir etiketi benzersiz şekilde tanımlamanız gerekiyorsa etiket için bir kimlik oluşturabilirsiniz.
Değişken uzunlukta yük
Okumak veya yazmak istediğiniz gerçek veri yükü. NDEF mesaj birden fazla NDEF kaydı içerebilir. Bu nedenle, tam yükün ilk NDEF'de olduğunu varsaymayın ve NDEF mesajının kaydını tutmalısınız.

Etiket gönderme sistemi, bir MIME türünü veya URI'yı NDEF mesajı. Başarılı olursa bu bilgiler, gerçek yükle birlikte bir ACTION_NDEF_DISCOVERED amacının içinde bulunur. Ancak, etiket gönderme sisteminin, veri türünü ilk NDEF'ye göre belirleyemediği durumlardır kullanabilirsiniz. Bu durum, NDEF verileri bir MIME türü veya URI ile eşlenemediğinde ya da NFC etiketi başlangıçta NDEF verisi içermiyor. Bu gibi durumlarda, etiketin teknolojileri ve yükü hakkında bilgi içeren bir Tag nesnesi bir ACTION_TECH_DISCOVERED niyetinin içine kapsüllenir.

Tablo 1'de, etiket gönderme sisteminin TNF ve türü nasıl eşleştirdiği açıklanmaktadır. MIME türlerine veya URI'lere otomatik olarak eklenir. Ayrıca, hangi TNF'lerin MIME türü veya URI ile eşlenemeyeceği de açıklanmaktadır. Bu durumlarda, etiket gönderme sistemi ACTION_TECH_DISCOVERED

Ö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ı eşler. URI'ya gönderebilirsiniz. Etiket gönderme sistemi, ACTION_NDEF_DISCOVERED amacının veri alanındaki bu URI'yı, etiketle ilgili diğer bilgilerle birlikte içerir. önemli ölçüde ilişkilidir. 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 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ış bir biçim: <domain_name>:<service_name>. Android, bunu formdaki 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
TNF_UNKNOWN Şu değere geri döner: ACTION_TECH_DISCOVERED.
TNF_WELL_KNOWN MIME türü veya URI'si tür alanına ekleyin. Aşağıdakilerle ilgili daha fazla bilgi için Tablo 2'ye bakın: mevcut RTD'ler ve eşlemeleri.

Tablo 2. TNF_WELL_KNOWN ve eşlemeler

Kayıt Türü Tanımı (RTD) Eşleme
RTD_ALTERNATIVE_CARRIER Şu değere geri döner: ACTION_TECH_DISCOVERED.
RTD_HANDOVER_CARRIER Şu değere geri döner: ACTION_TECH_DISCOVERED.
RTD_HANDOVER_REQUEST Şu değere geri döner: ACTION_TECH_DISCOVERED.
RTD_HANDOVER_SELECT Şu değere geri döner: ACTION_TECH_DISCOVERED.
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 gönderilir?

Etiket gönderme sistemi NFC etiketini ve veya böyle bir istek ile ilgisi olmayan bir uygulamaya filtreler oluşturabilirsiniz. Amacı birden fazla uygulama işleyebilirse Etkinlik Seçici kullanıcının Etkinliği seçebilmesi için sunulur. Etiket gönderme sistemi üç amaç tanımlar: öncelikler en yüksekten en düşüğe doğru sıralanır:

  1. ACTION_NDEF_DISCOVERED: Bu amaç aşağıdakileri başlatmak için kullanılır: NDEF yükü içeren ve tanınan türde bir etiket tarandığında gerçekleşen etkinlik. Bu bir Etkinlik başlatmaya çalışır ve etiket gönderme sistemi bu diğer amaçlardan önce bir amaca hizmet eder.
  2. ACTION_TECH_DISCOVERED: ACTION_NDEF_DISCOVERED işleyicisi bu amaçla bir uygulama başlatmaya çalışır. Bu taranan etiket varsa intent de doğrudan başlatılır (önce ACTION_NDEF_DISCOVERED başlatılmadan) MIME türü veya URI'siyle eşlenemeyen NDEF verileri içeriyorsa ya da etiket NDEF içermiyorsa bilinen bir etiket teknolojisine sahiptir.
  3. ACTION_TAG_DISCOVERED: Bu amaç başlatıldı ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED öğesini hiçbir etkinlik desteklemiyorsa amaçlar.

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

  1. Etiket gönderme sistemi tarafından oluşturulan amaçla bir Etkinlik başlatmayı deneyin NFC etiketini ayrıştırırken (veya ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED).
  2. Bu amaç için filtre uygulanmış bir etkinlik yoksa sonraki bir uygulama filtreleyene kadar en düşük öncelikli intent (ACTION_TECH_DISCOVERED veya ACTION_TAG_DISCOVERED) intent'e veya etiket gönderme sistemi tüm olası amaçları deneyene kadar kullanılabilir.
  3. Amaçların hiçbiri için hiçbir uygulama filtrelenmiyorsa hiçbir şey yapmayın.
ziyaret edin.
Şekil 1. Etiket Sevk Sistemi

Mümkün olduğunda NDEF mesajları ve ACTION_NDEF_DISCOVERED niyetiyle çalışın, çünkü bu, en spesifik olan NDEF mesajlarıdır üçü de var. Bu amaç, uygulamanızı 30 dakikadan daha uygun bir zamanda kullanıcıya daha iyi bir deneyim sunmak için birlikte çalışır.

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

Bir cihazın NFC donanımına erişip NFC amacını düzgün şekilde işlemeden önce bunları beyan edin AndroidManifest.xml dosyanızdaki öğeler:

  • 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ü. Yalnızca API düzeyi 9 desteklenir ACTION_TAG_DISCOVERED aracılığıyla sınırlı etiket gönderir ve yalnızca NDEF mesajlarına EXTRA_NDEF_MESSAGES ekstra aracılığıyla erişim. Sıra No: diğer etiket özelliklerine veya G/Ç işlemlerine erişilebilir. API düzeyi 10 kapsamlı okuyucu/yazar desteği, ön plan NDEF aktarma ve API düzeyi özelliklerini içerir 14, Android Beam ve ekstraları kullanarak NDEF mesajlarını diğer cihazlara aktarmanın daha kolay bir yolunu sunar. pratik yöntemleri kullanarak NDEF kayıtlarını oluşturabilirsiniz.
    <uses-sdk android:minSdkVersion="10"/>
    
  • Uygulamanızın Google Play'de gösterilebilmesi için uses-feature öğesi yalnızca NFC donanımı olan cihazlar için:
    <uses-feature android:name="android.hardware.nfc" android:required="true" />
    

    Uygulamanızda NFC işlevi kullanılıyorsa ancak bu işlev cihazınız için çok önemli değilse, uygulamasında uses-feature öğesini çıkarıp NFC kullanılabilirliğini şurada kontrol edebilirsiniz: olup olmadığını kontrol ederek getDefaultAdapter() şu anda null.

NFC amaçları için filtrele

İşlemek istediğiniz bir NFC etiketi tarandığında uygulamanızı başlatmak için uygulamanız Android manifest'teki NFC amaçlarının biri, ikisi veya üçü için de filtre uygulayabilir. Ancak, genellikle ACTION_NDEF_DISCOVERED niyetine göre filtrelemek uygulamanızın ne zaman başlayacağı konusunda en fazla kontrolü sağlar. ACTION_TECH_DISCOVERED intent, ACTION_NDEF_DISCOVERED için hiçbir uygulama filtresi olmadığında ACTION_NDEF_DISCOVERED veya yük olmadığında NDEF ACTION_TAG_DISCOVERED için filtreleme genellikle seçin. Birçok uygulama ACTION_TAG_DISCOVERED tarihinden önce ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED için filtreleneceğinden başvurunuzun yayınlanma olasılığı düşük başlatılıyor. ACTION_TAG_DISCOVERED yalnızca son çare olarak sunuluyor kullanmak üzere başka hiçbir uygulamanın yüklenmediği durumlarda filtreleme yapmak için ACTION_NDEF_DISCOVERED veya ACTION_TECH_DISCOVERED amacı.

NFC etiketi dağıtımları değişiklik gösterdiği ve çoğu zaman sizin kontrolünüz altında olmadığı için bu durum her zaman Bu nedenle, gerektiğinde diğer iki amaca yönelebilirsiniz. türleri üzerinde kontrol sahibi olsanız da, verilerinizi biçimlendirmek için NDEF etiketleri arasında yer alır. Aşağıdaki bölümlerde, her amaç türü için nasıl filtre uygulayacağınız açıklanmaktadır.

İŞLEM_NDEF_KEŞFEDİLDİ

ACTION_NDEF_DISCOVERED intent'i filtrelemek için şunu tanımlayın: intent filtresine ve filtrelemek istediğiniz veri türüyle birlikte İlgili içeriği oluşturmak için kullanılan ACTION_NDEF_DISCOVERED için aşağıdaki örnek filtreler text/plain MIME türüne sahip amaçlar:

<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, şu biçimde bir URI için filtre uygular: https://developer.android.com/index.html

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

İŞLEM_TEKNOLOJİSİ_KEŞFETME

Etkinliğiniz ACTION_TECH_DISCOVERED amacına göre filtreliyorsa etkinliğinizin desteklediği teknolojileri belirten bir XML kaynak dosyası oluşturmanız gerekir bir tech-list kümesi içinde. Etkinliğiniz tech-list kümesi, reklamı yapılan teknolojilerin alt kümesiyse etiket tarafından desteklenir. Bunu getTechList() çağrısıyla alabilirsiniz.

Örneğin, taranan etiket Mifare Classic, NdefFormatable ve NfcA'yı destekliyorsa, tech-list kümesi, teknolojilerden üçünü, ikisini veya birini belirtmelidir (ve else) kullanabilirsiniz.

Aşağıdaki örnekte tüm teknolojiler tanımlanmaktadır. Anahtar kelimeleri kaldırmayanları NFC etiketi tarafından desteklendiğini unutmayın. Bu dosyayı (istediğinize ad verebilirsiniz) <project-root>/res/xml klasör.

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

Ayrıca birden fazla tech-list grubu belirtebilirsiniz. tech-list öğelerinin her biri bağımsız olarak değerlendirilir ve tek bir anahtar kelime varsa etkinliğinizin eşleşme olarak tech-list grubu, getTechList() tarafından döndürülen teknolojilerin bir alt kümesidir. Bu, AND ve OR sağlar semantiği hakkında daha fazla bilgi sahibi olmanızı sağlar. Aşağıdaki örnek, NfcA ve Ndef teknolojileri ya da NfcB ve Ndef teknolojilerini destekleyebilir:

<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 dosyayı belirtin. <activity> içindeki <meta-data> öğesinde öğesini kullanın:

<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 Desteklenen Etiketle Çalışma Technologies (Gelişmiş NFC) dokümanını inceleyin.

ACTION_TAG_KEŞİF

ACTION_TAG_DISCOVERED için filtrelemek üzere aşağıdaki niyeti kullanın filtrele:

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

Amaçlardan bilgi edinme

NFC amacı nedeniyle bir etkinlik başlarsa taranan NFC hakkında bilgi edinebilirsiniz etiketinden almalısınız. Amaçlar, taranan etikete bağlı olarak aşağıdaki ekstraları içerebilir:

Bu ekstraları edinmek için etkinliğinizin aşağıdakilerden biriyle başlatılıp başlatılmadığını kontrol edin: emin olmak için NFC'nin amacı, bir etiketin tarandığından emin olmak ve daha sonra isteyebilirsiniz. Aşağıdaki örnekte ACTION_NDEF_DISCOVERED kontrol edilir NDEF mesajlarını bir intent ekstradan 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 işlem 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 etiketleri veya Android Beam ile veri gönderme. Android 4.0 (API düzeyi 14) sürümünden itibaren Oluşturmanıza yardımcı olmak için createUri() yöntemi kullanılabilir URI otomatik olarak kaydedilir. Android 4.1 (API düzeyi 16) sürümünden itibaren createExternal(). ve createMime(), oluşturmanıza yardımcı olur MIME ve harici NDEF kayıtları. Hatalardan kaçınmak için mümkün olduğunda bu yardımcı yöntemleri kullanın NDEF kayıtlarını manuel olarak oluştururken.

Bu bölümde ayrıca ilgili intent filtresini kullanın. Bu NDEF kaydı örneklerinin tümü, ilk NDEF'de olmalıdır (etikete yazdığınız veya ışınladığınız NDEF mesajının kaydı).

TNF_ABSOLUTE_URI

Not: Bunun yerine RTD_URI yazın TNF_ABSOLUTE_URI arasında paylaştırır.

Aşağıdaki şekilde bir 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ı için 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

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

createMime() yöntemini kullanarak:

Kotlin

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

Java

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

NdefRecord manuel olarak oluşturuluyor:

Kotlin

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

Java

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

Önceki NDEF kaydı için 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ı için 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

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 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ı için 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 uygulamalarda TNF_EXTERNAL_TYPE NDEF kaydı oluşturabilirsiniz: yöntemler:

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ı için 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>

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

Not: TNF_EXTERNAL_TYPE için URN'ler standart biçimdedir: urn:nfc:ext:example.com:externalType (ancak NFC Forum RTD spesifikasyonu) URN'nin urn:nfc:ext: bölümünün NDEF kaydı. Bu nedenle, yalnızca alan adını (örnekte example.com) sağlamanız yeterlidir ve tür (örnekte externalType) ile ayrılmalıdır. TNF_EXTERNAL_TYPE URN'yi gönderirken, Android urn:nfc:ext:example.com:externalType URN'yi vnd.android.nfc://ext/example.com:externalType URI'ye dönüştürür. Bu URI intent filtresine sahip olması gerekir.

Android uygulaması kayıtları

Android 4.0 (API düzeyi 14) sürümünde sunulan Android Uygulama Kaydı (AAR), NFC etiketi tarandığında uygulamanızın başlatılma olasılığını belirler. AAR, NDEF kaydı içine yerleştirilmiş bir uygulamanın yüklü olması gerekir. NDEF'inizin herhangi bir NDEF kaydına AAR ekleyebilirsiniz mesajı gösterilir. Çünkü Android, NDEF mesajının tamamında AAR'ları arar. AAR bulunursa AAR'deki paket adına göre uygulamaya çalışın. Uygulama, uygulamayı indirmek için Google Play başlatılır.

AAR'ler, diğer uygulamaların aynı amaca yönelik filtreleme yapmasını önlemek ve potansiyel olarak dağıttığınız belirli etiketleri işleme alabilir. AAR'ler yalnızca paket adı kısıtlaması nedeniyle uygulama düzeyinde değil, amaç filtrelemeyi kullanın. Bir niyeti Etkinlik düzeyinde işlemek istiyorsanız amaç filtrelerini kullanın.

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

  1. Normalde bir intent filtresi kullanarak Etkinlik başlatmayı deneyin. Eşleşen Etkinlik etkinliği başlatın.
  2. Amaca göre filtrelenen Etkinlik AAR'yi kullanıyorsanız, amacı birden fazla Etkinlik gerçekleştirebiliyorsa veya amacı gerçekleştirecek bir Etkinlik yoksa AAR tarafından belirtilen uygulama.
  3. Hiçbir uygulama AAR ile başlayamazsa Google Play'e giderek gerekli yetkiye sahipsiniz demektir.

Not: AAR'leri ve intent dağıtım sistemini ön plan dağıtım sistemi; bu sistem, bir NFC etiketi etkin olduğunda ön plan etkinliğinin öncelikli olmasını sağlar keşfedilebilir. Bu yöntemle, AAR'leri geçersiz kılmak için etkinlik ön planda olmalıdır. intent dağıtım sisteminden çok daha fazlasıdır.

AAR içermeyen taranmış etiketleri yine de filtrelemek istiyorsanız intent filtrelerine uygulanır. Bu, uygulamanız başka etiketlerle ilgileniyorsa yararlıdır AAR içermez. Örneğin, uygulamanızın, Yeşil Ofis’in web sitesine girip üçüncü taraflarca dağıtılan genel etiketlerin yanı sıra dağıttığınız özel etiketler. Unutmamanız gereken noktalar Bu nedenle, etiketleri dağıtırken büyük olasılıkla . İçinde Ayrıca, NFC etiketlerini dağıtırken daha iyi performans göstermesi için NFC etiketlerinizi nasıl çoğu cihaz (Android destekli ve diğer cihazlar) için desteklenir. Bu işlemi gerçekleştirebilirsiniz: uygulamaların ayırt etmesini kolaylaştırmak için nispeten benzersiz bir MIME türü veya URI tanımlamaktır.

Android, AAR oluşturmak için basit bir API sunar. createApplicationRecord() Yapmanız gerekenler AAR'yi NdefMessage içinde herhangi bir yere yerleştirmektir. Şunu yapmak istemiyorsunuz: AAR'yi kullanmamanız durumunda, NdefMessage cihazınızın ilk kaydını kullanmak için NdefMessage içine kaydedin. Bunun nedeni, Android'in sistem, MIME türünü veya çözümü belirlemek için NdefMessage etiketinin ilk kaydını kontrol eder Uygulamaların filtreleme amacı oluşturmak için kullanılan etiket URI'si. Aşağıdaki kod AAR'nin nasıl oluşturulacağını gösterir:

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 basit bir eşler arası veri alışverişine olanak tanır. İlgili içeriği oluşturmak için kullanılan Başka bir cihaza veri ışınlamak isteyen uygulama ön planda olmalı ve cihazın verileri almak kilitlenmiş olmamalıdır. Işın eden cihaz, alıcı ile yeterince temas ettiğinde alıcı cihazda, ışın veren cihazda "Dokunmak için Işınlama" Kullanıcı arayüzü. Kullanıcı daha sonra mesajın alıcı cihaza ışınlanıp iletilmeyeceğini belirler.

Not: Ön plan NDEF aktarma işlemi API düzeyi 10, Android Beam'e benzer işlevler sunar. Bu API'ler kullanımdan kaldırıldı ancak eski cihazları desteklemek için mevcuttur. 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(): Şunları kabul eder: Göndermek için mesaj olarak ayarlanacak NdefMessage. Mesajı otomatik olarak ışınlar iki cihaz birbirine yeterince yakın mesafede olduğunda.
  • setNdefPushMessageCallback(): Şunu içeren bir geri çağırmayı kabul eder: createNdefMessage() Buna, bir cihaz veri ışınlamak için kapsama alanında olduğunda çağrılır. Geri çağırma işlevi, NDEF mesajını yalnızca gerektiğinde.

Bir etkinlik aynı anda yalnızca bir NDEF mesajı aktarabilir. Bu nedenle setNdefPushMessageCallback() öncelikli olur değeri setNdefPushMessage() değerinin üzerindedir. Kullanılacak aşağıdaki genel yönergelere uyulmalıdır:

  • Verileri yayan etkinlik ön planda olmalıdır. Her iki cihazda da kullanmaya devam edebilir.
  • Işınladığınız verileri bir NdefMessage içine almalısınız nesnesini tanımlayın.
  • Işınlanmış verileri alan NFC cihazı com.android.npp NDEF push protokolü veya NFC Forum'un SNEP'si (Basit NDEF Exchange) Protokol). com.android.npp protokolü, API düzeyi 9'daki (Android) cihazlar için gereklidir 2.3)'ten API düzeyi 13'e (Android 3.2) çevirin. Hem com.android.npp hem de SNEP şurada gereklidir: API düzeyi 14 (Android 4.0) ve sonraki sürümler.

Not: Etkinliğiniz Android Beam'i etkinleştirmişse arka planda standart intent dağıtım sistemi devre dışı bırakılır. Ancak etkinliğiniz aynı zamanda özelliğini etkinleştirir ön planda gönderim özelliğini kullanarak, ön plan sevkiyatı.

Android Beam'i etkinleştirmek için:

  1. NdefRecord öğelerini içeren bir NdefMessage oluşturun etmek istediğiniz bir ekran resmi oluşturmanız gerekir.
  2. NdefMessage ile setNdefPushMessage() çağrısı yapın veya onCreate() yönteminde NfcAdapter.CreateNdefMessageCallback nesnesinde setNdefPushMessageCallback çağrısı yapın yararlı olabilir. Bu yöntemler, Android ile etkinleştirmek istediğiniz en az bir etkinlik gerektirir Etkinleştirilecek diğer etkinliklerin isteğe bağlı listesiyle birlikte Işınlama.

    Genel olarak, Etkinliğinizin yalnızca şunları yapması gerektiğinde setNdefPushMessage() kullanılır: iki cihaz iletişim kurmak için kapsama alanında olduğunda her zaman aynı NDEF mesajını gönderir. Kullandığınız setNdefPushMessageCallback uygulamanın mevcut bağlamına önem veriyor ve bir NDEF mesajı ve kullanıcının uygulamanızda ne yaptığına bağlı olarak.

Aşağıdaki örnek, basit bir etkinliğin onCreate() yönteminde NfcAdapter.CreateNdefMessageCallback işlevini nasıl çağırdığını gösterir. etkinliği (bkz. AndroidBeamDemo) 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, kaldırabileceğiniz bir AAR'yi yorumladığını unutmayın. AAR'yi etkinleştirirseniz AAR'de belirtilen uygulama her zaman Android Beam mesajını alır. Uygulama Google Play uygulamayı indirmeye başlar. Bu nedenle, aşağıdaki niyet filtresi, AAR kullanılıyorsa Android 4.0 veya sonraki sürümleri çalıştıran cihazlar için 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 başlatılabilir bir NFC etiketini taradığında veya AAR'ye sahip bir Android com.example.android.beam yazın veya NDEF biçimli bir ileti MIME kaydı içerdiğinde application/vnd.com.example.android.beam türünde.

AAR'ler bir uygulamanın başlatıldığını veya indirildiğini garanti etse de intent filtreleri Çünkü Google Analytics 4'te seçtiğiniz bir Etkinliği her zaman ana Etkinliği başlatmak yerine, bir AAR tarafından belirtilen paketteki ana Etkinliği başlatır. AAR'larda etkinlik düzeyi ayrıntı düzeyi yoktur. Ayrıca, bazı Android destekli cihazlar için kimlik bilgilerini NDEF'nizin ilk NDEF kaydına yerleştirmeniz gerekir. bunları da filtreleyebilirsiniz. Ortak Oluşturma Aracı NDEF kaydı türleri başlıklı makaleyi inceleyin.