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

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

एनडीईएफ़ डेटा और Android के साथ काम करते समय, इस्तेमाल के दो मुख्य उदाहरण हैं:

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

Android बीमTM सुविधा की मदद से डिवाइस, NDEF मैसेज को शारीरिक रूप से डिवाइसों को एक साथ टैप करके. इस इंटरैक्शन की मदद से, ब्लूटूथ जैसी अन्य वायरलेस तकनीकों की तुलना में डेटा भेजने के लिए, क्योंकि NFC के साथ, कोई मैन्युअल डिवाइस नहीं है खोजना या पेयर करना ज़रूरी है. दो डिवाइसों के आने पर, कनेक्शन अपने-आप शुरू हो जाता है सीमा में रखा जा सकता है. Android बीम, एनएफ़सी एपीआई के सेट के ज़रिए उपलब्ध होता है, ताकि कोई भी ऐप्लिकेशन ट्रांसमिट कर सके डिवाइसों के बीच जानकारी. उदाहरण के लिए, संपर्क, ब्राउज़र, और YouTube ऐप्लिकेशन अन्य डिवाइस के साथ संपर्क, वेब पेज और वीडियो शेयर करने के लिए Android बीम.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

टाइप नेम फ़ॉर्मैट (टीएनएफ़) मैप करना
TNF_ABSOLUTE_URI टाइप फ़ील्ड के आधार पर यूआरआई.
TNF_EMPTY ACTION_TECH_DISCOVERED पर वापस चला जाता है.
TNF_EXTERNAL_TYPE टाइप फ़ील्ड में, URN पर आधारित यूआरआई. 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 टाइप या यूआरआई, जो उस रिकॉर्ड टाइप डेफ़िनिशन (आरटीडी) पर निर्भर करता है जिसे आपने फ़ील्ड टाइप करें. इन चीज़ों के बारे में ज़्यादा जानकारी पाने के लिए, दूसरी टेबल देखें उपलब्ध आरटीडी और उनकी मैपिंग की जानकारी मिल सकती है.

दूसरी टेबल. TNF_WELL_KNOWN और उनके लिए समर्थित RTD मैपिंग

