এই ডকুমেন্টটিতে অ্যান্ড্রয়েডে সম্পাদিত মৌলিক NFC কাজগুলো বর্ণনা করা হয়েছে। এতে NDEF মেসেজের আকারে কীভাবে NFC ডেটা পাঠানো ও গ্রহণ করা যায় তা ব্যাখ্যা করা হয়েছে এবং এই বৈশিষ্ট্যগুলোকে সমর্থনকারী অ্যান্ড্রয়েড ফ্রেমওয়ার্ক API-গুলো বর্ণনা করা হয়েছে। নন-NDEF ডেটা নিয়ে কাজ করার আলোচনা সহ আরও উন্নত বিষয়গুলোর জন্য, অ্যাডভান্সড NFC দেখুন।
Reading NDEF data from an NFC tag is handled with the tag dispatch system , which analyzes discovered NFC tags, appropriately categorizes the data, and starts an application that is interested in the categorized data. An application that wants to handle the scanned NFC tag can declare an intent filter and request to handle the data.
ট্যাগ প্রেরণ ব্যবস্থা
অ্যান্ড্রয়েড-চালিত ডিভাইসগুলো সাধারণত স্ক্রিন আনলক করার সময় এনএফসি ট্যাগ খোঁজে, যদি না ডিভাইসের সেটিংস মেনুতে এনএফসি নিষ্ক্রিয় করা থাকে। যখন একটি অ্যান্ড্রয়েড-চালিত ডিভাইস কোনো এনএফসি ট্যাগ খুঁজে পায়, তখন কাঙ্ক্ষিত আচরণ হলো ব্যবহারকারীকে কোন অ্যাপ্লিকেশন ব্যবহার করতে হবে তা জিজ্ঞাসা না করেই সবচেয়ে উপযুক্ত অ্যাক্টিভিটি দ্বারা সেই উদ্দেশ্যটি সম্পন্ন করা। যেহেতু ডিভাইসগুলো খুব অল্প পরিসরে এনএফসি ট্যাগ স্ক্যান করে, তাই ব্যবহারকারীদের ম্যানুয়ালি একটি অ্যাক্টিভিটি বেছে নিতে বাধ্য করলে তারা ডিভাইসটিকে ট্যাগ থেকে দূরে সরাতে বাধ্য হতে পারে এবং সংযোগটি বিচ্ছিন্ন হয়ে যেতে পারে। অ্যাক্টিভিটি চুজারের উপস্থিতি রোধ করতে, আপনার অ্যাক্টিভিটি এমনভাবে তৈরি করা উচিত যাতে এটি শুধুমাত্র সেই এনএফসি ট্যাগগুলোই পরিচালনা করে যা আপনার অ্যাক্টিভিটির জন্য প্রয়োজনীয়।
এই লক্ষ্য অর্জনে আপনাকে সাহায্য করার জন্য, অ্যান্ড্রয়েড একটি বিশেষ ট্যাগ প্রেরণ ব্যবস্থা প্রদান করে যা স্ক্যান করা এনএফসি ট্যাগগুলো বিশ্লেষণ করে, সেগুলোকে পার্স করে এবং স্ক্যান করা ডেটাতে আগ্রহী অ্যাপ্লিকেশনগুলো খুঁজে বের করার চেষ্টা করে। এটি নিম্নলিখিত উপায়ে এই কাজটি করে থাকে:
- NFC ট্যাগটি পার্স করে এর MIME টাইপ অথবা এমন একটি URI বের করা, যা ট্যাগের মধ্যে থাকা ডেটা পেলোডকে শনাক্ত করে।
- MIME টাইপ বা URI এবং পেলোডকে একটি ইন্টেন্টের মধ্যে আবদ্ধ করা। এই প্রথম দুটি ধাপ "NFC ট্যাগগুলি কীভাবে MIME টাইপ এবং URI-তে ম্যাপ করা হয়" অংশে বর্ণনা করা হয়েছে।
- অভিপ্রায়ের উপর ভিত্তি করে একটি কার্যকলাপ শুরু করে। কীভাবে এনএফসি ট্যাগ অ্যাপ্লিকেশনগুলিতে পাঠানো হয় , সেই অংশে এটি বর্ণনা করা হয়েছে।
কীভাবে NFC ট্যাগগুলিকে MIME টাইপ এবং URI-তে ম্যাপ করা হয়
আপনার NFC অ্যাপ্লিকেশন লেখা শুরু করার আগে, বিভিন্ন ধরণের NFC ট্যাগ, ট্যাগ ডিসপ্যাচ সিস্টেম কীভাবে NFC ট্যাগ পার্স করে এবং একটি NDEF মেসেজ শনাক্ত করলে ট্যাগ ডিসপ্যাচ সিস্টেম যে বিশেষ কাজটি করে, তা বোঝা গুরুত্বপূর্ণ। NFC ট্যাগ বিভিন্ন প্রযুক্তির হয়ে থাকে এবং এগুলিতে নানা উপায়ে ডেটাও লেখা যায়। অ্যান্ড্রয়েডে NDEF স্ট্যান্ডার্ডের জন্য সর্বাধিক সমর্থন রয়েছে, যা NFC ফোরাম দ্বারা সংজ্ঞায়িত।
NDEF ডেটা একটি মেসেজের ( NdefMessage ) মধ্যে আবদ্ধ থাকে, যেটিতে এক বা একাধিক রেকর্ড ( NdefRecord ) থাকে। প্রতিটি NDEF রেকর্ড অবশ্যই সেই ধরনের রেকর্ডের স্পেসিফিকেশন অনুযায়ী সুগঠিত হতে হবে, যা আপনি তৈরি করতে চান। অ্যান্ড্রয়েড অন্যান্য ধরনের ট্যাগও সমর্থন করে যেগুলোতে NDEF ডেটা থাকে না, এবং আপনি android.nfc.tech প্যাকেজের ক্লাসগুলো ব্যবহার করে সেগুলোর সাথে কাজ করতে পারেন। এই প্রযুক্তিগুলো সম্পর্কে আরও জানতে, অ্যাডভান্সড এনএফসি (Advanced NFC) টপিকটি দেখুন। এই অন্যান্য ধরনের ট্যাগগুলোর সাথে কাজ করার জন্য ট্যাগগুলোর সাথে যোগাযোগের উদ্দেশ্যে আপনার নিজস্ব প্রোটোকল স্ট্যাক লিখতে হয়, তাই আমরা ডেভেলপমেন্টের সুবিধার জন্য এবং অ্যান্ড্রয়েড-চালিত ডিভাইসগুলোর জন্য সর্বোচ্চ সমর্থনের জন্য যথাসম্ভব NDEF ব্যবহার করার পরামর্শ দিই।
Note: To download complete NDEF specifications, go to the NFC Forum Specifications & Application Documents site and see Creating common types of NDEF records for examples of how to construct NDEF records.
এখন যেহেতু আপনার এনএফসি ট্যাগ সম্পর্কে কিছুটা ধারণা হয়েছে, তাই পরবর্তী বিভাগগুলিতে অ্যান্ড্রয়েড কীভাবে NDEF ফরম্যাটের ট্যাগগুলি পরিচালনা করে তা আরও বিশদভাবে বর্ণনা করা হয়েছে। যখন একটি অ্যান্ড্রয়েড-চালিত ডিভাইস NDEF ফরম্যাটের ডেটাযুক্ত একটি এনএফসি ট্যাগ স্ক্যান করে, তখন এটি বার্তাটি পার্স করে এবং ডেটার MIME টাইপ বা শনাক্তকারী URI বের করার চেষ্টা করে। এটি করার জন্য, সিস্টেমটি সম্পূর্ণ NDEF বার্তাটিকে কীভাবে ব্যাখ্যা করবে তা নির্ধারণ করতে NdefMessage ভেতরের প্রথম NdefRecord পড়ে (একটি NDEF বার্তায় একাধিক NDEF রেকর্ড থাকতে পারে)। একটি সুগঠিত NDEF বার্তায়, প্রথম NdefRecord নিম্নলিখিত ফিল্ডগুলি থাকে:
- ৩-বিট টিএনএফ (টাইপ নেম ফরম্যাট)
- পরিবর্তনশীল দৈর্ঘ্যের টাইপ ফিল্ডটি কীভাবে ব্যাখ্যা করতে হবে তা নির্দেশ করে। বৈধ মানগুলো সারণি ১- এ বর্ণনা করা হয়েছে।
- পরিবর্তনশীল দৈর্ঘ্যের ধরণ
- রেকর্ডের ধরন বর্ণনা করে। যদি
TNF_WELL_KNOWNব্যবহার করা হয়, তাহলে রেকর্ড টাইপ ডেফিনিশন (RTD) নির্দিষ্ট করতে এই ফিল্ডটি ব্যবহার করুন। বৈধ RTD মানগুলো সারণি ২- এ বর্ণনা করা হয়েছে। - পরিবর্তনশীল দৈর্ঘ্যের আইডি
- রেকর্ডটির জন্য একটি অনন্য শনাক্তকারী। এই ফিল্ডটি সচরাচর ব্যবহৃত হয় না, কিন্তু কোনো ট্যাগকে অনন্যভাবে শনাক্ত করার প্রয়োজন হলে, আপনি এর জন্য একটি আইডি তৈরি করতে পারেন।
- পরিবর্তনশীল দৈর্ঘ্যের পেলোড
- প্রকৃত ডেটা পেলোড যা আপনি পড়তে বা লিখতে চান। একটি NDEF মেসেজে একাধিক NDEF রেকর্ড থাকতে পারে, তাই ধরে নেবেন না যে সম্পূর্ণ পেলোডটি NDEF মেসেজের প্রথম NDEF রেকর্ডেই রয়েছে।
ট্যাগ ডিসপ্যাচ সিস্টেমটি TNF এবং type ফিল্ড ব্যবহার করে NDEF মেসেজের সাথে একটি MIME টাইপ বা URI ম্যাপ করার চেষ্টা করে। সফল হলে, এটি প্রকৃত পেলোডের সাথে সেই তথ্যটিকে একটি ACTION_NDEF_DISCOVERED ইন্টেন্টের ভেতরে এনক্যাপসুলেট করে। তবে, এমন কিছু ক্ষেত্র রয়েছে যখন ট্যাগ ডিসপ্যাচ সিস্টেম প্রথম NDEF রেকর্ডের উপর ভিত্তি করে ডেটার ধরন নির্ধারণ করতে পারে না। এটি ঘটে যখন NDEF ডেটাকে কোনো MIME টাইপ বা URI-এর সাথে ম্যাপ করা যায় না, অথবা যখন NFC ট্যাগে শুরু থেকেই কোনো NDEF ডেটা থাকে না। এই ধরনের ক্ষেত্রে, ট্যাগের প্রযুক্তি এবং পেলোড সম্পর্কিত তথ্যসহ একটি Tag অবজেক্টকে এর পরিবর্তে একটি ACTION_TECH_DISCOVERED ইন্টেন্টের ভেতরে এনক্যাপসুলেট করা হয়।
সারণি ১-এ বর্ণনা করা হয়েছে কিভাবে ট্যাগ ডিসপ্যাচ সিস্টেম TNF এবং টাইপ ফিল্ডগুলিকে MIME টাইপ বা URI-তে ম্যাপ করে। এতে আরও বর্ণনা করা হয়েছে কোন TNF-গুলিকে কোনো MIME টাইপ বা URI-তে ম্যাপ করা যায় না। এইসব ক্ষেত্রে, ট্যাগ ডিসপ্যাচ সিস্টেম ACTION_TECH_DISCOVERED এ ফিরে যায়।
উদাহরণস্বরূপ, যদি ট্যাগ ডিসপ্যাচ সিস্টেম TNF_ABSOLUTE_URI টাইপের কোনো রেকর্ডের সম্মুখীন হয়, তবে এটি সেই রেকর্ডের পরিবর্তনশীল দৈর্ঘ্যের টাইপ ফিল্ডটিকে একটি URI-তে ম্যাপ করে। ট্যাগ ডিসপ্যাচ সিস্টেম সেই URI-টিকে একটি ACTION_NDEF_DISCOVERED ইন্টেন্টের ডেটা ফিল্ডে, ট্যাগ সম্পর্কিত অন্যান্য তথ্য, যেমন পেলোডের সাথে এনক্যাপসুলেট করে। অন্যদিকে, যদি এটি TNF_UNKNOWN টাইপের কোনো রেকর্ডের সম্মুখীন হয়, তবে এটি এমন একটি ইন্টেন্ট তৈরি করে যা ট্যাগের টেকনোলজিগুলোকে এনক্যাপসুলেট করে।
সারণি ১. সমর্থিত TNF-সমূহ এবং তাদের ম্যাপিং
| টাইপ নাম ফরম্যাট (টিএনএফ) | ম্যাপিং |
|---|---|
TNF_ABSOLUTE_URI | টাইপ ফিল্ডের উপর ভিত্তি করে URI। |
TNF_EMPTY | ACTION_TECH_DISCOVERED এ ফিরে যায়। |
TNF_EXTERNAL_TYPE | টাইপ ফিল্ডে থাকা URN-এর উপর ভিত্তি করে URI তৈরি হয়। URN-টি NDEF টাইপ ফিল্ডে একটি সংক্ষিপ্ত আকারে এনকোড করা হয়: <domain_name>:<service_name> । অ্যান্ড্রয়েড এটিকে vnd.android.nfc://ext/ <domain_name>:<service_name> ফর্ম্যাটের একটি URI-তে ম্যাপ করে। |
TNF_MIME_MEDIA | টাইপ ফিল্ডের উপর ভিত্তি করে MIME টাইপ। |
TNF_UNCHANGED | প্রথম রেকর্ডে অবৈধ হওয়ায়, ACTION_TECH_DISCOVERED এ ফিরে যাওয়া হচ্ছে। |
TNF_UNKNOWN | ACTION_TECH_DISCOVERED এ ফিরে যায়। |
TNF_WELL_KNOWN | রেকর্ড টাইপ ডেফিনিশন (RTD)-এর উপর নির্ভর করে MIME টাইপ বা URI নির্ধারিত হয়, যা আপনি টাইপ ফিল্ডে সেট করেন। উপলব্ধ RTD এবং তাদের ম্যাপিং সম্পর্কে আরও তথ্যের জন্য টেবিল ২ দেখুন। |
সারণি ২. 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 | পেলোড পার্সিংয়ের উপর ভিত্তি করে URI। |
RTD_TEXT | text/plain এর MIME টাইপ। |
RTD_URI | পেলোডের উপর ভিত্তি করে ইউআরআই। |
কীভাবে অ্যাপ্লিকেশনগুলিতে এনএফসি ট্যাগ পাঠানো হয়
ট্যাগ ডিসপ্যাচ সিস্টেমটি যখন এনএফসি ট্যাগ এবং এর শনাক্তকারী তথ্য সম্বলিত একটি ইন্টেন্ট তৈরি করা শেষ করে, তখন এটি সেই ইন্টেন্টটিকে একটি আগ্রহী অ্যাপ্লিকেশনের কাছে পাঠায়, যা ইন্টেন্টটি ফিল্টার করে। যদি একাধিক অ্যাপ্লিকেশন ইন্টেন্টটি পরিচালনা করতে পারে, তবে অ্যাক্টিভিটি চুজারটি প্রদর্শিত হয়, যাতে ব্যবহারকারী অ্যাক্টিভিটি নির্বাচন করতে পারেন। ট্যাগ ডিসপ্যাচ সিস্টেমটি তিনটি ইন্টেন্ট নির্ধারণ করে, যেগুলো সর্বোচ্চ থেকে সর্বনিম্ন অগ্রাধিকারের ক্রমানুসারে তালিকাভুক্ত থাকে:
-
ACTION_NDEF_DISCOVERED: যখন একটি NDEF পেলোড ধারণকারী ট্যাগ স্ক্যান করা হয় এবং সেটি একটি স্বীকৃত ধরনের হয়, তখন একটি অ্যাক্টিভিটি শুরু করার জন্য এই ইন্টেন্টটি ব্যবহৃত হয়। এটি সর্বোচ্চ অগ্রাধিকারের ইন্টেন্ট, এবং ট্যাগ ডিসপ্যাচ সিস্টেম যখনই সম্ভব, অন্য যেকোনো ইন্টেন্টের আগে এই ইন্টেন্ট দিয়ে একটি অ্যাক্টিভিটি শুরু করার চেষ্টা করে।দ্রষ্টব্য: অ্যান্ড্রয়েড ১৬ থেকে, যেসব NFC ট্যাগে URL লিঙ্ক সংরক্ষিত থাকে (যেমন URI স্কিম "htttps://" বা "http://"), সেগুলো স্ক্যান করলে
ACTION_NDEF_DISCOVEREDইন্টেন্টের পরিবর্তেACTION_VIEWইন্টেন্ট ট্রিগার হবে। -
ACTION_TECH_DISCOVERED: যদিACTION_NDEF_DISCOVEREDইন্টেন্টটি পরিচালনা করার জন্য কোনো অ্যাক্টিভিটি রেজিস্টার না করা হয়, তাহলে ট্যাগ ডিসপ্যাচ সিস্টেম এই ইন্টেন্টসহ একটি অ্যাপ্লিকেশন চালু করার চেষ্টা করে। এই ইন্টেন্টটি সরাসরিও চালু করা হয় (প্রথমেACTION_NDEF_DISCOVEREDচালু না করেই), যদি স্ক্যান করা ট্যাগটিতে এমন NDEF ডেটা থাকে যা কোনো MIME টাইপ বা URI-তে ম্যাপ করা যায় না, অথবা যদি ট্যাগটিতে 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 ইন্টেন্ট ব্যবহার করুন, কারণ এই তিনটির মধ্যে এটিই সবচেয়ে সুনির্দিষ্ট। এই ইন্টেন্টটি আপনাকে অন্য দুটি ইন্টেন্টের তুলনায় আরও উপযুক্ত সময়ে আপনার অ্যাপ্লিকেশনটি শুরু করার সুযোগ দেয়, যা ব্যবহারকারীকে আরও ভালো অভিজ্ঞতা প্রদান করে।
অ্যান্ড্রয়েড ম্যানিফেস্টে NFC অ্যাক্সেসের জন্য অনুরোধ করুন
কোনো ডিভাইসের NFC হার্ডওয়্যার অ্যাক্সেস করতে এবং NFC ইনটেন্টগুলো সঠিকভাবে পরিচালনা করার আগে, আপনার AndroidManifest.xml ফাইলে এই আইটেমগুলো ঘোষণা করুন:
- NFC হার্ডওয়্যার অ্যাক্সেস করার জন্য NFC
<uses-permission>এলিমেন্ট:<uses-permission android:name="android.permission.NFC" />
- অ্যান্ড্রয়েড ১৭ (এপিআই লেভেল ৩৭) থেকে, কোনো অ্যাক্টিভিটিতে NFC ইন্টেন্ট পাঠানোর জন্য, যদি অ্যাপটি SDK >
Build.VERSION_CODES.BAKLAVAটার্গেট করে, তবে সেটিকে অবশ্যইandroid.permission.DISPATCH_NFC_MESSAGEপারমিশন দ্বারা সুরক্ষিত থাকতে হবে। এটি নিশ্চিত করে যে শুধুমাত্র NFC সিস্টেম সার্ভিসই আপনার অ্যাক্টিভিটিতে ইন্টেন্ট পাঠাতে পারবে। এছাড়াও, সিস্টেম সেইসব অ্যাপ্লিকেশনে NFC ইন্টেন্ট পাঠাবে না যেগুলো বন্ধ অবস্থায় আছে (যেমন, যদি অ্যাপ্লিকেশনটি ব্যবহারকারী কখনো চালু না করে থাকেন বা ফোর্স-স্টপ করা হয়ে থাকে)।<activity android:name=".MyActivity" android:exported="true" android:permission="android.permission.DISPATCH_NFC_MESSAGE"> ... </activity>
- আপনার অ্যাপ্লিকেশনটি যে সর্বনিম্ন SDK সংস্করণটি সমর্থন করতে পারে। API লেভেল ৯ শুধুমাত্র
ACTION_TAG_DISCOVEREDএর মাধ্যমে সীমিত ট্যাগ ডিসপ্যাচ সমর্থন করে এবং শুধুমাত্রEXTRA_NDEF_MESSAGESএক্সট্রার মাধ্যমে NDEF মেসেজ অ্যাক্সেস করার সুযোগ দেয়। অন্য কোনো ট্যাগ প্রোপার্টি বা I/O অপারেশন অ্যাক্সেসযোগ্য নয়। API লেভেল ১০-এ ব্যাপক রিডার/রাইটার সমর্থনের পাশাপাশি ফোরগ্রাউন্ডে NDEF পুশিং অন্তর্ভুক্ত রয়েছে, এবং API লেভেল ১৪ NDEF রেকর্ড তৈরি করার জন্য অতিরিক্ত সুবিধাজনক মেথড প্রদান করে।<uses-sdk android:minSdkVersion="10"/> uses-featureএলিমেন্টটি ব্যবহার করুন, যাতে আপনার অ্যাপ্লিকেশনটি গুগল প্লে-তে শুধুমাত্র NFC হার্ডওয়্যারযুক্ত ডিভাইসগুলিতেই প্রদর্শিত হয়:<uses-feature android:name="android.hardware.nfc" android:required="true" />
যদি আপনার অ্যাপ্লিকেশনটি NFC কার্যকারিতা ব্যবহার করে, কিন্তু সেই কার্যকারিতাটি আপনার অ্যাপ্লিকেশনের জন্য অপরিহার্য না হয়, তাহলে আপনি
uses-featureএলিমেন্টটি বাদ দিতে পারেন এবং রানটাইমেgetDefaultAdapter()nullকিনা তা পরীক্ষা করে NFC-এর প্রাপ্যতা যাচাই করতে পারেন।
NFC ইন্টেন্টের জন্য ফিল্টার করুন
যখন আপনার কাঙ্ক্ষিত কোনো NFC ট্যাগ স্ক্যান করা হয়, তখন আপনার অ্যাপ্লিকেশনটি চালু করার জন্য, অ্যান্ড্রয়েড ম্যানিফেস্টে থাকা NFC ইন্টেন্টগুলোর মধ্যে একটি, দুটি বা তিনটিকেই ফিল্টার করতে পারেন। তবে, আপনার অ্যাপ্লিকেশনটি কখন চালু হবে তার উপর সর্বাধিক নিয়ন্ত্রণের জন্য আপনি সাধারণত ACTION_NDEF_DISCOVERED ইন্টেন্টটি ফিল্টার করতে চাইবেন। যখন কোনো অ্যাপ্লিকেশন ACTION_NDEF_DISCOVERED ফিল্টার করে না অথবা যখন পেলোডটি NDEF হয় না, তখন ACTION_TECH_DISCOVERED ইন্টেন্টটি ACTION_NDEF_DISCOVERED এর একটি ফলব্যাক হিসেবে কাজ করে। ACTION_TAG_DISCOVERED ফিল্টার করা সাধারণত ফিল্টার করার জন্য খুব বেশি সাধারণ একটি বিভাগ। অনেক অ্যাপ্লিকেশনই ACTION_NDEF_DISCOVERED এর আগে ACTION_TAG_DISCOVERED বা ACTION_TECH_DISCOVERED ফিল্টার করে, ফলে আপনার অ্যাপ্লিকেশনটি চালু হওয়ার সম্ভাবনা কম থাকে। ACTION_TAG_DISCOVERED শুধুমাত্র শেষ উপায় হিসেবে অ্যাপ্লিকেশনগুলোর ফিল্টার করার জন্য উপলব্ধ থাকে, সেইসব ক্ষেত্রে যেখানে ACTION_NDEF_DISCOVERED বা ACTION_TECH_DISCOVERED ইন্টেন্টটি পরিচালনা করার জন্য অন্য কোনো অ্যাপ্লিকেশন ইনস্টল করা থাকে না।
যেহেতু এনএফসি ট্যাগ স্থাপন বিভিন্ন রকম হয় এবং অনেক সময় তা আপনার নিয়ন্ত্রণের বাইরে থাকে, তাই এটি সবসময় সম্ভব হয় না। একারণেই প্রয়োজনে আপনি অন্য দুটি ইন্টেন্ট ব্যবহার করতে পারেন। যখন ট্যাগের ধরন এবং লিখিত ডেটার উপর আপনার নিয়ন্ত্রণ থাকে, তখন আপনার ট্যাগ ফরম্যাট করার জন্য NDEF ব্যবহার করার পরামর্শ দেওয়া হয়। নিম্নলিখিত বিভাগগুলিতে প্রতিটি ইন্টেন্টের ধরন অনুযায়ী ফিল্টার করার পদ্ধতি বর্ণনা করা হয়েছে।
ACTION_NDEF_DISCOVERED
ACTION_NDEF_DISCOVERED ইন্টেন্টগুলো ফিল্টার করার জন্য, আপনি যে ধরনের ডেটা ফিল্টার করতে চান তার সাথে ইন্টেন্ট ফিল্টারটি ডিক্লেয়ার করুন। নিচের উদাহরণটি text/plain MIME টাইপের ACTION_NDEF_DISCOVERED ইন্টেন্টগুলো ফিল্টার করে:
<activity android:name=".MyActivity" android:exported="true" android:permission="android.permission.DISPATCH_NFC_MESSAGE"> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeType="text/plain" /> </intent-filter> </activity>
নিম্নলিখিত উদাহরণটি https://developer.android.com/index.html এই ধরনের একটি URI-কে ফিল্টার করে।
<activity android:name=".MyActivity" android:exported="true" android:permission="android.permission.DISPATCH_NFC_MESSAGE"> <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> </activity>
অ্যাকশন_টেক_ডিসকভার্ড
যদি আপনার অ্যাক্টিভিটি ACTION_TECH_DISCOVERED ইন্টেন্টের জন্য ফিল্টার করে, তাহলে আপনাকে অবশ্যই একটি XML রিসোর্স ফাইল তৈরি করতে হবে যা একটি tech-list সেটের মধ্যে আপনার অ্যাক্টিভিটি দ্বারা সমর্থিত প্রযুক্তিগুলিকে নির্দিষ্ট করে। আপনার অ্যাক্টিভিটিকে একটি ম্যাচ হিসাবে বিবেচনা করা হবে যদি একটি tech-list সেট ট্যাগ দ্বারা সমর্থিত প্রযুক্তিগুলির একটি উপসেট হয়, যা আপনি getTechList() কল করে পেতে পারেন।
উদাহরণস্বরূপ, যদি স্ক্যান করা ট্যাগটি MifareClassic, 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>
You can also specify multiple tech-list sets. Each of the tech-list sets is considered independently, and your activity is considered a match if any single tech-list set is a subset of the technologies that are returned by getTechList() . This provides AND and OR semantics for matching technologies. The following example matches tags that can support the NfcA and Ndef technologies or can support the NfcB and Ndef technologies:
<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 android:name=".MyActivity" android:exported="true" android:permission="android.permission.DISPATCH_NFC_MESSAGE"> <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 ইন্টেন্ট নিয়ে কাজ করার বিষয়ে আরও তথ্যের জন্য, Advanced NFC ডকুমেন্টের Working with Supported Tag Technologies অংশটি দেখুন।
অ্যাকশন_ট্যাগ_আবিষ্কৃত
দ্রষ্টব্য: অ্যান্ড্রয়েড ১৭ (এপিআই লেভেল ৩৭) থেকে ACTION_TAG_DISCOVERED অপ্রচলিত হয়ে গেছে। এর পরিবর্তে ACTION_NDEF_DISCOVERED বা ACTION_TECH_DISCOVERED ব্যবহার করুন।
ACTION_TAG_DISCOVERED ফিল্টার করতে নিম্নলিখিত ইন্টেন্ট ফিল্টারটি ব্যবহার করুন:
<activity android:name=".MyActivity" android:exported="true" android:permission="android.permission.DISPATCH_NFC_MESSAGE"> <intent-filter> <action android:name="android.nfc.action.TAG_DISCOVERED"/> </intent-filter> </activity>
অ্যাকশন_ভিউ
অ্যান্ড্রয়েড ১৬ থেকে, যেসব এনএফসি ট্যাগে ইউআরএল লিঙ্ক সংরক্ষিত থাকে, সেগুলো স্ক্যান করলে ACTION_VIEW ইন্টেন্টটি ট্রিগার হবে। ACTION_VIEW ফিল্টার করার জন্য this দেখুন। ইউআরএল-এর জন্য আপনার অ্যাপটি খুলতে Android app links ব্যবহার করুন।
অভিপ্রায় থেকে তথ্য সংগ্রহ করুন
যদি কোনো NFC ইন্টেন্টের কারণে কোনো অ্যাক্টিভিটি শুরু হয়, তাহলে আপনি ইন্টেন্টটি থেকে স্ক্যান করা NFC ট্যাগ সম্পর্কে তথ্য পেতে পারেন। স্ক্যান করা ট্যাগের উপর নির্ভর করে ইন্টেন্টগুলোতে নিম্নলিখিত অতিরিক্ত বিষয়গুলো থাকতে পারে:
-
EXTRA_TAG(প্রয়োজনীয়): স্ক্যান করা ট্যাগটির প্রতিনিধিত্বকারী একটিTagঅবজেক্ট। -
EXTRA_NDEF_MESSAGES(ঐচ্ছিক): ট্যাগ থেকে পার্স করা NDEF মেসেজগুলোর একটি অ্যারে।ACTION_NDEF_DISCOVEREDইন্টেন্টগুলোর ক্ষেত্রে এই অতিরিক্ত অংশটি বাধ্যতামূলক। -
EXTRA_ID(ঐচ্ছিক): ট্যাগটির নিম্ন-স্তরের আইডি।
এই অতিরিক্ত ডেটাগুলো পেতে, আপনার অ্যাক্টিভিটিটি কোনো একটি NFC ইন্টেন্ট দিয়ে চালু করা হয়েছিল কিনা তা পরীক্ষা করে দেখুন, যাতে একটি ট্যাগ স্ক্যান করা হয়েছে তা নিশ্চিত করা যায়, এবং তারপর ইন্টেন্টটি থেকে অতিরিক্ত ডেটাগুলো সংগ্রহ করুন। নিম্নলিখিত উদাহরণটি ACTION_NDEF_DISCOVERED ইন্টেন্টটি পরীক্ষা করে এবং একটি ইন্টেন্ট এক্সট্রা থেকে NDEF মেসেজগুলো সংগ্রহ করে।
কোটলিন
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. ... } } }
জাভা
@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 অবজেক্ট পেতে পারেন, যেটিতে পেলোড থাকবে এবং যা আপনাকে ট্যাগটির প্রযুক্তিগুলো গণনা করার সুযোগ দেবে:
কোটলিন
val tag: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)
জাভা
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
সাধারণ ধরনের NDEF রেকর্ড তৈরি করুন
এই বিভাগে সাধারণ ধরনের NDEF রেকর্ড তৈরি করার পদ্ধতি বর্ণনা করা হয়েছে, যা আপনাকে NFC ট্যাগে লেখার সময় সাহায্য করবে। Android 4.0 (API লেভেল 14) থেকে, URI রেকর্ড স্বয়ংক্রিয়ভাবে তৈরি করার জন্য createUri() মেথডটি উপলব্ধ রয়েছে। Android 4.1 (API লেভেল 16) থেকে, MIME এবং এক্সটার্নাল টাইপের NDEF রেকর্ড তৈরি করার জন্য createExternal() এবং createMime() মেথডগুলো উপলব্ধ রয়েছে। ম্যানুয়ালি NDEF রেকর্ড তৈরি করার সময় ভুল এড়াতে, যখনই সম্ভব এই সহায়ক মেথডগুলো ব্যবহার করুন।
এই বিভাগে রেকর্ডের জন্য সংশ্লিষ্ট ইন্টেন্ট ফিল্টার কীভাবে তৈরি করতে হয়, তাও বর্ণনা করা হয়েছে। এই সমস্ত NDEF রেকর্ডের উদাহরণগুলো সেই NDEF মেসেজের প্রথম NDEF রেকর্ডে থাকা উচিত, যা আপনি কোনো ট্যাগে লিখছেন।
TNF_ABSOLUTE_URI
দ্রষ্টব্য: আমরা আপনাকে TNF_ABSOLUTE_URI এর পরিবর্তে RTD_URI টাইপ ব্যবহার করার পরামর্শ দিই, কারণ এটি আরও বেশি কার্যকর।
আপনি নিম্নলিখিত উপায়ে একটি TNF_ABSOLUTE_URI NDEF রেকর্ড তৈরি করতে পারেন:
কোটলিন
val uriRecord = ByteArray(0).let { emptyByteArray -> NdefRecord( TNF_ABSOLUTE_URI, "https://developer.android.com/index.html".toByteArray(Charset.forName("US-ASCII")), emptyByteArray, emptyByteArray ) }
জাভা
NdefRecord uriRecord = new NdefRecord( NdefRecord.TNF_ABSOLUTE_URI , "https://developer.android.com/index.html".getBytes(Charset.forName("US-ASCII")), new byte[0], new byte[0]);
পূর্ববর্তী NDEF রেকর্ডের জন্য ইন্টেন্ট ফিল্টারটি দেখতে এইরকম হবে:
<activity android:name=".MyActivity" android:exported="true" android:permission="android.permission.DISPATCH_NFC_MESSAGE"> <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> </activity>
TNF_MIME_MEDIA
আপনি নিম্নলিখিত উপায়ে একটি TNF_MIME_MEDIA NDEF রেকর্ড তৈরি করতে পারেন:
createMime() মেথড ব্যবহার করে:
কোটলিন
val mimeRecord = NdefRecord.createMime( "application/vnd.com.example.android.beam", "Beam me up, Android".toByteArray(Charset.forName("US-ASCII")) )
জাভা
NdefRecord mimeRecord = NdefRecord.createMime("application/vnd.com.example.android.beam", "Beam me up, Android".getBytes(Charset.forName("US-ASCII")));
ম্যানুয়ালি NdefRecord তৈরি করা:
কোটলিন
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) ) }
জাভা
NdefRecord mimeRecord = new NdefRecord( NdefRecord.TNF_MIME_MEDIA , "application/vnd.com.example.android.beam".getBytes(Charset.forName("US-ASCII")), new byte[0], "Beam me up, Android!".getBytes(Charset.forName("US-ASCII")));
পূর্ববর্তী NDEF রেকর্ডের জন্য ইন্টেন্ট ফিল্টারটি দেখতে এইরকম হবে:
<activity android:name=".MyActivity" android:exported="true" android:permission="android.permission.DISPATCH_NFC_MESSAGE"> <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> </activity>
TNF_WELL_KNOWN with RTD_TEXT
আপনি নিম্নলিখিত উপায়ে একটি TNF_WELL_KNOWN NDEF রেকর্ড তৈরি করতে পারেন:
কোটলিন
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) }
জাভা
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; }
পূর্ববর্তী NDEF রেকর্ডের জন্য ইন্টেন্ট ফিল্টারটি দেখতে এইরকম হবে:
<activity android:name=".MyActivity" android:exported="true" android:permission="android.permission.DISPATCH_NFC_MESSAGE"> <intent-filter> <action android:name="android.nfc.action.NDEF_DISCOVERED" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> </activity>
TNF_WELL_KNOWN with RTD_URI
আপনি নিম্নলিখিত উপায়ে একটি TNF_WELL_KNOWN NDEF রেকর্ড তৈরি করতে পারেন:
createUri(String) মেথড ব্যবহার করে:
কোটলিন
val rtdUriRecord1 = NdefRecord.createUri("https://example.com")
জাভা
NdefRecord rtdUriRecord1 = NdefRecord.createUri("https://example.com");
createUri(Uri) মেথড ব্যবহার করে:
কোটলিন
val rtdUriRecord2 = Uri.parse("https://example.com").let { uri -> NdefRecord.createUri(uri) }
জাভা
Uri uri = Uri.parse("https://example.com"); NdefRecord rtdUriRecord2 = NdefRecord.createUri(uri);
ম্যানুয়ালি NdefRecord তৈরি করা:
কোটলিন
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)
জাভা
byte[] uriField = "example.com".getBytes(Charset.forName("US-ASCII")); byte[] payload = new byte[uriField.length + 1]; //add 1 for the URI Prefix payload[0] = 0x01; //prefixes https://www. to the URI System.arraycopy(uriField, 0, payload, 1, uriField.length); //appends URI to payload NdefRecord rtdUriRecord = new NdefRecord( NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_URI, new byte[0], payload);
পূর্ববর্তী NDEF রেকর্ডের জন্য ইন্টেন্ট ফিল্টারটি দেখতে এইরকম হবে:
<activity android:name=".MyActivity" android:exported="true" android:permission="android.permission.DISPATCH_NFC_MESSAGE"> <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> </activity>
TNF_EXTERNAL_TYPE
আপনি নিম্নলিখিত উপায়ে একটি TNF_EXTERNAL_TYPE NDEF রেকর্ড তৈরি করতে পারেন:
createExternal() মেথড ব্যবহার করে:
কোটলিন
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)
জাভা
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 তৈরি করা:
কোটলিন
var payload: ByteArray ... val extRecord = NdefRecord( NdefRecord.TNF_EXTERNAL_TYPE, "com.example:externalType".toByteArray(Charset.forName("US-ASCII")), ByteArray(0), payload )
জাভা
byte[] payload; ... NdefRecord extRecord = new NdefRecord( NdefRecord.TNF_EXTERNAL_TYPE, "com.example:externalType".getBytes(Charset.forName("US-ASCII")), new byte[0], payload);
পূর্ববর্তী NDEF রেকর্ডের জন্য ইন্টেন্ট ফিল্টারটি দেখতে এইরকম হবে:
<activity android:name=".MyActivity" android:exported="true" android:permission="android.permission.DISPATCH_NFC_MESSAGE"> <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> </activity>
অ্যান্ড্রয়েড-চালিত এবং নন-অ্যান্ড্রয়েড-চালিত উভয় ডিভাইসকে আরও ভালোভাবে সমর্থন করার জন্য, আরও সাধারণ NFC ট্যাগ স্থাপনের ক্ষেত্রে TNF_EXTERNAL_TYPE ব্যবহার করুন।
Note : URNs for TNF_EXTERNAL_TYPE have a canonical format of: urn:nfc:ext:example.com:externalType , however the NFC Forum RTD specification declares that the urn:nfc:ext: portion of the URN must be omitted from the NDEF record. So all you need to provide is the domain ( example.com in the example) and type ( externalType in the example) separated by a colon. When dispatching TNF_EXTERNAL_TYPE , Android converts the urn:nfc:ext:example.com:externalType URN to a vnd.android.nfc://ext/example.com:externalType URI, which is what the intent filter in the example declares.
অ্যান্ড্রয়েড অ্যাপ্লিকেশন রেকর্ড
অ্যান্ড্রয়েড ৪.০ (এপিআই লেভেল ১৪)-এ প্রবর্তিত অ্যান্ড্রয়েড অ্যাপ্লিকেশন রেকর্ড (AAR) এই বিষয়টি আরও জোরালোভাবে নিশ্চিত করে যে, যখন একটি এনএফসি ট্যাগ স্ক্যান করা হয়, তখন আপনার অ্যাপ্লিকেশনটি চালু হয়। একটি AAR-এর মধ্যে একটি NDEF রেকর্ডের ভেতরে অ্যাপ্লিকেশনটির প্যাকেজ নেম এমবেড করা থাকে। আপনি আপনার NDEF মেসেজের যেকোনো NDEF রেকর্ডে একটি AAR যোগ করতে পারেন, কারণ অ্যান্ড্রয়েড পুরো NDEF মেসেজ জুড়ে AAR-এর সন্ধান করে। যদি এটি কোনো AAR খুঁজে পায়, তবে এটি AAR-এর ভেতরের প্যাকেজ নেমের উপর ভিত্তি করে অ্যাপ্লিকেশনটি চালু করে। যদি অ্যাপ্লিকেশনটি ডিভাইসে উপস্থিত না থাকে, তবে অ্যাপ্লিকেশনটি ডাউনলোড করার জন্য গুগল প্লে চালু করা হয়।
আপনি যদি অন্য অ্যাপ্লিকেশনগুলিকে একই ইন্টেন্ট ফিল্টার করা এবং আপনার স্থাপন করা নির্দিষ্ট ট্যাগগুলি পরিচালনা করা থেকে আটকাতে চান, তাহলে AAR কার্যকর। প্যাকেজ নামের সীমাবদ্ধতার কারণে, AAR শুধুমাত্র অ্যাপ্লিকেশন স্তরে সমর্থিত, ইন্টেন্ট ফিল্টারিংয়ের মতো অ্যাক্টিভিটি স্তরে নয়। আপনি যদি অ্যাক্টিভিটি স্তরে কোনো ইন্টেন্ট পরিচালনা করতে চান, তাহলে ইন্টেন্ট ফিল্টার ব্যবহার করুন ।
যদি কোনো ট্যাগে একটি AAR থাকে, তাহলে ট্যাগ প্রেরণ সিস্টেমটি নিম্নলিখিত পদ্ধতিতে তা প্রেরণ করে:
- স্বাভাবিকভাবে একটি ইন্টেন্ট ফিল্টার ব্যবহার করে একটি অ্যাক্টিভিটি শুরু করার চেষ্টা করুন। যদি ইন্টেন্টের সাথে মেলে এমন অ্যাক্টিভিটিটি AAR-এর সাথেও মেলে, তাহলে অ্যাক্টিভিটিটি শুরু করুন।
- যদি ইন্টেন্ট ফিল্টারকারী অ্যাক্টিভিটিটি AAR-এর সাথে না মেলে, যদি একাধিক অ্যাক্টিভিটি ইন্টেন্টটি পরিচালনা করতে পারে, অথবা যদি কোনো অ্যাক্টিভিটিই ইন্টেন্টটি পরিচালনা না করে, তাহলে AAR দ্বারা নির্দিষ্ট অ্যাপ্লিকেশনটি চালু করুন।
- যদি AAR দিয়ে কোনো অ্যাপ্লিকেশন চালু করা না যায়, তাহলে Google Play থেকে AAR-ভিত্তিক অ্যাপ্লিকেশনটি ডাউনলোড করুন।
দ্রষ্টব্য: আপনি ফোরগ্রাউন্ড ডিসপ্যাচ সিস্টেম ব্যবহার করে AAR এবং ইনটেন্ট ডিসপ্যাচ সিস্টেমকে ওভাররাইড করতে পারেন, যা একটি NFC ট্যাগ আবিষ্কৃত হলে ফোরগ্রাউন্ড অ্যাক্টিভিটিকে অগ্রাধিকার দেয়। এই পদ্ধতিতে, AAR এবং ইনটেন্ট ডিসপ্যাচ সিস্টেমকে ওভাররাইড করার জন্য অ্যাক্টিভিটিটিকে অবশ্যই ফোরগ্রাউন্ডে থাকতে হবে।
যদি আপনি এখনও এমন স্ক্যান করা ট্যাগ ফিল্টার করতে চান যেগুলিতে AAR নেই, তাহলে আপনি স্বাভাবিকভাবে ইন্টেন্ট ফিল্টার ঘোষণা করতে পারেন। এটি তখন কাজে আসে যখন আপনার অ্যাপ্লিকেশনটি এমন অন্যান্য ট্যাগের প্রতি আগ্রহী হয় যেগুলিতে AAR নেই। উদাহরণস্বরূপ, হয়তো আপনি নিশ্চিত করতে চান যে আপনার অ্যাপ্লিকেশনটি আপনার দ্বারা ব্যবহৃত প্রোপ্রাইটারি ট্যাগ এবং তৃতীয় পক্ষের দ্বারা ব্যবহৃত সাধারণ ট্যাগ উভয়ই পরিচালনা করতে পারে। মনে রাখবেন যে AAR শুধুমাত্র Android 4.0 বা তার পরবর্তী সংস্করণের ডিভাইসের জন্য নির্দিষ্ট, তাই ট্যাগ স্থাপন করার সময়, সর্বাধিক সংখ্যক ডিভাইস সমর্থন করার জন্য আপনি সম্ভবত AAR এবং MIME টাইপ/URI-এর একটি সংমিশ্রণ ব্যবহার করতে চাইবেন। এছাড়াও, যখন আপনি NFC ট্যাগ স্থাপন করবেন, তখন ভাবুন কীভাবে আপনি আপনার NFC ট্যাগগুলি লিখবেন যাতে সর্বাধিক সংখ্যক ডিভাইস (অ্যান্ড্রয়েড-চালিত এবং অন্যান্য ডিভাইস) সমর্থন করতে পারেন। আপনি একটি তুলনামূলকভাবে অনন্য MIME টাইপ বা URI সংজ্ঞায়িত করে এটি করতে পারেন, যা অ্যাপ্লিকেশনগুলির জন্য পার্থক্য করা সহজ করে তুলবে।
অ্যান্ড্রয়েড একটি AAR তৈরি করার জন্য একটি সহজ API, createApplicationRecord() প্রদান করে। আপনাকে শুধু আপনার NdefMessage এর যেকোনো জায়গায় AAR-টি এমবেড করতে হবে। আপনি আপনার NdefMessage এর প্রথম রেকর্ডটি ব্যবহার করতে চাইবেন না, যদি না AAR-টিই NdefMessage এর একমাত্র রেকর্ড হয়। এর কারণ হলো, অ্যান্ড্রয়েড সিস্টেম একটি NdefMessage এর প্রথম রেকর্ডটি পরীক্ষা করে ট্যাগটির MIME টাইপ বা URI নির্ধারণ করে, যা অ্যাপ্লিকেশনগুলোর ফিল্টার করার জন্য একটি ইন্টেন্ট তৈরি করতে ব্যবহৃত হয়। নিচের কোডটি আপনাকে দেখাবে কীভাবে একটি AAR তৈরি করতে হয়:
কোটলিন
val msg = NdefMessage( arrayOf( ..., NdefRecord.createApplicationRecord("com.example.android.beam") ) )
জাভা
NdefMessage msg = new NdefMessage( new NdefRecord[] { ..., NdefRecord.createApplicationRecord("com.example.android.beam")} ); )
এনএফসি ট্যাগ স্ক্যানিংয়ের জন্য অ্যাপ অনুমোদিত তালিকা
অ্যান্ড্রয়েড ১৬ থেকে, কোনো অ্যাপ যখন এনএফসি ট্যাগ স্ক্যান করার জন্য প্রথমবারের মতো এনএফসি ইন্টেন্ট পায়, তখন ব্যবহারকারীকে জানানো হয়। এই নোটিফিকেশনে ব্যবহারকারীকে অ্যাপটিকে পরবর্তীতে এনএফসি ট্যাগ স্ক্যান করা থেকে বিরত রাখার বিকল্পও দেওয়া হয়।
-
NfcAdapter.isTagIntentAllowed()ব্যবহার করে অ্যাপগুলো যাচাই করতে পারে যে ব্যবহারকারী অ্যাপটিকে NFC ট্যাগ স্ক্যান করার অনুমতি দিয়েছে কিনা। - অ্যাপগুলো
ACTION_CHANGE_TAG_INTENT_PREFERENCEইন্টেন্টটি পাঠিয়ে ব্যবহারকারীকে এনএফসি ট্যাগ স্ক্যান করার অনুমতি পুনরায় দিতে অনুরোধ করতে পারে।
দ্রষ্টব্য: NFC ট্যাগ স্ক্যান অ্যাপের অনুমতি তালিকাটি Settings > Apps > Special app access > Launch via NFC অধীনে পাওয়া যাবে।