बेहतर एनएफ़सी की खास जानकारी

इस दस्तावेज़ में ऐडवांस एनएफ़सी से जुड़े विषयों के बारे में बताया गया है. जैसे, अलग-अलग टैग टेक्नोलॉजी के साथ काम करना, एनएफ़सी टैग पर लिखने और फ़ोरग्राउंड डिस्पैच करने की सुविधा मिलती है. इसकी मदद से, फ़ोरग्राउंड में ऐप्लिकेशन को इंटेंट को हैंडल करें, भले ही दूसरे ऐप्लिकेशन उसी तरह के इंटेंट को फ़िल्टर करते हों.

काम करने वाली टैग टेक्नोलॉजी का इस्तेमाल करना

एनएफ़सी टैग और Android के साथ काम करने वाले डिवाइसों के साथ काम करते समय, कॉन्टेंट पढ़ने के लिए इस्तेमाल किया जाने वाला मुख्य फ़ॉर्मैट और टैग पर डेटा NDEF है. जब कोई डिवाइस, एनडीईएफ़ डेटा वाले टैग को स्कैन करता है, तो Android उस टैग को मैसेज को पार्स करने और उसे NdefMessage में डिलीवर करने में किया जा सकता है. हालांकि, कुछ मामलों में ऐसी स्थिति भी होती है, जब आप किसी ऐसे टैग को स्कैन करते हैं जिसमें NDEF डेटा या जब NDEF डेटा को MIME टाइप या यूआरआई के साथ मैप नहीं किया जा सका. इन मामलों में, आपको सीधे टैग के साथ कम्यूनिकेशन खोलना होगा. इसके बाद, आपका अपना प्रोटोकॉल (रॉ बाइट में) डालें. Android, ऐप्लिकेशन के इन मामलों में सामान्य सहायता उपलब्ध कराता है. android.nfc.tech पैकेज, जिसके बारे में टेबल 1 में बताया गया है. आप getTechList() तरीके का इस्तेमाल करके, यह पता लगाया जा सकता है कि टेक्नोलॉजी किस तरह की है टैग का इस्तेमाल करें और उससे संबंधित TagTechnology बनाएं android.nfc.tech के दिए गए क्लास में से किसी एक वाला ऑब्जेक्ट

टेबल 1. इस्तेमाल की जा सकने वाली टैग टेक्नोलॉजी

कक्षा ब्यौरा
TagTechnology ऐसा इंटरफ़ेस जिसे सभी टैग टेक्नोलॉजी क्लास को लागू करना होगा.
NfcA एनएफ़सी-ए (ISO 14443-3A) प्रॉपर्टी और I/O कार्रवाइयों का ऐक्सेस देता है.
NfcB एनएफ़सी-बी (ISO 14443-3B) प्रॉपर्टी और I/O कार्रवाइयों का ऐक्सेस देता है.
NfcF एनएफ़सी-एफ़ (JIS 6319-4) प्रॉपर्टी और I/O कार्रवाइयों का ऐक्सेस देता है.
NfcV एनएफ़सी-वी (ISO 15693) प्रॉपर्टी और I/O कार्रवाइयों का ऐक्सेस देता है.
IsoDep ISO-DEP (ISO 14443-4) प्रॉपर्टी और I/O कार्रवाइयों का ऐक्सेस देता है.
Ndef इस नीति से, एनएफ़सी टैग पर एनडीईएफ़ डेटा और ऑपरेशन को ऐक्सेस करने की सुविधा मिलती है. एनडीईएफ़.
NdefFormatable उन टैग के लिए फ़ॉर्मैट ऑपरेशन देता है जो NDEF फ़ॉर्मैट करने लायक हो सकते हैं.

Android डिवाइस पर काम करने वाले डिवाइसों के लिए, नीचे दी गई टैग टेक्नोलॉजी का इस्तेमाल करना ज़रूरी नहीं है.

दूसरी टेबल. इस्तेमाल की जा सकने वाली वैकल्पिक टैग टेक्नोलॉजी

