एनएफ़सी की बुनियादी बातें

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

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

टैग डिस्पैच सिस्टम

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

इस लक्ष्य को पूरा करने में आपकी मदद करने के लिए, Android एक खास टैग डिस्पैच सिस्टम उपलब्ध कराता है. यह स्कैन किए गए एनएफ़सी टैग का विश्लेषण करता है, उन्हें पार्स करता है, और स्कैन किए गए डेटा में दिलचस्पी रखने वाले ऐप्लिकेशन ढूंढने की कोशिश करता है. यह ऐसा इन तरीकों से करता है:

  1. एनएफ़सी टैग को पार्स करना और MIME टाइप या यूआरआई को समझना, जो टैग में डेटा के पेलोड की पहचान करता है.
  2. MIME टाइप या यूआरआई और पेलोड को इंटेंट में शामिल करना. पहले दो चरणों के बारे में एनएफ़सी टैग को MIME टाइप और यूआरआई के साथ मैप करने का तरीका बताया गया है.
  3. इंटेंट के आधार पर कोई गतिविधि शुरू करता है. इसके बारे में एनएफ़सी टैग को ऐप्लिकेशन में कैसे भेजा जाता है में बताया गया है.

एनएफ़सी टैग को MIME टाइप और यूआरआई से कैसे मैप किया जाता है

एनएफ़सी ऐप्लिकेशन लिखने से पहले, यह समझना ज़रूरी है कि एनएफ़सी टैग के अलग-अलग टाइप क्या हैं, टैग डिस्पैच सिस्टम एनएफ़सी टैग को कैसे पार्स करता है, और एनडीएफ़ई मैसेज का पता चलने पर टैग डिस्पैच सिस्टम क्या खास काम करता है. एनएफ़सी टैग में कई तरह की टेक्नोलॉजी आती हैं. साथ ही, एनएफ़सी टैग पर अलग-अलग तरीकों से डेटा लिखा जा सकता है. Android में NDEF स्टैंडर्ड के लिए सबसे ज़्यादा सहायता मिलती है. इसे एनएफ़सी फ़ोरम तय करता है.

NDEF डेटा को एक मैसेज (NdefMessage) में पैकेज किया जाता है. इसमें एक या उससे ज़्यादा रिकॉर्ड (NdefRecord) होते हैं. आपको जिस तरह का रिकॉर्ड बनाना है उसके हिसाब से, हर NDEF रिकॉर्ड सही तरीके से बना होना चाहिए. Android, ऐसे अन्य टैग के साथ भी काम करता है जिनमें NDEF डेटा नहीं होता. इन टैग के साथ काम करने के लिए, android.nfc.tech पैकेज में मौजूद क्लास का इस्तेमाल किया जा सकता है. इन टेक्नोलॉजी के बारे में ज़्यादा जानने के लिए, बेहतर एनएफ़सी विषय देखें. अन्य तरह के टैग के साथ काम करने के लिए अपने खुद के प्रोटोकॉल स्टैक को लिखना ज़रूरी होता है, ताकि टैग के साथ कम्यूनिकेट किया जा सके. इसलिए, हमारा सुझाव है कि जब भी Android पर काम करने वाले डिवाइसों को डेवलप करना आसान हो और ज़्यादा से ज़्यादा सहायता मिल सके, तब NDEF का इस्तेमाल करें.

ध्यान दें: NDEF के सभी स्पेसिफ़िकेशन डाउनलोड करने के लिए, एनएफ़सी फ़ोरम के स्पेसिफ़िकेशन और ऐप्लिकेशन दस्तावेज़ साइट पर जाएं. साथ ही, NDEF रिकॉर्ड बनाने के उदाहरणों के लिए, सामान्य टाइप के NDEF रिकॉर्ड बनाना देखें.