रिकॉर्ड टाइप डेफ़िनिशन (आरटीडी) मैप करना
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 को शुरू किए बिना) शुरू हो जाता है इसमें NDEF डेटा है, जिसे MIME टाइप या यूआरआई से मैप नहीं किया जा सकता या अगर टैग में NDEF शामिल नहीं है लेकिन यह एक ज्ञात टैग टेक्नोलॉजी के लिए है.
  3. ACTION_TAG_DISCOVERED: यह इंटेंट शुरू हो गया है अगर कोई गतिविधि ACTION_NDEF_DISCOVERED या ACTION_TECH_DISCOVERED को हैंडल नहीं करती इंटेंट.

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

  1. टैग डिस्पैच सिस्टम के बनाए गए इंटेंट के साथ ऐक्टिविटी शुरू करने की कोशिश करें जब NFC टैग पार्स करते समय (या तो 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 अतिरिक्त के ज़रिए NDEF मैसेज का ऐक्सेस. नहीं अन्य टैग प्रॉपर्टी या I/O कार्रवाइयों को ऐक्सेस किया जा सकता है. एपीआई लेवल 10 इसमें हर तरह की रीडर/राइटर की सुविधा के साथ-साथ फ़ोरग्राउंड NDEF पुशिंग और एपीआई लेवल शामिल है 14, Android बीम और अन्य ऐप्लिकेशन की मदद से, NDEF मैसेज को अन्य डिवाइसों में आसानी से पुश करने की सुविधा देता है एनडीईएफ़ रिकॉर्ड बनाने के लिए आसान तरीके.
    <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 या तब के लिए, जब पेलोड न हो एनडीईएफ़. ACTION_TAG_DISCOVERED के लिए फ़िल्टर करना आम तौर पर बहुत सामान्य है फ़िल्टर करने के लिए कैटगरी चुनें. कई ऐप्लिकेशन, ACTION_TAG_DISCOVERED से पहले ACTION_NDEF_DISCOVERED या ACTION_TECH_DISCOVERED के लिए फ़िल्टर कर सकते हैं. इसलिए, हो सकता है कि आपका ऐप्लिकेशन, शुरू कर रहे हैं. ACTION_TAG_DISCOVERED सिर्फ़ आखिरी रिज़ॉर्ट के तौर पर उपलब्ध है उन मामलों में ऐप्लिकेशन फ़िल्टर करने के लिए जहां ACTION_NDEF_DISCOVERED या ACTION_TECH_DISCOVERED इंटेंट.

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

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

ACTION_NDEF_DISCOVERED इंटेंट को फ़िल्टर करने के लिए, इंटेंट फ़िल्टर करें. कॉन्टेंट बनाने ACTION_NDEF_DISCOVERED के लिए उदाहरण के तौर पर दिए गए फ़िल्टर text/plain के MIME टाइप वाले इंटेंट:

<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() पर कॉल करके मिल सकती है.

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

नीचे दिए गए सैंपल में सभी टेक्नोलॉजी के बारे में बताया गया है. आपको उन डोमेन को हटाना होगा जो आपके NFC टैग द्वारा समर्थित हैं. इस फ़ाइल को <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 उपलब्ध कराता है मैचिंग टेक्नोलॉजी के लिए सिमेंटिक्स. नीचे दिया गया उदाहरण उन टैग से मेल खाता है जो एनएफ़सीए और एनडीएफ़ टेक्नोलॉजी या एनएफ़सीबी और एनडीएफ़ टेक्नोलॉजी के साथ काम कर सकती हैं:

<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_खोजा गया

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

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

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

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

  • EXTRA_TAG (ज़रूरी है): Tag ऑब्जेक्ट स्कैन किया गया टैग दिखा रहा है.
  • EXTRA_NDEF_MESSAGES (ज़रूरी नहीं): एनडीईएफ़ मैसेज का कलेक्शन को टैग से पार्स किया होगा. इन अतिरिक्त शर्तों को पूरा करना ज़रूरी है 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 रिकॉर्ड बनाना

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

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

टीएनएफ़_एसयूआरपी

ध्यान दें: हमारा सुझाव है कि आप इसके बजाय, RTD_URI टाइप करें TNF_ABSOLUTE_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]);

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

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

टीएनएफ़_MIME_मीडिया

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

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

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

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

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

<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 एनडीईएफ़ रिकॉर्ड इनमें से बनाया जा सकता है: तरीके:

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

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

<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 के urn:nfc:ext: वाले हिस्से को NDEF रिकॉर्ड. इसलिए, आपको सिर्फ़ डोमेन (उदाहरण में example.com) देना होगा और टाइप करें (उदाहरण में externalType) कोलन से अलग करते हुए. TNF_EXTERNAL_TYPE को भेजते समय, Android, urn:nfc:ext:example.com:externalType URN को vnd.android.nfc://ext/example.com:externalType यूआरआई में बदल देता है, जो कि इंटेंट फ़िल्टर का इस्तेमाल, उदाहरण के तौर पर किया गया है.

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

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

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

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

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

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

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

Android, एएआर बनाने के लिए एक आसान एपीआई उपलब्ध कराता है. createApplicationRecord(). आपको बस यही ज़रूरत है AAR को अपने NdefMessage में कहीं भी एम्बेड करें. क्या आपको अपने NdefMessage के पहले रिकॉर्ड का इस्तेमाल करने के लिए, जब तक सिर्फ़ AAR NdefMessage में रिकॉर्ड किया. ऐसा इसलिए होता है, क्योंकि 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")}
        );
)

NDEF मैसेज को अन्य डिवाइसों पर बीम करना

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

ध्यान दें: फ़ोरग्राउंड एनडीईएफ़ पुशिंग की सुविधा, एपीआई लेवल 10 पर उपलब्ध थी, जो Android बीम की तरह काम करता है. इसके बाद से इन एपीआई को बंद कर दिया गया है. हालांकि, पुराने डिवाइसों के साथ काम करते हैं. ज़्यादा जानकारी के लिए, enableForegroundNdefPush() पर जाएं.