कक्षा ब्यौरा
MifareClassic यह Android डिवाइस होने पर, MIFARE क्लासिक प्रॉपर्टी और I/O ऑपरेशन का ऐक्सेस देता है MIFARE का समर्थन करता है.
MifareUltralight अगर यह Android डिवाइस है, तो यह MIFARE Ultralight प्रॉपर्टी और I/O ऑपरेशन का ऐक्सेस देता है डिवाइस MIFARE का समर्थन करता है.

टैग टेक्नोलॉजी और ACTION_TECH_DISCOVERED इंटेंट के साथ काम करें

जब कोई डिवाइस किसी ऐसे टैग को स्कैन करता है जिसमें NDEF का डेटा मौजूद होता है, लेकिन उसे MIME या यूआरआई के साथ मैप नहीं किया जा सकता, तो टैग डिस्पैच सिस्टम, ACTION_TECH_DISCOVERED के साथ कोई गतिविधि शुरू करने की कोशिश करता है इंटेंट. ACTION_TECH_DISCOVERED का इस्तेमाल तब भी किया जाता है, जब कोई टैग बिना NDEF वाले डेटा को स्कैन किया जाता है. यह फ़ॉलबैक आपको टैग पर मौजूद डेटा के साथ काम करने की सुविधा देता है का इस्तेमाल करें, अगर टैग डिस्पैच सिस्टम उसे आपके लिए पार्स नहीं कर पाता. इस पर काम करने के बुनियादी तरीके टैग की टेक्नोलॉजी के बारे में यहां बताया गया है:

  1. उस ACTION_TECH_DISCOVERED इंटेंट के लिए फ़िल्टर करें जिसमें जिन्हें मैनेज करना है. एनएफ़सी के लिए फ़िल्टर करना देखें इंटेंट देखें. आम तौर पर, टैग डिस्पैच सिस्टम, एनडीईएफ़ मैसेज पर ACTION_TECH_DISCOVERED इंटेंट शुरू करने की कोशिश करता है MIME टाइप या यूआरआई के साथ मैप नहीं किया जा सकता या अगर स्कैन किए गए टैग में NDEF का डेटा नहीं है. इसके लिए इसे कैसे तय किया जाता है, इस बारे में ज़्यादा जानकारी के लिए, टैग डिस्पैच सिस्टम लेख पढ़ें.
  2. जब आपके ऐप्लिकेशन को इंटेंट मिलता है, तो यहां से Tag ऑब्जेक्ट पाएं इंटेंट:
    KotlinJava
    var tagFromIntent: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)
    Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
  3. किसी एक को कॉल करके, TagTechnology का इंस्टेंस पाएं android.nfc.tech पैकेज में क्लास की get फ़ैक्ट्री तरीके. आप get फ़ैक्ट्री तरीके को कॉल करने से पहले, getTechList() को कॉल करके टैग के लिए काम करने वाली टेक्नोलॉजी की गिनती करें. उदाहरण के लिए, Tag में से MifareUltralight में से, ये काम करें:
    KotlinJava
    MifareUltralight.get(intent.getParcelableExtra(NfcAdapter.EXTRA_TAG))
    MifareUltralight.get(intent.getParcelableExtra(NfcAdapter.EXTRA_TAG));

टैग के लिए पढ़ें और लिखें

एनएफ़सी टैग को पढ़ने और लिखने की प्रक्रिया में, इंटेंट से टैग पाना और टैग के साथ बातचीत शुरू करना. डेटा पढ़ने और उसमें बदलाव करने के लिए, आपको अपना प्रोटोकॉल स्टैक तय करना होगा से टैग कैसे करें. हालांकि, ध्यान रखें कि काम करते समय भी NDEF डेटा को पढ़ा और लिखा जा सकता है टैग का इस्तेमाल किया जा सकता है. यह आप पर निर्भर करता है कि चीज़ों को कैसे तैयार करना है. कॉन्टेंट बनाने नीचे दिए गए उदाहरण में, MIFARE Ultralight टैग के साथ काम करने का तरीका बताया गया है.

KotlinJava
package com.example.android.nfc
import android.nfc.Tag
import android.nfc.tech.MifareUltralight
import java.io.IOException
import java.nio.charset.Charset