अब आपके पास एनएफ़सी टैग के बारे में कुछ जानकारी है. इसलिए, यहां दिए गए सेक्शन में इस बारे में ज़्यादा जानकारी दी गई है कि Android, एनडीएफ़ई फ़ॉर्मैट वाले टैग को कैसे मैनेज करता है. जब Android डिवाइस, NDEF फ़ॉर्मैट में डेटा वाले किसी एनएफ़सी टैग को स्कैन करता है, तो वह मैसेज को पार्स करता है और डेटा का MIME टाइप या यूआरआई की पहचान करने की कोशिश करता है. इसके लिए, सिस्टम NdefMessage में मौजूद पहला NdefRecord पढ़ता है, ताकि यह पता लगाया जा सके कि पूरे एनडीएफ़ मैसेज को कैसे समझा जाए. एनडीएफ़ मैसेज में एक से ज़्यादा एनडीएफ़ रिकॉर्ड हो सकते हैं. सही तरीके से बनाए गए NDEF मैसेज में, पहले NdefRecord में ये फ़ील्ड होते हैं:

तीन बिट का TNF (टाइप नेम फ़ॉर्मैट)
यह बताता है कि वैरिएबल लंबाई वाले टाइप फ़ील्ड को कैसे समझा जाए. मान्य वैल्यू के बारे में टेबल 1 में बताया गया है.
अलग-अलग अवधि का टाइप
यह बताता है कि रिकॉर्ड किस तरह का है. अगर TNF_WELL_KNOWN का इस्तेमाल किया जा रहा है, तो रिकॉर्ड टाइप की परिभाषा (RTD) बताने के लिए, इस फ़ील्ड का इस्तेमाल करें. आरटीडी की मान्य वैल्यू के बारे में टेबल 2 में बताया गया है.
वैरिएबल की लंबाई का आईडी
रिकॉर्ड के लिए यूनीक आइडेंटिफ़ायर. इस फ़ील्ड का अक्सर इस्तेमाल नहीं किया जाता. हालांकि, अगर आपको किसी टैग की खास तौर पर पहचान करनी है, तो उसके लिए आईडी बनाया जा सकता है.
वैरिएबल लंबाई वाला पेलोड
असल डेटा पेलोड, जिसे आपको पढ़ना या सेव करना है. किसी एनडीएफ़ मैसेज में एक से ज़्यादा एनडीएफ़ रिकॉर्ड हो सकते हैं. इसलिए, यह न मानें कि पूरा पेलोड, एनडीएफ़ मैसेज के पहले एनडीएफ़ रिकॉर्ड में है.

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

टेबल 1 में बताया गया है कि टैग डिस्पैच सिस्टम, TNF और टाइप फ़ील्ड को MIME टाइप या यूआरआई से कैसे मैप करता है. इसमें यह भी बताया गया है कि किन TNF को MIME टाइप या यूआरआई से मैप नहीं किया जा सकता. ऐसे मामलों में, टैग डिस्पैच सिस्टम ACTION_TECH_DISCOVERED पर वापस आ जाता है.

उदाहरण के लिए, अगर टैग डिस्पैच सिस्टम को TNF_ABSOLUTE_URI टाइप का कोई रिकॉर्ड मिलता है, तो वह उस रिकॉर्ड के वैरिएबल लेंथ टाइप फ़ील्ड को यूआरआई में मैप करता है. टैग डिस्पैच सिस्टम, उस यूआरआई को ACTION_NDEF_DISCOVERED इंटेंट के डेटा फ़ील्ड में शामिल करता है. साथ ही, टैग के बारे में अन्य जानकारी भी शामिल करता है, जैसे कि पेलोड. वहीं दूसरी ओर, अगर उसे TNF_UNKNOWN टाइप का रिकॉर्ड मिलता है, तो यह एक ऐसा इंटेंट बनाता है जो टैग की टेक्नोलॉजी को जानकारी देता है.

टेबल 1. इस्तेमाल किए जा सकने वाले TNF और उनकी मैपिंग