आप इन दो तरीकों में से किसी एक पर कॉल करके अपने ऐप्लिकेशन के लिए Android बीम को चालू कर सकते हैं:

  • setNdefPushMessage(): बीम के संदेश के रूप में सेट करने के लिए NdefMessage. मैसेज को अपने-आप बीम करें जब दो डिवाइस काफ़ी नज़दीक हों.
  • setNdefPushMessageCallback(): कॉलबैक को स्वीकार करता है, जिसमें createNdefMessage() इसे तब कॉल किया जाता है, जब कोई डिवाइस डेटा बीम करने की रेंज में होता है. कॉलबैक की मदद से, NDEF संदेश केवल ज़रूरत होने पर ही सबमिट करें.

एक गतिविधि एक बार में सिर्फ़ एक एनडीईएफ़ मैसेज पुश कर सकती है. इसलिए, setNdefPushMessageCallback() को प्राथमिकता दी जाती है setNdefPushMessage() से ज़्यादा होगी. इस्तेमाल करने के लिए Android बीम, इन सामान्य दिशा-निर्देशों का पालन करना ज़रूरी है:

  • डेटा को बीम करने वाली गतिविधि, फ़ोरग्राउंड में होनी चाहिए. दोनों डिवाइसों में कर दिया जाता है.
  • आपको उस डेटा को एनकैप्सुलेट करना होगा जिसे आप NdefMessage में बीम कर रहे हैं ऑब्जेक्ट है.
  • जिस एनएफ़सी डिवाइस को बीम किया गया डेटा मिल रहा है उसे com.android.npp NDEF पुश प्रोटोकॉल या एनएफ़सी फ़ोरम का SNEP (आसान NDEF Exchange प्रोटोकॉल). एपीआई लेवल 9 (Android) वाले डिवाइसों के लिए com.android.npp प्रोटोकॉल ज़रूरी है 2.3) से लेकर एपीआई लेवल 13 (Android 3.2) तक. com.android.npp और SNEP, दोनों इस पर ज़रूरी हैं एपीआई लेवल 14 (Android 4.0) और इसके बाद के वर्शन.

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

Android बीम को चालू करने के लिए:

  1. ऐसा NdefMessage बनाएं जिसमें NdefRecord शामिल हों जिसे आपको दूसरे डिवाइस में पुश करना है.
  2. इस तरीके से setNdefPushMessage() को NdefMessage से कॉल करें या NfcAdapter.CreateNdefMessageCallback ऑब्जेक्ट में पास होने वाले setNdefPushMessageCallback को कॉल करेंonCreate() आपकी गतिविधि. इन तरीकों का इस्तेमाल करने के लिए, कम से कम एक ऐसी गतिविधि ज़रूरी है जिसे आपको Android में चालू करना है अन्य गतिविधियों की वैकल्पिक सूची के साथ बीम करें.

    आम तौर पर, अगर आपकी गतिविधि के लिए सिर्फ़ ज़रूरी है, तो आम तौर पर setNdefPushMessage() का इस्तेमाल किया जाता है एक ही NDEF संदेश हर समय तब पुश करें, जब दो डिवाइस संचार करने के लिए रेंज में हों. आप उपयोग करते हैं setNdefPushMessageCallback जब आपका ऐप्लिकेशन, ऐप्लिकेशन के मौजूदा संदर्भ पर ध्यान देता है और NDEF मैसेज भेजना चाहता है जो इस बात पर निर्भर करता है कि उपयोगकर्ता आपके ऐप्लिकेशन में क्या कर रहा है.

नीचे दिया गया नमूना दिखाता है कि किसी सामान्य गतिविधि ने onCreate() तरीके में NfcAdapter.CreateNdefMessageCallback को कैसे कॉल किया है गतिविधि (AndroidBeamDemo देखें देखें). इस उदाहरण में MIME रिकॉर्ड बनाने में आपकी मदद करने के तरीके भी हैं:

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

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

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

इस इंटेंट फ़िल्टर की मदद से, अब com.example.android.beam ऐप्लिकेशन को इस्तेमाल किया जा सकता है जब यह किसी एनएफ़सी टैग को स्कैन करता है या एएआर के साथ Android बीम com.example.android.beam टाइप करें या जब NDEF फ़ॉर्मैट वाले मैसेज में MIME रिकॉर्ड हो application/vnd.com.example.android.beam टाइप का है.

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