class MifareUltralightTagTester {

   
fun writeTag(tag: Tag, tagText: String) {
       
MifareUltralight.get(tag)?.use { ultralight ->
            ultralight
.connect()
           
Charset.forName("US-ASCII").also { usAscii ->
                ultralight
.writePage(4, "abcd".toByteArray(usAscii))
                ultralight
.writePage(5, "efgh".toByteArray(usAscii))
                ultralight
.writePage(6, "ijkl".toByteArray(usAscii))
                ultralight
.writePage(7, "mnop".toByteArray(usAscii))
           
}
       
}
   
}

   
fun readTag(tag: Tag): String? {
       
return MifareUltralight.get(tag)?.use { mifare ->
            mifare
.connect()
           
val payload = mifare.readPages(4)
           
String(payload, Charset.forName("US-ASCII"))
       
}
   
}
}
package com.example.android.nfc;

import android.nfc.Tag;
import android.nfc.tech.MifareUltralight;
import android.util.Log;
import java.io.IOException;
import java.nio.charset.Charset;

public class MifareUltralightTagTester {

   
private static final String TAG = MifareUltralightTagTester.class.getSimpleName();

   
public void writeTag(Tag tag, String tagText) {
       
MifareUltralight ultralight = MifareUltralight.get(tag);
       
try {
            ultralight
.connect();
            ultralight
.writePage(4, "abcd".getBytes(Charset.forName("US-ASCII")));
            ultralight
.writePage(5, "efgh".getBytes(Charset.forName("US-ASCII")));
            ultralight
.writePage(6, "ijkl".getBytes(Charset.forName("US-ASCII")));
            ultralight
.writePage(7, "mnop".getBytes(Charset.forName("US-ASCII")));
       
} catch (IOException e) {
           
Log.e(TAG, "IOException while writing MifareUltralight...", e);
       
} finally {
           
try {
                ultralight
.close();
           
} catch (IOException e) {
               
Log.e(TAG, "IOException while closing MifareUltralight...", e);
           
}
       
}
   
}

   
public String readTag(Tag tag) {
       
MifareUltralight mifare = MifareUltralight.get(tag);
       
try {
            mifare
.connect();
           
byte[] payload = mifare.readPages(4);
           
return new String(payload, Charset.forName("US-ASCII"));
       
} catch (IOException e) {
           
Log.e(TAG, "IOException while reading MifareUltralight message...", e);
       
} finally {
           
if (mifare != null) {
               
try {
                   mifare
.close();
               
}
               
catch (IOException e) {
                   
Log.e(TAG, "Error closing tag...", e);
               
}
           
}
       
}
       
return null;
   
}
}

फ़ोरग्राउंड डिस्पैच सिस्टम का इस्तेमाल करें