टाइप का नाम फ़ॉर्मैट (TNF) मैपिंग
TNF_ABSOLUTE_URI टाइप फ़ील्ड के आधार पर यूआरआई.
TNF_EMPTY यह ACTION_TECH_DISCOVERED पर वापस आ जाता है.
TNF_EXTERNAL_TYPE टाइप फ़ील्ड में मौजूद यूआरएन के आधार पर यूआरआई. URN को NDEF टाइप फ़ील्ड में, छोटे फ़ॉर्मैट में एन्कोड किया जाता है: <domain_name>:<service_name>. Android इसे इस फ़ॉर्मैट में यूआरआई से मैप करता है: vnd.android.nfc://ext/<domain_name>:<service_name>.
TNF_MIME_MEDIA टाइप फ़ील्ड के आधार पर MIME टाइप.
TNF_UNCHANGED पहले रिकॉर्ड में अमान्य है, इसलिए यह वैल्यू फिर से ACTION_TECH_DISCOVERED पर सेट हो जाती है.
TNF_UNKNOWN यह ACTION_TECH_DISCOVERED पर वापस आ जाता है.
TNF_WELL_KNOWN MIME टाइप या यूआरआई, रिकॉर्ड टाइप डेफ़िनिशन (आरटीडी) के आधार पर तय होता है. इसे टाइप फ़ील्ड में सेट किया जाता है. उपलब्ध आरटीडी और उनकी मैपिंग के बारे में ज़्यादा जानकारी के लिए, टेबल 2 देखें.

टेबल 2. TNF_WELL_KNOWN और उनकी मैपिंग के लिए काम करने वाले आरटीडी

रिकॉर्ड टाइप डेफ़िनिशन (आरटीडी) मैपिंग
RTD_ALTERNATIVE_CARRIER ACTION_TECH_DISCOVERED पर वापस चला जाता है.
RTD_HANDOVER_CARRIER यह ACTION_TECH_DISCOVERED पर वापस आ जाता है.
RTD_HANDOVER_REQUEST ACTION_TECH_DISCOVERED पर वापस चला जाता है.
RTD_HANDOVER_SELECT यह ACTION_TECH_DISCOVERED पर वापस आ जाता है.
RTD_SMART_POSTER पेलोड को पार्स करने के आधार पर यूआरआई.
RTD_TEXT text/plain का MIME टाइप.
RTD_URI पेलोड के आधार पर यूआरआई.

एनएफ़सी टैग को ऐप्लिकेशन पर डिस्पैच करने का तरीका

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

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

टैग डिस्पैच सिस्टम के काम करने का बुनियादी तरीका यहां बताया गया है:

  1. एनएफ़सी टैग (ACTION_NDEF_DISCOVERED या ACTION_TECH_DISCOVERED) को पार्स करते समय, टैग डिस्पैच सिस्टम ने जो इंटेंट बनाया था उससे कोई गतिविधि शुरू करने की कोशिश करें.
  2. अगर उस इंटेंट के लिए कोई भी गतिविधि फ़िल्टर नहीं होती है, तो सबसे कम प्राथमिकता वाले इंटेंट (ACTION_TECH_DISCOVERED या ACTION_TAG_DISCOVERED) वाली ऐक्टिविटी को शुरू करने की कोशिश करें. ऐसा तब तक करें, जब तक इंटेंट के लिए ऐप्लिकेशन फ़िल्टर न हो जाए या जब तक टैग डिस्पैच सिस्टम सभी संभावित इंटेंट को आज़मा न ले.
  3. अगर कोई भी ऐप्लिकेशन किसी भी इंटेंट के लिए फ़िल्टर नहीं करता है, तो कुछ न करें.
पहली इमेज. टैग डिस्पैच सिस्टम

जब भी हो सके, NDEF मैसेज और ACTION_NDEF_DISCOVERED इंटेंट का इस्तेमाल करें, क्योंकि यह इन तीनों में से सबसे सटीक है. इस इंटेंट की मदद से, अपने ऐप्लिकेशन को अन्य दो इंटेंट के मुकाबले ज़्यादा सही समय पर शुरू किया जा सकता है. इससे, उपयोगकर्ता को बेहतर अनुभव मिलता है.

