इस दस्तावेज़ में ऐडवांस एनएफ़सी से जुड़े विषयों के बारे में बताया गया है. जैसे, अलग-अलग टैग टेक्नोलॉजी के साथ काम करना, एनएफ़सी टैग पर लिखने और फ़ोरग्राउंड डिस्पैच करने की सुविधा मिलती है. इसकी मदद से, फ़ोरग्राउंड में ऐप्लिकेशन को इंटेंट को हैंडल करें, भले ही दूसरे ऐप्लिकेशन उसी तरह के इंटेंट को फ़िल्टर करते हों.
काम करने वाली टैग टेक्नोलॉजी का इस्तेमाल करना
एनएफ़सी टैग और Android के साथ काम करने वाले डिवाइसों के साथ काम करते समय, कॉन्टेंट पढ़ने के लिए इस्तेमाल किया जाने वाला मुख्य फ़ॉर्मैट
और टैग पर डेटा NDEF है. जब कोई डिवाइस, एनडीईएफ़ डेटा वाले टैग को स्कैन करता है, तो Android उस टैग को
मैसेज को पार्स करने और उसे NdefMessage
में डिलीवर करने में
किया जा सकता है. हालांकि, कुछ मामलों में ऐसी स्थिति भी होती है, जब आप किसी ऐसे टैग को स्कैन करते हैं जिसमें
NDEF डेटा या जब NDEF डेटा को MIME टाइप या यूआरआई के साथ मैप नहीं किया जा सका.
इन मामलों में, आपको सीधे टैग के साथ कम्यूनिकेशन खोलना होगा. इसके बाद,
आपका अपना प्रोटोकॉल (रॉ बाइट में) डालें. Android, ऐप्लिकेशन के इन मामलों में सामान्य सहायता उपलब्ध कराता है.
android.nfc.tech
पैकेज, जिसके बारे में टेबल 1 में बताया गया है. आप
getTechList()
तरीके का इस्तेमाल करके, यह पता लगाया जा सकता है कि टेक्नोलॉजी किस तरह की है
टैग का इस्तेमाल करें और उससे संबंधित TagTechnology
बनाएं
android.nfc.tech
के दिए गए क्लास में से किसी एक वाला ऑब्जेक्ट
टेबल 1. इस्तेमाल की जा सकने वाली टैग टेक्नोलॉजी
कक्षा | ब्यौरा |
---|---|
TagTechnology |
ऐसा इंटरफ़ेस जिसे सभी टैग टेक्नोलॉजी क्लास को लागू करना होगा. |
NfcA |
एनएफ़सी-ए (ISO 14443-3A) प्रॉपर्टी और I/O कार्रवाइयों का ऐक्सेस देता है. |
NfcB |
एनएफ़सी-बी (ISO 14443-3B) प्रॉपर्टी और I/O कार्रवाइयों का ऐक्सेस देता है. |
NfcF |
एनएफ़सी-एफ़ (JIS 6319-4) प्रॉपर्टी और I/O कार्रवाइयों का ऐक्सेस देता है. |
NfcV |
एनएफ़सी-वी (ISO 15693) प्रॉपर्टी और I/O कार्रवाइयों का ऐक्सेस देता है. |
IsoDep |
ISO-DEP (ISO 14443-4) प्रॉपर्टी और I/O कार्रवाइयों का ऐक्सेस देता है. |
Ndef |
इस नीति से, एनएफ़सी टैग पर एनडीईएफ़ डेटा और ऑपरेशन को ऐक्सेस करने की सुविधा मिलती है. एनडीईएफ़. |
NdefFormatable |
उन टैग के लिए फ़ॉर्मैट ऑपरेशन देता है जो NDEF फ़ॉर्मैट करने लायक हो सकते हैं. |
Android डिवाइस पर काम करने वाले डिवाइसों के लिए, नीचे दी गई टैग टेक्नोलॉजी का इस्तेमाल करना ज़रूरी नहीं है.
दूसरी टेबल. इस्तेमाल की जा सकने वाली वैकल्पिक टैग टेक्नोलॉजी
कक्षा | ब्यौरा |
---|---|
MifareClassic |
यह Android डिवाइस होने पर, MIFARE क्लासिक प्रॉपर्टी और I/O ऑपरेशन का ऐक्सेस देता है MIFARE का समर्थन करता है. |
MifareUltralight |
अगर यह Android डिवाइस है, तो यह MIFARE Ultralight प्रॉपर्टी और I/O ऑपरेशन का ऐक्सेस देता है डिवाइस MIFARE का समर्थन करता है. |
टैग टेक्नोलॉजी और ACTION_TECH_DISCOVERED इंटेंट के साथ काम करें
जब कोई डिवाइस किसी ऐसे टैग को स्कैन करता है जिसमें NDEF का डेटा मौजूद होता है, लेकिन उसे MIME या यूआरआई के साथ मैप नहीं किया जा सकता, तो
टैग डिस्पैच सिस्टम, ACTION_TECH_DISCOVERED
के साथ कोई गतिविधि शुरू करने की कोशिश करता है
इंटेंट. ACTION_TECH_DISCOVERED
का इस्तेमाल तब भी किया जाता है, जब कोई टैग
बिना NDEF वाले डेटा को स्कैन किया जाता है. यह फ़ॉलबैक आपको टैग पर मौजूद डेटा के साथ काम करने की सुविधा देता है
का इस्तेमाल करें, अगर टैग डिस्पैच सिस्टम उसे आपके लिए पार्स नहीं कर पाता. इस पर काम करने के बुनियादी तरीके
टैग की टेक्नोलॉजी के बारे में यहां बताया गया है:
- उस
ACTION_TECH_DISCOVERED
इंटेंट के लिए फ़िल्टर करें जिसमें जिन्हें मैनेज करना है. एनएफ़सी के लिए फ़िल्टर करना देखें इंटेंट देखें. आम तौर पर, टैग डिस्पैच सिस्टम, एनडीईएफ़ मैसेज परACTION_TECH_DISCOVERED
इंटेंट शुरू करने की कोशिश करता है MIME टाइप या यूआरआई के साथ मैप नहीं किया जा सकता या अगर स्कैन किए गए टैग में NDEF का डेटा नहीं है. इसके लिए इसे कैसे तय किया जाता है, इस बारे में ज़्यादा जानकारी के लिए, टैग डिस्पैच सिस्टम लेख पढ़ें. - जब आपके ऐप्लिकेशन को इंटेंट मिलता है, तो यहां से
Tag
ऑब्जेक्ट पाएं इंटेंट: - किसी एक को कॉल करके,
TagTechnology
का इंस्टेंस पाएंandroid.nfc.tech
पैकेज में क्लास कीget
फ़ैक्ट्री तरीके. आपget
फ़ैक्ट्री तरीके को कॉल करने से पहले,getTechList()
को कॉल करके टैग के लिए काम करने वाली टेक्नोलॉजी की गिनती करें. उदाहरण के लिए,Tag
में सेMifareUltralight
में से, ये काम करें:
टैग के लिए पढ़ें और लिखें
एनएफ़सी टैग को पढ़ने और लिखने की प्रक्रिया में, इंटेंट से टैग पाना और टैग के साथ बातचीत शुरू करना. डेटा पढ़ने और उसमें बदलाव करने के लिए, आपको अपना प्रोटोकॉल स्टैक तय करना होगा से टैग कैसे करें. हालांकि, ध्यान रखें कि काम करते समय भी NDEF डेटा को पढ़ा और लिखा जा सकता है टैग का इस्तेमाल किया जा सकता है. यह आप पर निर्भर करता है कि चीज़ों को कैसे तैयार करना है. कॉन्टेंट बनाने नीचे दिए गए उदाहरण में, MIFARE Ultralight टैग के साथ काम करने का तरीका बताया गया है.
package com.example.android.nfc
import android.nfc.Tag
import android.nfc.tech.MifareUltralight
import java.io.IOException
import java.nio.charset.Charset
class MifareUltralightTagTester {
fun writeTag(tag: Tag, tagText: String) {
MifareUltralight.get(tag)?.use { ultralight ->
ultralight.connect()
Charset.forName("US-ASCII").also { usAscii ->
ultralight.writePage(4, "abcd".toByteArray(usAscii))
ultralight.writePage(5, "efgh".toByteArray(usAscii))
ultralight.writePage(6, "ijkl".toByteArray(usAscii))
ultralight.writePage(7, "mnop".toByteArray(usAscii))
}
}
}
fun readTag(tag: Tag): String? {
return MifareUltralight.get(tag)?.use { mifare ->
mifare.connect()
val payload = mifare.readPages(4)
String(payload, Charset.forName("US-ASCII"))
}
}
}
package com.example.android.nfc;
import android.nfc.Tag;
import android.nfc.tech.MifareUltralight;
import android.util.Log;
import java.io.IOException;
import java.nio.charset.Charset;
public class MifareUltralightTagTester {
private static final String TAG = MifareUltralightTagTester.class.getSimpleName();
public void writeTag(Tag tag, String tagText) {
MifareUltralight ultralight = MifareUltralight.get(tag);
try {
ultralight.connect();
ultralight.writePage(4, "abcd".getBytes(Charset.forName("US-ASCII")));
ultralight.writePage(5, "efgh".getBytes(Charset.forName("US-ASCII")));
ultralight.writePage(6, "ijkl".getBytes(Charset.forName("US-ASCII")));
ultralight.writePage(7, "mnop".getBytes(Charset.forName("US-ASCII")));
} catch (IOException e) {
Log.e(TAG, "IOException while writing MifareUltralight...", e);
} finally {
try {
ultralight.close();
} catch (IOException e) {
Log.e(TAG, "IOException while closing MifareUltralight...", e);
}
}
}
public String readTag(Tag tag) {
MifareUltralight mifare = MifareUltralight.get(tag);
try {
mifare.connect();
byte[] payload = mifare.readPages(4);
return new String(payload, Charset.forName("US-ASCII"));
} catch (IOException e) {
Log.e(TAG, "IOException while reading MifareUltralight message...", e);
} finally {
if (mifare != null) {
try {
mifare.close();
}
catch (IOException e) {
Log.e(TAG, "Error closing tag...", e);
}
}
}
return null;
}
}
फ़ोरग्राउंड डिस्पैच सिस्टम का इस्तेमाल करें
फ़ोरग्राउंड डिस्पैच सिस्टम की मदद से, किसी गतिविधि को किसी इंटेंट और दावे को रोकने में मदद मिलती है प्राथमिकता को उन अन्य गतिविधियों पर प्राथमिकता दें जो एक ही इंटेंट को हैंडल करते हैं. इस सिस्टम का इस्तेमाल करने में ये चीज़ें शामिल हैं हम Android सिस्टम के लिए कुछ डेटा स्ट्रक्चर बनाते हैं, ताकि उन सभी को भेजा जा सके इंटेंट भी करें. फ़ोरग्राउंड डिस्पैच सिस्टम को चालू करने के लिए:
- अपनी गतिविधि के
onCreate()
तरीके में यह कोड जोड़ें:- ऐसा
PendingIntent
ऑब्जेक्ट बनाएं जिसे बदला जा सके, ताकि Android सिस्टम उसे भर सके टैग को स्कैन करते समय, उसकी जानकारी भी शामिल करें.val intent = Intent(this, javaClass).apply {
addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
}
var pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_MUTABLE)PendingIntent pendingIntent = PendingIntent.getActivity(
this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
PendingIntent.FLAG_MUTABLE); - आपको जिन इंटेंट को रोकना है उन्हें मैनेज करने के लिए, इंटेंट फ़िल्टर का एलान करें. फ़ोरग्राउंड
डिस्पैच सिस्टम, सेट किए गए इंटेंट फ़िल्टर की जांच तब करता है, जब
डिवाइस किसी टैग को स्कैन करता है. अगर यह मेल खाता है, तो आपका ऐप्लिकेशन इंटेंट को हैंडल करता है. अगर ऐसा होता है, तो
मेल नहीं खाने पर, फ़ोरग्राउंड डिस्पैच सिस्टम फिर से इंटेंट डिस्पैच सिस्टम पर चला जाता है.
इंटेंट फ़िल्टर और टेक्नोलॉजी फ़िल्टर के
null
कलेक्शन तय करने से, यह तय होता है जिसे आपTAG_DISCOVERED
पर वापस आने वाले सभी टैग के लिए फ़िल्टर करना चाहते हैं इंटेंट. नीचे दिया गया कोड स्निपेट,NDEF_DISCOVERED
के लिए सभी MIME टाइप को मैनेज करता है. आपने लोगों तक पहुंचाया मुफ़्त में को सिर्फ़ वही टूल हैंडल करना चाहिए जिनकी आपको ज़रूरत है.val ndef = IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED).apply {
try {
addDataType("*/*") /* Handles all MIME based dispatches.
You should specify only the ones that you need. */
} catch (e: IntentFilter.MalformedMimeTypeException) {
throw RuntimeException("fail", e)
}
}
intentFiltersArray = arrayOf(ndef)IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
try {
ndef.addDataType("*/*"); /* Handles all MIME based dispatches.
You should specify only the ones that you need. */
}
catch (MalformedMimeTypeException e) {
throw new RuntimeException("fail", e);
}
intentFiltersArray = new IntentFilter[] {ndef, }; - टैग टेक्नोलॉजी का कलेक्शन सेट अप करें, जिसे आपका ऐप्लिकेशन मैनेज करना चाहता है. कॉल करें
टेक्नोलॉजी की क्लास का पता लगाने का
Object.class.getName()
तरीका है मदद करना चाहते हैं.
- ऐसा
- इन ऐक्टिविटी लाइफ़साइकल कॉलबैक को बदलें. साथ ही, इसे चालू और बंद करने के लिए लॉजिक जोड़ें
गतिविधि बंद होने पर, फ़ोरग्राउंड डिस्पैच (
onPause()
) और फिर से (onResume()
) फ़ोकस वापस आ जाता है.enableForegroundDispatch()
से कॉल करना ज़रूरी है मुख्य थ्रेड में और सिर्फ़ तब, जब गतिविधि फ़ोरग्राउंड में हो (onResume()
में कॉल करना इसकी गारंटी देता है). स्कैन किए गए एनएफ़सी का डेटा प्रोसेस करने के लिए, आपकोonNewIntent
कॉलबैक लागू करना होगा टैग के साथ जोड़ा जा सकता है.
public override fun onPause() {
super.onPause()
adapter.disableForegroundDispatch(this)
}
public override fun onResume() {
super.onResume()
adapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray)
}
public override fun onNewIntent(intent: Intent) {
val tagFromIntent: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)
// do something with tagFromIntent
}
public void onPause() {
super.onPause();
adapter.disableForegroundDispatch(this);
}
public void onResume() {
super.onResume();
adapter.enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);
}
public void onNewIntent(Intent intent) {
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
// do something with tagFromIntent
}