फ़ोरग्राउंड डिस्पैच सिस्टम की मदद से, किसी गतिविधि को किसी इंटेंट और दावे को रोकने में मदद मिलती है प्राथमिकता को उन अन्य गतिविधियों पर प्राथमिकता दें जो एक ही इंटेंट को हैंडल करते हैं. इस सिस्टम का इस्तेमाल करने में ये चीज़ें शामिल हैं हम Android सिस्टम के लिए कुछ डेटा स्ट्रक्चर बनाते हैं, ताकि उन सभी को भेजा जा सके इंटेंट भी करें. फ़ोरग्राउंड डिस्पैच सिस्टम को चालू करने के लिए:

  1. अपनी गतिविधि के onCreate() तरीके में यह कोड जोड़ें:
    1. ऐसा PendingIntent ऑब्जेक्ट बनाएं जिसे बदला जा सके, ताकि Android सिस्टम उसे भर सके टैग को स्कैन करते समय, उसकी जानकारी भी शामिल करें.
      KotlinJava
      val intent = Intent(this, javaClass).apply {
          addFlags
      (Intent.FLAG_ACTIVITY_SINGLE_TOP)
      }
      var pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, intent,
             
      PendingIntent.FLAG_MUTABLE)
      PendingIntent pendingIntent = PendingIntent.getActivity(
         
      this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
         
      PendingIntent.FLAG_MUTABLE);
    2. आपको जिन इंटेंट को रोकना है उन्हें मैनेज करने के लिए, इंटेंट फ़िल्टर का एलान करें. फ़ोरग्राउंड डिस्पैच सिस्टम, सेट किए गए इंटेंट फ़िल्टर की जांच तब करता है, जब डिवाइस किसी टैग को स्कैन करता है. अगर यह मेल खाता है, तो आपका ऐप्लिकेशन इंटेंट को हैंडल करता है. अगर ऐसा होता है, तो मेल नहीं खाने पर, फ़ोरग्राउंड डिस्पैच सिस्टम फिर से इंटेंट डिस्पैच सिस्टम पर चला जाता है. इंटेंट फ़िल्टर और टेक्नोलॉजी फ़िल्टर के null कलेक्शन तय करने से, यह तय होता है जिसे आप TAG_DISCOVERED पर वापस आने वाले सभी टैग के लिए फ़िल्टर करना चाहते हैं इंटेंट. नीचे दिया गया कोड स्निपेट, NDEF_DISCOVERED के लिए सभी MIME टाइप को मैनेज करता है. आपने लोगों तक पहुंचाया मुफ़्त में को सिर्फ़ वही टूल हैंडल करना चाहिए जिनकी आपको ज़रूरत है.
      KotlinJava
      val ndef = IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED).apply {
         
      try {
              addDataType
      ("*/*")    /* Handles all MIME based dispatches.
                                       You should specify only the ones that you need. */

         
      } catch (e: IntentFilter.MalformedMimeTypeException) {
             
      throw RuntimeException("fail", e)
         
      }
      }

      intentFiltersArray
      = arrayOf(ndef)
      IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
         
      try {
              ndef
      .addDataType("*/*");    /* Handles all MIME based dispatches.
                                             You should specify only the ones that you need. */

         
      }
         
      catch (MalformedMimeTypeException e) {
             
      throw new RuntimeException("fail", e);
         
      }
         intentFiltersArray
      = new IntentFilter[] {ndef, };
    3. टैग टेक्नोलॉजी का कलेक्शन सेट अप करें, जिसे आपका ऐप्लिकेशन मैनेज करना चाहता है. कॉल करें टेक्नोलॉजी की क्लास का पता लगाने का Object.class.getName() तरीका है मदद करना चाहते हैं.
      KotlinJava
      techListsArray = arrayOf(arrayOf<String>(NfcF::class.java.name))
      techListsArray = new String[][] { new String[] { NfcF.class.getName() } };
  2. इन ऐक्टिविटी लाइफ़साइकल कॉलबैक को बदलें. साथ ही, इसे चालू और बंद करने के लिए लॉजिक जोड़ें गतिविधि बंद होने पर, फ़ोरग्राउंड डिस्पैच (onPause()) और फिर से (onResume()) फ़ोकस वापस आ जाता है. enableForegroundDispatch() से कॉल करना ज़रूरी है मुख्य थ्रेड में और सिर्फ़ तब, जब गतिविधि फ़ोरग्राउंड में हो (onResume() में कॉल करना इसकी गारंटी देता है). स्कैन किए गए एनएफ़सी का डेटा प्रोसेस करने के लिए, आपको onNewIntent कॉलबैक लागू करना होगा टैग के साथ जोड़ा जा सकता है.
  3. KotlinJava
    public override fun onPause() {
       
    super.onPause()
        adapter
    .disableForegroundDispatch(this)
    }

    public override fun onResume() {
       
    super.onResume()
        adapter
    .enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray)
    }

    public override fun onNewIntent(intent: Intent) {
       
    val tagFromIntent: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)
       
    // do something with tagFromIntent
    }
    public void onPause() {
       
    super.onPause();
        adapter
    .disableForegroundDispatch(this);
    }

    public void onResume() {
       
    super.onResume();
        adapter
    .enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);
    }

    public void onNewIntent(Intent intent) {
       
    Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
       
    // do something with tagFromIntent
    }