Android मेनिफ़ेस्ट में एनएफ़सी का ऐक्सेस मांगें

किसी डिवाइस के एनएफ़सी हार्डवेयर को ऐक्सेस करने और एनएफ़सी के इंटेंट को सही तरीके से मैनेज करने से पहले, अपनी AndroidManifest.xml फ़ाइल में इनके बारे में बताएं:

  • एनएफ़सी हार्डवेयर को ऐक्सेस करने के लिए एनएफ़सी <uses-permission> एलिमेंट:
    <uses-permission android:name="android.permission.NFC" />
    
  • SDK टूल का वह कम से कम वर्शन जिस पर आपका ऐप्लिकेशन काम कर सकता है. एपीआई लेवल 9, ACTION_TAG_DISCOVERED से सिर्फ़ सीमित टैग डिस्पैच करने की सुविधा देता है. साथ ही, यह EXTRA_NDEF_MESSAGES अतिरिक्त के ज़रिए सिर्फ़ एनडीईएफ़ मैसेज का ऐक्सेस देता है. कोई भी टैग प्रॉपर्टी या I/O ऑपरेशन ऐक्सेस नहीं किया जा सकता. एपीआई लेवल 10 में, रीडर/राइटर्स के साथ-साथ फ़ोरग्राउंड एनडीएफ़ पुश करने की सुविधा भी शामिल है. वहीं, एपीआई लेवल 14 में एनडीएफ़ रिकॉर्ड बनाने के लिए, ज़्यादा सुविधाजनक तरीके उपलब्ध हैं.
    <uses-sdk android:minSdkVersion="10"/>
    
  • uses-feature एलिमेंट, ताकि आपका ऐप्लिकेशन Google Play पर सिर्फ़ उन डिवाइसों के लिए दिखे जिनमें एनएफ़सी हार्डवेयर है:
    <uses-feature android:name="android.hardware.nfc" android:required="true" />
    

    अगर आपका ऐप्लिकेशन एनएफ़सी की सुविधा का इस्तेमाल करता है, लेकिन वह सुविधा आपके ऐप्लिकेशन के लिए ज़रूरी नहीं है, तो uses-feature एलिमेंट को हटाया जा सकता है. साथ ही, रनटाइम के दौरान एनएफ़सी की उपलब्धता की जांच की जा सकती है. इसके लिए, यह देखें कि getDefaultAdapter() null है या नहीं.

एनएफ़सी इंटेंट के लिए फ़िल्टर

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

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

ACTION_NDEF_DISCOVERED

ACTION_NDEF_DISCOVERED इंटेंट के लिए फ़िल्टर करने के लिए, उस डेटा टाइप के साथ इंटेंट फ़िल्टर का एलान करें जिसके लिए आपको फ़िल्टर करना है. यहां दिए गए उदाहरण में, ACTION_NDEF_DISCOVERED के MIME टाइप के text/plain वाले इंटेंट को फ़िल्टर किया गया है:

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

यहां दिए गए उदाहरण में, 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>

ACTION_TECH_डिस्कवर किया गया

अगर आपकी गतिविधि, ACTION_TECH_DISCOVERED इंटेंट के लिए फ़िल्टर करती है, तो आपको एक एक्सएमएल रिसॉर्स फ़ाइल बनानी होगी. यह फ़ाइल, उन टेक्नोलॉजी के बारे में बताती है जो tech-list सेट में आपकी गतिविधि के साथ काम करती हैं. अगर tech-list सेट, उन टेक्नोलॉजी का सबसेट है जिन पर टैग काम करता है, तो आपकी गतिविधि को मैच माना जाता है. getTechList() को कॉल करके, इन टेक्नोलॉजी के बारे में पता लगाया जा सकता है.

