इस दस्तावेज़ में उन बेसिक एनएफ़सी टास्क के बारे में बताया गया है जिन्हें Android में किया जाता है. यह बताता है कि कैसे उन्हें NDEF मैसेज के तौर पर एनएफ़सी डेटा मिलता है. साथ ही, यह Android फ़्रेमवर्क के एपीआई के बारे में बताता है जो इन सुविधाओं के बारे में ज़्यादा जानें. ज़्यादा ऐडवांस विषयों के लिए, नॉन-एनडीईएफ़ डेटा के साथ काम करने पर चर्चा करना भी शामिल है. बेहतर एनएफ़सी देखें.
एनडीईएफ़ डेटा और Android के साथ काम करते समय, इस्तेमाल के दो मुख्य उदाहरण हैं:
- एनएफ़सी टैग से NDEF का डेटा पढ़ना
- Android की मदद से, एक डिवाइस से दूसरे डिवाइस में NDEF मैसेज बीम करना बीमटीएम
एनएफ़सी टैग से NDEF का डेटा पढ़ने को टैग डिस्पैच की मदद से मैनेज किया जाता है यह सिस्टम, खोज के लिए इस्तेमाल किए गए एनएफ़सी टैग का विश्लेषण करता है. साथ ही, डेटा को सही कैटगरी में बांटता है और एक ऐसा ऐप्लिकेशन जिसकी कैटगरी डेटा में दिलचस्पी हो. ऐसा ऐप्लिकेशन जो स्कैन किया गया एनएफ़सी टैग, इंटेंट फ़िल्टर का एलान कर सकता है और डेटा मैनेज करने का अनुरोध करें.
Android बीमTM सुविधा की मदद से डिवाइस, NDEF मैसेज को शारीरिक रूप से डिवाइसों को एक साथ टैप करके. इस इंटरैक्शन की मदद से, ब्लूटूथ जैसी अन्य वायरलेस तकनीकों की तुलना में डेटा भेजने के लिए, क्योंकि NFC के साथ, कोई मैन्युअल डिवाइस नहीं है खोजना या पेयर करना ज़रूरी है. दो डिवाइसों के आने पर, कनेक्शन अपने-आप शुरू हो जाता है सीमा में रखा जा सकता है. Android बीम, एनएफ़सी एपीआई के सेट के ज़रिए उपलब्ध होता है, ताकि कोई भी ऐप्लिकेशन ट्रांसमिट कर सके डिवाइसों के बीच जानकारी. उदाहरण के लिए, संपर्क, ब्राउज़र, और YouTube ऐप्लिकेशन अन्य डिवाइस के साथ संपर्क, वेब पेज और वीडियो शेयर करने के लिए Android बीम.
टैग डिस्पैच सिस्टम
Android डिवाइस, आम तौर पर एनएफ़सी टैग का इस्तेमाल तब करते हैं, जब स्क्रीन अनलॉक है, जब तक कि डिवाइस के सेटिंग मेन्यू में एनएफ़सी बंद न हो. जब Android पर काम करने वाले किसी डिवाइस को एनएफ़सी टैग का पता चलता है, तो सबसे सही गतिविधि को उपयोगकर्ता से पूछे बिना इंटेंट को हैंडल करना चाहिए इस्तेमाल करें. डिवाइस बहुत कम दूरी पर एनएफ़सी टैग को स्कैन करते हैं. इसलिए, हो सकता है कि उपयोगकर्ता मैन्युअल तरीके से कोई गतिविधि चुनने पर, उन्हें डिवाइस को टैग से दूर ले जाना होगा और कनेक्शन टूटना होगा. आपको अपनी गतिविधि इस तरह बनानी चाहिए कि आप सिर्फ़ उन एनएफ़सी टैग को हैंडल करें जिनका ध्यान आपकी गतिविधि के लिए है गतिविधि चुनने वाले को दिखने से रोकें.
इस लक्ष्य को पूरा करने में आपकी मदद करने के लिए, Android एक खास टैग डिस्पैच सिस्टम उपलब्ध कराता है. यह सिस्टम, स्कैन किए गए डेटा का विश्लेषण करता है NFC टैग, उन्हें पार्स करता है, और स्कैन किए गए डेटा में रुचि रखने वाले ऐप्लिकेशन को ढूंढने का प्रयास करता है. यह ऐसा करने से:
- एनएफ़सी टैग को पार्स करना और डेटा पेलोड की पहचान करने वाले MIME टाइप या यूआरआई को समझना डालें.
- MIME टाइप या यूआरआई और पेलोड को किसी इंटेंट में एन्क्रिप्ट (सुरक्षित) किया जाता है. इन पहले दो एनएफ़सी टैग को MIME टाइप और यूआरआई में मैप करने के तरीके में बताया गया है.
- इंटेंट के आधार पर कोई गतिविधि शुरू करता है. यह इसमें बताया गया है एनएफ़सी टैग को ऐप्लिकेशन में कैसे भेजा जाता है.
एनएफ़सी टैग को 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
टाइप का रिकॉर्ड मिलता है, तो यह एक ऐसा इंटेंट बनाता है जो टैग की टेक्नोलॉजी को जानकारी देता है
आज़माएं.
टाइप नेम फ़ॉर्मैट (टीएनएफ़) | मैप करना |
---|---|
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 टाइप या यूआरआई, जो उस रिकॉर्ड टाइप डेफ़िनिशन (आरटीडी) पर निर्भर करता है जिसे आपने फ़ील्ड टाइप करें. इन चीज़ों के बारे में ज़्यादा जानकारी पाने के लिए, दूसरी टेबल देखें उपलब्ध आरटीडी और उनकी मैपिंग की जानकारी मिल सकती है. |
रिकॉर्ड टाइप डेफ़िनिशन (आरटीडी) | मैप करना |
---|---|
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 |
पेलोड के आधार पर यूआरआई. |
एनएफ़सी टैग, ऐप्लिकेशन में कैसे भेजे जाते हैं
जब टैग डिस्पैच सिस्टम, ऐसा इंटेंट बना देता है जो एनएफ़सी टैग और पहचान करने वाली जानकारी, यह इंटेंट को ऐसे ऐप्लिकेशन को भेजता है जो इंटेंट के लिए फ़िल्टर. अगर एक से ज़्यादा ऐप्लिकेशन इंटेंट को हैंडल कर सकते हैं, तो गतिविधि चुनने का टूल को दिखाया जाता है, ताकि उपयोगकर्ता गतिविधि को चुन सके. टैग डिस्पैच सिस्टम, तीन इंटेंट को तय करता है, जो सबसे ज़्यादा से कम प्राथमिकता के क्रम में दिए गए हैं:
-
ACTION_NDEF_DISCOVERED
: इस इंटेंट का इस्तेमाल यह गतिविधि उस समय की जाती है जब एनडीईएफ़ पेलोड वाले टैग को स्कैन किया जाता है और वह किसी मान्य तरह का होता है. यह है सबसे ज़्यादा प्राथमिकता वाला इंटेंट होता है. टैग डिस्पैच सिस्टम इस विकल्प के साथ कोई ऐक्टिविटी शुरू करने की कोशिश करता है इंटेंट का इस्तेमाल करें. ACTION_TECH_DISCOVERED
: अगर इसमें कोई गतिविधि रजिस्टर नहीं होती हैACTION_NDEF_DISCOVERED
को हैंडल करो इंटेंट, टैग डिस्पैच सिस्टम इस इंटेंट के साथ ऐप्लिकेशन शुरू करने की कोशिश करता है. यह अगर टैग स्कैन किया गया है, तो इंटेंट भी सीधे तौर पर (ACTION_NDEF_DISCOVERED
को शुरू किए बिना) शुरू हो जाता है इसमें NDEF डेटा है, जिसे MIME टाइप या यूआरआई से मैप नहीं किया जा सकता या अगर टैग में NDEF शामिल नहीं है लेकिन यह एक ज्ञात टैग टेक्नोलॉजी के लिए है.ACTION_TAG_DISCOVERED
: यह इंटेंट शुरू हो गया है अगर कोई गतिविधिACTION_NDEF_DISCOVERED
याACTION_TECH_DISCOVERED
को हैंडल नहीं करती इंटेंट.
टैग डिस्पैच सिस्टम के काम करने का बुनियादी तरीका यहां बताया गया है:
- टैग डिस्पैच सिस्टम के बनाए गए इंटेंट के साथ ऐक्टिविटी शुरू करने की कोशिश करें
जब NFC टैग पार्स करते समय (या तो
ACTION_NDEF_DISCOVERED
याACTION_TECH_DISCOVERED
). - अगर उस इंटेंट के लिए कोई भी गतिविधि फ़िल्टर नहीं की गई है, तो अगले
सबसे कम प्राथमिकता इंटेंट (
ACTION_TECH_DISCOVERED
याACTION_TAG_DISCOVERED
) को तब तक इस्तेमाल करें, जब तक कि इंटेंट तय करें या जब तक टैग डिस्पैच सिस्टम सभी संभावित इंटेंट को आज़मा न जाए. - अगर कोई भी ऐप्लिकेशन किसी भी इंटेंट के लिए फ़िल्टर नहीं करता है, तो कुछ न करें.
जब भी हो सके, 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 लॉन्च किया गया है, तो ऐप्लिकेशन डाउनलोड किया जा सकता है.
एएआर का इस्तेमाल तब करना चाहिए, जब आपको दूसरे ऐप्लिकेशन को एक ही इंटेंट के लिए फ़िल्टर करने से रोकना हो और संभावित रूप से उन टैग को हैंडल करना जिन्हें आपने डिप्लॉय किया है. एएआर सिर्फ़ यहां काम करते हैं: ऐप्लिकेशन स्तर पर, क्योंकि पैकेज नाम के कंस्ट्रेंट की वजह से, न कि गतिविधि स्तर पर इंटेंट फ़िल्टर करने की सुविधा. अगर आपको गतिविधि लेवल पर किसी इंटेंट को मैनेज करना है, तो इंटेंट फ़िल्टर का इस्तेमाल करें.
अगर किसी टैग में एएआर मौजूद है, तो टैग डिस्पैच सिस्टम इस तरह से भेजा जाता है:
- इंटेंट फ़िल्टर का इस्तेमाल करके, सामान्य तौर पर कोई गतिविधि शुरू करने की कोशिश करें. अगर मेल खाने वाली गतिविधि इंटेंट, एएआर से भी मेल खाता हो, तो गतिविधि शुरू करें.
- अगर इंटेंट के लिए फ़िल्टर करने वाली गतिविधि एएआर, अगर कई ऐक्टिविटी इंटेंट को हैंडल कर सकती हैं या कोई ऐक्टिविटी इंटेंट को हैंडल नहीं करती है, तो एएआर की ओर से तय किया गया ऐप्लिकेशन.
- अगर कोई भी ऐप्लिकेशन एएआर से शुरू नहीं हो सकता, तो 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 बीम को चालू करने के लिए:
- ऐसा
NdefMessage
बनाएं जिसमेंNdefRecord
शामिल हों जिसे आपको दूसरे डिवाइस में पुश करना है. - इस तरीके से
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 रिकॉर्ड में पहचान की जानकारी भी जोड़नी चाहिए मैसेज भेजने और उसके लिए फ़िल्टर करने की सुविधा भी मिलेगी. सामान्य बनाना देखें रिकॉर्ड बनाने के तरीके के बारे में ज़्यादा जानकारी के लिए, एनडीईएफ़ रिकॉर्ड के टाइप.