उदाहरण के लिए, अगर स्कैन किया गया टैग MifareClassic, NdefFormatable, और NfcA के साथ काम करता है, तो आपकी गतिविधि का मिलान करने के लिए, आपके tech-list सेट में तीनों, दो या एक टेक्नोलॉजी (और कुछ और नहीं) के बारे में बताया जाना चाहिए.

नीचे दिए गए सैंपल में सभी टेक्नोलॉजी के बारे में बताया गया है. आपको उन टैग को हटाना होगा जो आपके एनएफ़सी टैग पर काम नहीं करते. इस फ़ाइल को <project-root>/res/xml फ़ोल्डर में सेव करें. इसे अपनी पसंद का कोई भी नाम दिया जा सकता है.

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

एक से ज़्यादा tech-list सेट भी तय किए जा सकते हैं. हर tech-list सेट को अलग से माना जाता है. अगर कोई एक tech-list सेट, getTechList() से मिलने वाली टेक्नोलॉजी का सबसेट है, तो आपकी गतिविधि को मैच माना जाता है. इससे, मैच करने वाली टेक्नोलॉजी के लिए AND और OR के ज़रिए सेमेनटिक्स मिलता है. यहां दिए गए उदाहरण में, उन टैग से मैच किया जाता है जो NfcA और Ndef टेक्नोलॉजी के साथ काम कर सकते हैं या NfcB और Ndef टेक्नोलॉजी के साथ काम कर सकते हैं:

<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 फ़ाइल में, <activity> एलिमेंट के अंदर <meta-data> एलिमेंट में, वह संसाधन फ़ाइल डालें जो आपने अभी बनाई है. उदाहरण के लिए:

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

टैग टेक्नोलॉजी और ACTION_TECH_DISCOVERED इंटेंट के साथ काम करने के बारे में ज़्यादा जानकारी के लिए, बेहतर एनएफ़सी दस्तावेज़ में, काम करने वाली टैग टेक्नोलॉजी के साथ काम करना देखें.

ACTION_TAG_DISCOVERED

ACTION_TAG_DISCOVERED के लिए फ़िल्टर करने के लिए, नीचे दिए गए इंटेंट फ़िल्टर का इस्तेमाल करें:

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

इंटेंट से जानकारी पाएं

अगर कोई गतिविधि एनएफ़सी इंटेंट की वजह से शुरू होती है, तो इंटेंट से स्कैन किए गए एनएफ़सी टैग के बारे में जानकारी मिल सकती है. स्कैन किए गए टैग के आधार पर, इंटेंट में नीचे दिए गए अतिरिक्त एलिमेंट शामिल हो सकते हैं:

  • EXTRA_TAG (ज़रूरी है): स्कैन किए गए टैग को दिखाने वाला Tag ऑब्जेक्ट.
  • EXTRA_NDEF_MESSAGES (ज़रूरी नहीं): टैग से पार्स किए गए NDEF मैसेज का कलेक्शन. ACTION_NDEF_DISCOVERED इंटेंट के लिए, यह अतिरिक्त एट्रिब्यूट देना ज़रूरी है.
  • EXTRA_ID (ज़रूरी नहीं): टैग का लो-लेवल आईडी.

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

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

इसके अलावा, इंटेंट से Tag ऑब्जेक्ट भी पाया जा सकता है. इसमें पेलोड शामिल होगा और आपको टैग की टेक्नोलॉजी की जानकारी भी मिलेगी:

Kotlin

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

Java

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

सामान्य तौर पर इस्तेमाल होने वाले NDEF रिकॉर्ड बनाना

इस सेक्शन में, आम तौर पर इस्तेमाल होने वाले NDEF रिकॉर्ड बनाने का तरीका बताया गया है. इससे आपको एनएफ़सी टैग में जानकारी लिखने में मदद मिलेगी. Android 4.0 (एपीआई लेवल 14) और इसके बाद के वर्शन में, createUri() वाला तरीका उपलब्ध है. इसकी मदद से, यूआरआई रिकॉर्ड अपने-आप बनाए जा सकते हैं. Android 4.1 (एपीआई लेवल 16) से, createExternal() और createMime() उपलब्ध हैं. इनकी मदद से, MIME और बाहरी टाइप के एनडीएफ़ रिकॉर्ड बनाए जा सकते हैं. मैन्युअल तरीके से एनडीएफ़ रिकॉर्ड बनाते समय, गड़बड़ियों से बचने के लिए जब भी हो सके, इन सहायक तरीकों का इस्तेमाल करें.

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

TNF_ABSOLUTE_URI

ध्यान दें: हमारा सुझाव है कि आप TNF_ABSOLUTE_URI के बजाय, RTD_URI टाइप का इस्तेमाल करें, क्योंकि यह ज़्यादा असरदार है.

TNF_ABSOLUTE_URI एनडीईएफ़ रिकॉर्ड बनाने के लिए यह तरीका अपनाएं :

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]);

पिछले NDEF रिकॉर्ड के लिए इंटेंट फ़िल्टर कुछ ऐसा दिखेगा:

<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 रिकॉर्ड बनाने के लिए, ये तरीके अपनाए जा सकते हैं:

createMime() तरीके का इस्तेमाल करके:

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 को मैन्युअल तरीके से बनाना:

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")));

पिछले NDEF रिकॉर्ड के लिए इंटेंट फ़िल्टर कुछ ऐसा दिखेगा:

<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 के साथ TNF_WELL_KNOWN

TNF_WELL_KNOWN एनडीईएफ़ रिकॉर्ड बनाने के लिए यह तरीका अपनाएं:

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

पिछले एनडीईएफ़ रिकॉर्ड का इंटेंट फ़िल्टर ऐसा दिखेगा:

<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 के साथ TNF_WELL_KNOWN

TNF_WELL_KNOWN एनडीईएफ़ रिकॉर्ड बनाने के लिए ये तरीके अपनाएं:

createUri(String) वाले तरीके का इस्तेमाल करके:

Kotlin

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

Java

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

createUri(Uri) वाले तरीके का इस्तेमाल करके:

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 बनाना:

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

पिछले NDEF रिकॉर्ड के लिए इंटेंट फ़िल्टर कुछ ऐसा दिखेगा:

<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

TNF_EXTERNAL_TYPE NDEF रिकॉर्ड बनाने के लिए, ये तरीके अपनाए जा सकते हैं:

createExternal() वाले तरीके का इस्तेमाल करके:

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 को मैन्युअल तरीके से बनाना:

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

पिछले NDEF रिकॉर्ड के लिए इंटेंट फ़िल्टर कुछ ऐसा दिखेगा:

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

TNF_EXTERNAL_TYPE का इस्तेमाल करके, एनएफ़सी टैग को सामान्य तौर पर डिप्लॉय करें, ताकि Android और Android के अलावा दूसरे डिवाइसों पर भी बेहतर तरीके से काम किया जा सके.

ध्यान दें: TNF_EXTERNAL_TYPE के लिए URN का कैननिकल फ़ॉर्मैट urn:nfc:ext:example.com:externalType होता है. हालांकि, एनएफ़सी फ़ोरम आरटीडी स्पेसिफ़िकेशन के मुताबिक, यूआरएन के urn:nfc:ext: वाले हिस्से को एनडीईएफ़ रिकॉर्ड में शामिल नहीं किया जाना चाहिए. इसलिए, आपको सिर्फ़ डोमेन (उदाहरण में example.com) और टाइप (उदाहरण में externalType) की जानकारी देनी होगी. इन दोनों को कोलन लगाकर अलग किया जाना चाहिए. TNF_EXTERNAL_TYPE डिस्पैच करते समय, Android urn:nfc:ext:example.com:externalType यूआरएन को vnd.android.nfc://ext/example.com:externalType यूआरआई में बदल देता है. उदाहरण में, इंटेंट फ़िल्टर यही बताता है.

Android ऐप्लिकेशन के रिकॉर्ड

Android 4.0 (एपीआई लेवल 14) में लॉन्च किया गया Android ऐप्लिकेशन रिकॉर्ड (एएआर), इस बात की ज़्यादा भरोसेमंद पुष्टि करता है कि एनएफ़सी टैग स्कैन होने पर आपका ऐप्लिकेशन शुरू हो जाएगा. AAR में, NDEF रिकॉर्ड में एम्बेड किए गए ऐप्लिकेशन का पैकेज नाम होता है. अपने एनडीएफ़ मैसेज के किसी भी एनडीएफ़ रिकॉर्ड में एएआर जोड़ा जा सकता है, क्योंकि Android पूरे एनडीएफ़ मैसेज में एएआर खोजता है. अगर उसे कोई AAR मिलता है, तो वह AAR में मौजूद पैकेज के नाम के आधार पर ऐप्लिकेशन को शुरू करता है. अगर ऐप्लिकेशन डिवाइस पर मौजूद नहीं है, तो ऐप्लिकेशन डाउनलोड करने के लिए Google Play लॉन्च किया जाता है.

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

अगर किसी टैग में एएआर मौजूद है, तो टैग डिस्पैच सिस्टम इस तरह से भेजा जाता है:

  1. सामान्य तौर पर, इंटेंट फ़िल्टर का इस्तेमाल करके कोई गतिविधि शुरू करने की कोशिश करें. अगर इंटेंट से मैच करने वाली गतिविधि, AAR से भी मैच करती है, तो गतिविधि शुरू करें.
  2. अगर इंटेंट के लिए फ़िल्टर करने वाली ऐक्टिविटी, AAR से मेल नहीं खाती है, अगर एक से ज़्यादा ऐक्टिविटी इंटेंट को हैंडल कर सकती हैं या कोई भी ऐक्टिविटी इंटेंट को हैंडल नहीं करती है, तो AAR में बताए गए ऐप्लिकेशन को शुरू करें.
  3. अगर कोई भी ऐप्लिकेशन AAR से शुरू नहीं हो पा रहा है, तो AAR के आधार पर ऐप्लिकेशन डाउनलोड करने के लिए Google Play पर जाएं.

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

अगर आपको अब भी ऐसे स्कैन किए गए टैग को फ़िल्टर करना है जिनमें एएआर नहीं है, तो इंटेंट फ़िल्टर को सामान्य के तौर पर घोषित किया जा सकता है. यह तब फ़ायदेमंद होता है, जब आपके ऐप्लिकेशन की दिलचस्पी ऐसे अन्य टैग में हो जिनमें AAR शामिल नहीं है. उदाहरण के लिए, शायद आप यह गारंटी देना चाहें कि आपका ऐप्लिकेशन आपके मालिकाना हक वाले टैग को मैनेज करता है. साथ ही, आप तीसरे पक्षों की ओर से डिप्लॉय किए गए सामान्य टैग को भी हैंडल कर सकते हैं. ध्यान रखें कि AAR, Android 4.0 या उसके बाद के वर्शन वाले डिवाइसों के लिए ही हैं. इसलिए, टैग डिप्लॉय करते समय, ज़्यादा से ज़्यादा डिवाइसों के साथ काम करने के लिए, AAR और MIME टाइप/यूआरआई के कॉम्बिनेशन का इस्तेमाल करें. इसके अलावा, एनएफ़सी टैग डिप्लॉय करते समय, इस बात पर ध्यान दें कि आपको अपने एनएफ़सी टैग को कैसे लिखना है, ताकि ज़्यादा से ज़्यादा डिवाइसों (Android और अन्य डिवाइसों) के साथ काम करने की सुविधा चालू की जा सके. ऐसा करने के लिए, एक यूनीक MIME टाइप या यूआरआई तय करें, ताकि ऐप्लिकेशन आसानी से इनके बीच अंतर कर सकें.

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

Kotlin

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

Java

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