NFC সংক্রান্ত প্রাথমিক তথ্য

এই ডকুমেন্টে Android-এ আপনার করা প্রাথমিক NFC টাস্কের বিবরণ দেওয়া হয়েছে। NDEF মেসেজের আকারে কীভাবে NFC ডেটা পাঠাতে ও গ্রহণ করতে হয় তা এটি ব্যাখ্যা করে এবং এইসব ফিচারকে সাপোর্ট করে এমন Android ফ্রেমওয়ার্ক API-এর বর্ণনা দেয়। NDEF নয় এমন ডেটা নিয়ে কাজ করার আলোচনা সহ আরও উন্নত বিষয়ের জন্য, উন্নত NFC দেখুন।

NFC ট্যাগ থেকে NDEF ডেটা পড়ার কাজটি ট্যাগ ডিসপ্যাচ সিস্টেম-এর মাধ্যমে ম্যানেজ করা হয়, যা খুঁজে পাওয়া NFC ট্যাগ বিশ্লেষণ করে, ডেটা যথাযথভাবে বিভাগ অনুযায়ী সাজায় এবং বিভাগ অনুযায়ী সাজানো ডেটা ব্যবহার করতে আগ্রহী এমন অ্যাপ্লিকেশন চালু করে। স্ক্যান করা NFC ট্যাগ ম্যানেজ করতে চায় এমন কোনও অ্যাপ্লিকেশন ইনটেন্ট ফিল্টার ঘোষণা করতে এবং ডেটা ম্যানেজ করার অনুরোধ করতে পারে।

ট্যাগ ডিসপ্যাচ সিস্টেম

ডিভাইসের সেটিংস মেনু থেকে NFC বন্ধ করা না থাকলে, স্ক্রিন আনলক করা হলে Android-চালিত ডিভাইস সাধারণত NFC ট্যাগ খোঁজে। Android-চালিত ডিভাইস কোনও NFC ট্যাগ খুঁজে পেলে, ব্যবহারকারীকে কোন অ্যাপ্লিকেশন ব্যবহার করতে হবে তা জিজ্ঞাসা না করেই, সবচেয়ে উপযুক্ত অ্যাক্টিভিটি যাতে ইনটেন্ট ম্যানেজ করে, সেটিই হল কাঙ্ক্ষিত আচরণ। যেহেতু ডিভাইসগুলি খুব কম রেঞ্জে NFC ট্যাগ স্ক্যান করে, তাই ব্যবহারকারীদের ম্যানুয়ালি একটি অ্যাক্টিভিটি বেছে নিতে বাধ্য করলে, তারা ডিভাইসটিকে ট্যাগ থেকে দূরে সরিয়ে নিতে পারে এবং কানেকশন ভেঙে যেতে পারে। অ্যাক্টিভিটি বেছে নেওয়ার বিকল্প যাতে না দেখানো হয়, তার জন্য আপনার অ্যাক্টিভিটি এমনভাবে ডেভেলপ করা উচিত যাতে সেটি শুধু আপনার অ্যাক্টিভিটির জন্য প্রয়োজনীয় NFC ট্যাগ ম্যানেজ করে।

এই লক্ষ্যে আপনাকে সাহায্য করার জন্য, Android একটি বিশেষ ট্যাগ ডিসপ্যাচ সিস্টেম প্রদান করে যা স্ক্যান করা NFC ট্যাগ বিশ্লেষণ করে, সেগুলি পার্স করে এবং স্ক্যান করা ডেটায় আগ্রহী অ্যাপ্লিকেশনগুলি খুঁজে বের করার চেষ্টা করে। এটি এইভাবে কাজ করে:

  1. NFC ট্যাগ পার্স করা এবং MIME-এর ধরন বা URI খুঁজে বের করা যা ট্যাগে ডেটা পেলোড শনাক্ত করে।
  2. MIME-এর প্রকার বা URI এবং পেলোডকে একটি ইনটেন্টে এনক্যাপসুলেট করা। প্রথম দুটি ধাপ NFC ট্যাগ কীভাবে MIME-এর ধরন ও URI-তে ম্যাপ করা হয় নিবন্ধে বর্ণনা করা হয়েছে।
  3. উদ্দেশ্যের উপর ভিত্তি করে অ্যাক্টিভিটি শুরু করে। এটি অ্যাপ্লিকেশনে কীভাবে NFC ট্যাগ পাঠানো হয় নিবন্ধে বর্ণনা করা হয়েছে।

NFC ট্যাগ কীভাবে MIME-এর প্রকার ও URI-তে ম্যাপ করা হয়

NFC অ্যাপ্লিকেশন লেখা শুরু করার আগে, বিভিন্ন ধরনের NFC ট্যাগ, ট্যাগ ডিসপ্যাচ সিস্টেম কীভাবে NFC ট্যাগ পার্স করে এবং NDEF মেসেজ শনাক্ত করার সময় ট্যাগ ডিসপ্যাচ সিস্টেম যে বিশেষ কাজ করে তা বোঝা গুরুত্বপূর্ণ। NFC ট্যাগ বিভিন্ন ধরনের প্রযুক্তিতে পাওয়া যায় এবং এতে বিভিন্ন উপায়ে ডেটা লেখা থাকতে পারে। Android-এ NDEF স্ট্যান্ডার্ডের জন্য সবচেয়ে বেশি সহায়তা রয়েছে, যা NFC ফোরাম দ্বারা সংজ্ঞায়িত করা হয়েছে।

NDEF ডেটা একটি মেসেজের (NdefMessage) মধ্যে এনক্যাপসুলেট করা থাকে যাতে এক বা একাধিক রেকর্ড (NdefRecord) থাকে। আপনি যে ধরনের রেকর্ড তৈরি করতে চান তার স্পেসিফিকেশন অনুযায়ী প্রতিটি NDEF রেকর্ড সঠিকভাবে ফর্ম্যাট করা থাকতে হবে। এছাড়াও, Android অন্যান্য ধরনের ট্যাগ সাপোর্ট করে যেগুলিতে NDEF ডেটা থাকে না, আপনি android.nfc.tech প্যাকেজে ক্লাস ব্যবহার করে এগুলির সাথে কাজ করতে পারবেন। এইসব প্রযুক্তি সম্পর্কে আরও জানতে, উন্নত NFC বিষয় দেখুন। এই অন্যান্য ধরনের ট্যাগের সাথে কাজ করার মধ্যে ট্যাগের সাথে কমিউনিকেট করার জন্য আপনার নিজস্ব প্রোটোকল স্ট্যাক লেখা অন্তর্ভুক্ত, তাই আমরা ডেভেলপমেন্টের সুবিধা এবং Android-চালিত ডিভাইসের জন্য সর্বাধিক সাপোর্টের জন্য যখনই সম্ভব NDEF ব্যবহার করার সাজেশন দিই।

মনে রাখবেন: সম্পূর্ণ NDEF স্পেসিফিকেশন ডাউনলোড করতে, NFC ফোরাম স্পেসিফিকেশন ও অ্যাপ্লিকেশন ডকুমেন্ট সাইটে যান এবং NDEF রেকর্ড কীভাবে তৈরি করতে হয় তার উদাহরণ দেখতে সাধারণ ধরনের NDEF রেকর্ড তৈরি করা দেখুন।

NFC ট্যাগ সম্পর্কে আপনি এখন কিছু তথ্য জানেন, তাই নিম্নলিখিত বিভাগগুলি আরও বিশদে বর্ণনা করে যে কীভাবে Android, NDEF ফর্ম্যাট করা ট্যাগ ম্যানেজ করে। Android-পরিচালিত ডিভাইস NDEF ফর্ম্যাট করা ডেটা সহ NFC ট্যাগ স্ক্যান করলে, এটি মেসেজ পার্স করে এবং ডেটার MIME ধরন বা শনাক্তকরণ URI বোঝার চেষ্টা করে। এটি করার জন্য, সিস্টেম NdefMessage-এর মধ্যে প্রথম NdefRecord পড়ে যাতে সম্পূর্ণ NDEF মেসেজ কীভাবে ব্যাখ্যা করা যায় তা নির্ধারণ করা যায় (একটি NDEF মেসেজে একাধিক NDEF রেকর্ড থাকতে পারে)। একটি সুগঠিত NDEF মেসেজে, প্রথম NdefRecord-এ নিম্নলিখিত ফিল্ডগুলি থাকে:

৩-বিট TNF (টাইপ নেম ফর্ম্যাট)
ভেরিয়েবেল দৈর্ঘ্যের ধরন ফিল্ড কীভাবে ব্যাখ্যা করতে হবে তা নির্দেশ করে। সঠিক ভ্যালু টেবিল ১-এ বর্ণনা করা হয়েছে।
পরিবর্তনশীল দৈর্ঘ্যের ধরন
রেকর্ডের ধরন বর্ণনা করে। TNF_WELL_KNOWN ব্যবহার করলে, রেকর্ডের ধরন সংক্রান্ত সংজ্ঞা (RTD) নির্দিষ্ট করতে এই ফিল্ড ব্যবহার করুন। সারণী ২-এ সঠিক RTD ভ্যালু বর্ণনা করা হয়েছে।
পরিবর্তনশীল দৈর্ঘ্যের আইডি
রেকর্ডের জন্য অনন্য শনাক্তকারী। এই ফিল্ডটি প্রায়শই ব্যবহার করা হয় না, তবে আপনাকে যদি কোনও ট্যাগ অনন্যভাবে শনাক্ত করতে হয়, তাহলে আপনি এটির জন্য একটি আইডি তৈরি করতে পারেন।
পরিবর্তনশীল দৈর্ঘ্যের পেলোড
আপনি যে আসল ডেটা পেলোড পড়তে বা লিখতে চান। NDEF মেসেজে একাধিক NDEF রেকর্ড থাকতে পারে, তাই NDEF মেসেজের প্রথম NDEF রেকর্ডে সম্পূর্ণ পেলোড আছে বলে ধরে নেবেন না।

ট্যাগ ডিসপ্যাচ সিস্টেম, TNF এবং টাইপ ফিল্ড ব্যবহার করে MIME টাইপ বা URI-কে NDEF মেসেজে ম্যাপ করার চেষ্টা করে। এটি সফল হলে, আসল পেলোডের সাথে 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-তে ম্যাপ করে। ট্যাগ ডিসপ্যাচ সিস্টেম, পেলোডের মতো ট্যাগের অন্যান্য তথ্যের সাথে ACTION_NDEF_DISCOVERED ইনটেন্টের ডেটা ফিল্ডে সেই URI এনক্যাপসুলেট করে। অন্যদিকে, এটি TNF_UNKNOWN ধরনের রেকর্ড পেলে, ট্যাগের প্রযুক্তি এনক্যাপসুলেট করে এমন ইনটেন্ট তৈরি করে।

টেবিল ১. কাজ করে এমন TNF এবং সেগুলির ম্যাপিং

টাইপ নেম ফর্ম্যাট (TNF) ম্যাপিং
TNF_ABSOLUTE_URI URI, ধরন ফিল্ডের উপর ভিত্তি করে।
TNF_EMPTY ACTION_TECH_DISCOVERED-এ ফিরে যায়।
TNF_EXTERNAL_TYPE টাইপ ফিল্ডে URN-এর উপর ভিত্তি করে URI। URN-কে NDEF টাইপ ফিল্ডে সংক্ষিপ্ত আকারে এনকোড করা হয়: <domain_name>:<service_name>. Android এটিকে এই ফর্ম্যাটে URI-তে ম্যাপ করে: 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 রেকর্ড টাইপ ডেফিনিশন (RTD)-এর উপর নির্ভর করে MIME-এর প্রকার বা URI, যা আপনি টাইপ ফিল্ডে সেট করেন। উপলভ্য RTD এবং তাদের ম্যাপিং সম্পর্কে আরও তথ্যের জন্য সারণী ২ দেখুন।

টেবিল ২. TNF_WELL_KNOWN-এর জন্য কাজ করে এমন RTD এবং সেগুলির ম্যাপিং

রেকর্ড টাইপ ডেফিনেশন (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 পে-লোডের উপর ভিত্তি করে URI।

NFC ট্যাগ কীভাবে অ্যাপ্লিকেশনে পাঠানো হয়

ট্যাগ ডিসপ্যাচ সিস্টেম NFC ট্যাগ ও তার শনাক্তকরণ তথ্য এনক্যাপসুলেট করে এমন ইনটেন্ট তৈরি করা সম্পূর্ণ করলে, এটি ইনটেন্টটি এমন একটি আগ্রহী অ্যাপ্লিকেশনে পাঠায় যা ইনটেন্টের জন্য ফিল্টার করে। একাধিক অ্যাপ্লিকেশন ইনটেন্ট ম্যানেজ করতে পারলে, অ্যাক্টিভিটি বেছে নেওয়ার বিকল্প দেখানো হয় যাতে ব্যবহারকারী অ্যাক্টিভিটি বেছে নিতে পারেন। ট্যাগ ডিসপ্যাচ সিস্টেম তিনটি ইনটেন্ট সংজ্ঞায়িত করে, যেগুলি সর্বোচ্চ থেকে সর্বনিম্ন অগ্রাধিকারের ক্রমে তালিকাভুক্ত করা হয়েছে:

  1. ACTION_NDEF_DISCOVERED: NDEF পেলোড সহ কোনও ট্যাগ স্ক্যান করা হলে এবং সেটি শনাক্ত করা যায় এমন ধরনের হলে, অ্যাক্টিভিটি শুরু করার জন্য এই ইনটেন্ট ব্যবহার করা হয়। এটি হল সবচেয়ে বেশি অগ্রাধিকারের ইনটেন্ট এবং ট্যাগ ডিসপ্যাচ সিস্টেম যখনই সম্ভব অন্য যেকোনও ইনটেন্টের আগে এই ইনটেন্টের মাধ্যমে অ্যাক্টিভিটি শুরু করার চেষ্টা করে।

    মনে রাখবেন: Android 16 থেকে শুরু করে, ওয়েব লিঙ্ক স্টোর করে এমন NFC ট্যাগ স্ক্যান করলে (অর্থাৎ, URI স্কিম হল "http://" বা "https://") ACTION_NDEF_DISCOVERED ইনটেন্টের পরিবর্তে ACTION_VIEW ইনটেন্ট ট্রিগার হয়। Android 17 থেকে শুরু করে, এই ধরনের ট্যাগ স্ক্যান করলে "লিঙ্ক খুলুন" বিজ্ঞপ্তি দেখা যায়, যার জন্য ACTION_VIEW ইনটেন্ট ট্রিগার করতে ব্যবহারকারীর স্পষ্ট ইন্টার‍্যাকশন প্রয়োজন।

  2. ACTION_TECH_DISCOVERED: ACTION_NDEF_DISCOVERED ইনটেন্ট ম্যানেজ করার জন্য কোনও অ্যাক্টিভিটি রেজিস্টার করা না থাকলে, ট্যাগ ডিসপ্যাচ সিস্টেম এই ইনটেন্ট সহ কোনও অ্যাপ্লিকেশন চালু করার চেষ্টা করে। স্ক্যান করা ট্যাগে NDEF ডেটা থাকলে যা MIME-এর প্রকার বা URI-তে ম্যাপ করা যায় না অথবা ট্যাগে NDEF ডেটা না থাকলেও পরিচিত ট্যাগ টেকনোলজি হলে, এই ইনটেন্ট সরাসরি শুরু হয় (প্রথমে ACTION_NDEF_DISCOVERED শুরু না করেই)।
  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 ম্যানিফেস্টে NFC অ্যাক্সেসের অনুরোধ করুন

কোনও ডিভাইসের NFC হার্ডওয়্যার অ্যাক্সেস করা এবং NFC ইনটেন্ট সঠিকভাবে ম্যানেজ করার আগে, আপনার AndroidManifest.xml ফাইলে এইসব আইটেম ঘোষণা করুন:

  • NFC হার্ডওয়্যার অ্যাক্সেস করার জন্য NFC <uses-permission> এলিমেন্ট:
    <uses-permission android:name="android.permission.NFC" />
  • Android 17 (API লেভেল 37) থেকে শুরু করে, কোনও অ্যাক্টিভিটির জন্য 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 এলিমেন্ট যাতে আপনার অ্যাপ্লিকেশন Google Play-তে শুধুমাত্র NFC হার্ডওয়্যার আছে এমন ডিভাইসের জন্য দেখায়:
    <uses-feature android:name="android.hardware.nfc" android:required="true" />

    আপনার অ্যাপ্লিকেশন NFC কার্যকারিতা ব্যবহার করলে, কিন্তু সেই কার্যকারিতা আপনার অ্যাপ্লিকেশনের জন্য গুরুত্বপূর্ণ না হলে, আপনি uses-feature এলিমেন্ট বাদ দিতে পারেন এবং রানটাইমে NFC উপলভ্যতা চেক করতে পারেন, getDefaultAdapter() null কিনা তা চেক করে।

NFC ইনটেন্টের জন্য ফিল্টার

আপনি যে NFC ট্যাগ ম্যানেজ করতে চান সেটি স্ক্যান করার সময় আপনার অ্যাপ্লিকেশন চালু করতে, আপনার অ্যাপ্লিকেশন Android ম্যানিফেস্টে এক, দুই বা তিনটি NFC ইনটেন্টের সবকটি ফিল্টার করতে পারে। তবে, আপনার অ্যাপ্লিকেশন কখন শুরু হবে তার উপর সর্বাধিক নিয়ন্ত্রণের জন্য আপনি সাধারণত ACTION_NDEF_DISCOVERED ইনটেন্টের জন্য ফিল্টার করতে চান। ACTION_TECH_DISCOVERED ইন্টেন্ট হল ACTION_NDEF_DISCOVERED-এর জন্য ফলব্যাক যখন ACTION_NDEF_DISCOVERED-এর জন্য কোনও অ্যাপ্লিকেশন ফিল্টার থাকে না অথবা যখন পেলোড NDEF হয় না। ACTION_TAG_DISCOVERED-এর জন্য ফিল্টার করা সাধারণত ফিল্টার করার জন্য খুব সাধারণ একটি বিভাগ। অনেক অ্যাপ্লিকেশন ACTION_TAG_DISCOVERED-এর আগে ACTION_NDEF_DISCOVERED বা ACTION_TECH_DISCOVERED-এর জন্য ফিল্টার করবে, তাই আপনার অ্যাপ্লিকেশন শুরু হওয়ার সম্ভাবনা কম। ACTION_TAG_DISCOVERED শুধুমাত্র শেষ অবলম্বন হিসেবে উপলভ্য অ্যাপ্লিকেশনের জন্য ফিল্টার করার জন্য যেখানে অন্য কোনও অ্যাপ্লিকেশন ইনস্টল করা নেই ACTION_NDEF_DISCOVERED বা ACTION_TECH_DISCOVERED ইনটেন্ট।

NFC ট্যাগ ডিপ্লয়মেন্ট আলাদা আলাদা হয় এবং অনেক সময় আপনার নিয়ন্ত্রণে থাকে না, তাই এটি সবসময় সম্ভব হয় না, যার জন্য প্রয়োজন হলে আপনি অন্য দুটি ইনটেন্ট ব্যবহার করতে পারেন। ট্যাগের ধরন ও ডেটা লেখার উপর আপনার নিয়ন্ত্রণ থাকলে, ট্যাগ ফর্ম্যাট করার জন্য 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

আপনার অ্যাক্টিভিটি 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>

এছাড়াও, আপনি একাধিক tech-list সেট উল্লেখ করতে পারবেন। tech-list-এর প্রতিটি সেট স্বতন্ত্রভাবে বিবেচনা করা হয় এবং আপনার অ্যাক্টিভিটি ম্যাচ হিসেবে বিবেচনা করা হয় যদি কোনও একটি tech-list সেট getTechList()-এর মাধ্যমে রিটার্ন করা প্রযুক্তির একটি সাবসেট হয়। এটি ম্যাচিং প্রযুক্তির জন্য AND এবং OR সিম্যান্টিক্স প্রদান করে। নিম্নলিখিত উদাহরণটি এমন ট্যাগগুলির সাথে মেলে যা NfcA এবং Ndef প্রযুক্তি বা NfcB এবং Ndef প্রযুক্তিকে সমর্থন করতে পারে:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>
    <tech-list>
        <tech>android.nfc.tech.NfcB</tech>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>
</resources>

আপনার AndroidManifest.xml ফাইলে, আপনি এইমাত্র যে রিসোর্স ফাইলটি তৈরি করেছেন সেটি উল্লেখ করুন <meta-data> এলিমেন্টে <activity> এলিমেন্টের ভিতরে, যেমন নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

<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 ইনটেন্ট নিয়ে কাজ করার ব্যাপারে আরও তথ্যের জন্য, উন্নত NFC ডকুমেন্টে সমর্থিত ট্যাগ প্রযুক্তির সাথে কাজ করা দেখুন।

ACTION_TAG_DISCOVERED

মনে রাখবেন: ACTION_TAG_DISCOVERED Android 17 (API লেভেল ৩৭) থেকে শুরু করে বন্ধ করা হয়েছে। এর পরিবর্তে 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

Android 16 থেকে শুরু করে, ওয়েব লিঙ্ক স্টোর করে এমন NFC ট্যাগ স্ক্যান করলে (অর্থাৎ, URI স্কিম হল "http://" বা "https://") ACTION_NDEF_DISCOVERED ইনটেন্টের পরিবর্তে ACTION_VIEW ইনটেন্ট ট্রিগার হয়। Android 17 থেকে শুরু করে, এই ধরনের ট্যাগ স্ক্যান করলে "লিঙ্ক খুলুন" বিজ্ঞপ্তি দেখা যায়, যার জন্য ACTION_VIEW ইনটেন্ট ট্রিগার করতে ব্যবহারকারীর স্পষ্ট ইন্টার‍্যাকশন প্রয়োজন। ACTION_VIEW-এর জন্য ফিল্টার করতে, this দেখুন। URL-এর জন্য আপনার অ্যাপ খুলতে Android app links ব্যবহার করুন।

ইনটেন্ট থেকে তথ্য পাওয়া

NFC ইনটেন্টের কারণে কোনও অ্যাক্টিভিটি শুরু হলে, আপনি ইনটেন্ট থেকে স্ক্যান করা NFC ট্যাগ সম্পর্কে তথ্য পেতে পারেন। স্ক্যান করা ট্যাগের উপর নির্ভর করে ইনটেন্টে নিম্নলিখিত অতিরিক্ত তথ্য থাকতে পারে:

  • EXTRA_TAG (প্রয়োজনীয়): স্ক্যান করা ট্যাগকে প্রতিনিধিত্বকারী একটি Tag অবজেক্ট।
  • EXTRA_NDEF_MESSAGES (ঐচ্ছিক): ট্যাগ থেকে পার্স করা NDEF মেসেজের অ্যারে। ACTION_NDEF_DISCOVERED ইনটেন্টের ক্ষেত্রে এই অতিরিক্ত তথ্য বাধ্যতামূলক।
  • EXTRA_ID (ঐচ্ছিক): ট্যাগের লো-লেভেল আইডি।

এই অতিরিক্ত তথ্য পেতে, আপনার অ্যাক্টিভিটি NFC ইনটেন্টের মাধ্যমে চালু করা হয়েছে কিনা তা চেক করুন। এটি নিশ্চিত করে যে ট্যাগ স্ক্যান করা হয়েছে এবং তারপর ইনটেন্ট থেকে অতিরিক্ত তথ্য পাওয়া যায়। নিম্নলিখিত উদাহরণটি 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.
            ...
        }
    }
}

জাভা

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

জাভা

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

সাধারণ ধরনের NDEF রেকর্ড তৈরি করুন

NFC ট্যাগে লেখার সময় আপনাকে সাহায্য করার জন্য এই বিভাগে সাধারণ ধরনের NDEF রেকর্ড কীভাবে তৈরি করতে হয় তা বর্ণনা করা হয়েছে। Android 4.0 (API লেভেল 14) থেকে শুরু করে, createUri() পদ্ধতিটি আপনাকে অটোমেটিক URI রেকর্ড তৈরি করতে সাহায্য করার জন্য উপলভ্য। Android 4.1 (API লেভেল 16) থেকে শুরু করে, createExternal() এবং createMime() আপনাকে MIME এবং এক্সটার্নাল টাইপ NDEF রেকর্ড তৈরি করতে সাহায্য করার জন্য উপলভ্য। ম্যানুয়ালি NDEF রেকর্ড তৈরি করার সময় ভুল এড়াতে যখনই সম্ভব এইসব সহায়ক পদ্ধতি ব্যবহার করুন।

এছাড়াও, এই বিভাগে রেকর্ডের জন্য সংশ্লিষ্ট ইনটেন্ট ফিল্টার কীভাবে তৈরি করতে হয় তা বর্ণনা করা হয়েছে। এইসব NDEF রেকর্ডের উদাহরণ, আপনি ট্যাগে যে NDEF মেসেজ লিখছেন তার প্রথম NDEF রেকর্ডে থাকতে হবে।

TNF_ABSOLUTE_URI

মনে রাখবেন: আমরা সাজেস্ট করি যে আপনি TNF_ABSOLUTE_URI-এর পরিবর্তে RTD_URI টাইপ ব্যবহার করুন, কারণ এটি আরও দক্ষ।

আপনি নিম্নলিখিত উপায়ে TNF_ABSOLUTE_URI NDEF রেকর্ড তৈরি করতে পারবেন :

Kotlin

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() পদ্ধতি ব্যবহার করে:

Kotlin

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 তৈরি করা:

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

জাভা

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>

RTD_TEXT সহ TNF_WELL_KNOWN

আপনি নিম্নলিখিত উপায়ে TNF_WELL_KNOWN NDEF রেকর্ড তৈরি করতে পারবেন:

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

জাভা

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>

RTD_URI সহ TNF_WELL_KNOWN

আপনি নিম্নলিখিত উপায়ে TNF_WELL_KNOWN NDEF রেকর্ড তৈরি করতে পারবেন:

createUri(String) পদ্ধতি ব্যবহার করে:

Kotlin

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

জাভা

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

createUri(Uri) পদ্ধতি ব্যবহার করে:

Kotlin

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 তৈরি করা:

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)

জাভা

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() পদ্ধতি ব্যবহার করে:

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)

জাভা

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
)

জাভা

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>

Android-চালিত এবং Android-চালিত নয় এমন ডিভাইস, উভয়কেই আরও ভালভাবে সাপোর্ট করার জন্য আরও জেনেরিক NFC ট্যাগ ডিপ্লয়মেন্টের জন্য TNF_EXTERNAL_TYPE ব্যবহার করুন।

মনে রাখবেন: TNF_EXTERNAL_TYPE-এর URN-এর ক্যানোনিকাল ফর্ম্যাট হল: urn:nfc:ext:example.com:externalType, তবে NFC ফোরাম RTD স্পেসিফিকেশন ঘোষণা করে যে 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 URI-তে কনভার্ট করে, যা উদাহরণে ইনটেন্ট ফিল্টার ঘোষণা করে।

Android অ্যাপ্লিকেশন রেকর্ড

Android 4.0 (API লেভেল 14)-এ চালু করা, Android অ্যাপ্লিকেশন রেকর্ড (AAR) আরও বেশি নিশ্চয়তা প্রদান করে যে NFC ট্যাগ স্ক্যান করা হলে আপনার অ্যাপ্লিকেশন চালু হয়। AAR-এ NDEF রেকর্ডের মধ্যে এম্বেড করা অ্যাপ্লিকেশনের প্যাকেজের নাম থাকে। আপনার NDEF মেসেজের যেকোনও NDEF রেকর্ডে আপনি AAR যোগ করতে পারবেন, কারণ Android, AAR-এর জন্য সম্পূর্ণ NDEF মেসেজ সার্চ করে। এটি কোনও AAR খুঁজে পেলে, AAR-এর মধ্যে থাকা প্যাকেজের নামের ভিত্তিতে অ্যাপ্লিকেশন চালু করে। ডিভাইসে অ্যাপ্লিকেশনটি না থাকলে, অ্যাপ্লিকেশনটি ডাউনলোড করার জন্য Google Play চালু করা হয়।

আপনি যদি অন্যান্য অ্যাপ্লিকেশনকে একই ইনটেন্টের জন্য ফিল্টার করা থেকে আটকাতে চান এবং সম্ভাব্যভাবে আপনার ডিপ্লয় করা নির্দিষ্ট ট্যাগগুলি ম্যানেজ করতে চান, তাহলে AAR-এর ব্যবহার উপযোগী। প্যাকেজের নামের সীমাবদ্ধতার কারণে, AAR শুধুমাত্র অ্যাপ্লিকেশন লেভেলে কাজ করে, ইনটেন্ট ফিল্টারিংয়ের মতো অ্যাক্টিভিটি লেভেলে নয়। আপনি অ্যাক্টিভিটি লেভেলে ইনটেন্ট ম্যানেজ করতে চাইলে, ইনটেন্ট ফিল্টার ব্যবহার করুন।

কোনও ট্যাগে AAR থাকলে, ট্যাগ ডিসপ্যাচ সিস্টেম নিম্নলিখিত উপায়ে ডিসপ্যাচ করে:

  1. সাধারণভাবে ইনটেন্ট ফিল্টার ব্যবহার করে অ্যাক্টিভিটি শুরু করার চেষ্টা করুন। ইনটেন্টের সাথে ম্যাচ করা অ্যাক্টিভিটি AAR-এর সাথেও ম্যাচ করলে, অ্যাক্টিভিটি শুরু করুন।
  2. ইনটেন্টের জন্য ফিল্টার করা অ্যাক্টিভিটি যদি AAR-এর সাথে না মেলে, একাধিক অ্যাক্টিভিটি যদি ইনটেন্ট ম্যানেজ করতে পারে অথবা কোনও অ্যাক্টিভিটি যদি ইনটেন্ট ম্যানেজ না করে, তাহলে AAR-এর মাধ্যমে নির্দিষ্ট করা অ্যাপ্লিকেশন চালু করুন।
  3. AAR-এর মাধ্যমে কোনও অ্যাপ্লিকেশন শুরু করা না গেলে, Google Play-তে গিয়ে AAR-এর উপর ভিত্তি করে অ্যাপ্লিকেশন ডাউনলোড করুন।

মনে রাখবেন: আপনি ফোরগ্রাউন্ড ডিসপ্যাচ সিস্টেম-এর মাধ্যমে AAR এবং ইনটেন্ট ডিসপ্যাচ সিস্টেম ওভাররাইড করতে পারবেন, যা NFC ট্যাগ শনাক্ত করা হলে ফোরগ্রাউন্ড অ্যাক্টিভিটিকে অগ্রাধিকার দেয়। এই পদ্ধতিতে, AAR এবং ইনটেন্ট ডিসপ্যাচ সিস্টেম ওভাররাইড করার জন্য অ্যাক্টিভিটি অবশ্যই ফোরগ্রাউন্ডে থাকতে হবে।

আপনি যদি এখনও স্ক্যান করা ট্যাগগুলির জন্য ফিল্টার করতে চান যাতে কোনও AAR নেই, তাহলে আপনি ইনটেন্ট ফিল্টারগুলিকে স্বাভাবিক হিসাবে ঘোষণা করতে পারেন। আপনার অ্যাপ্লিকেশন যদি এমন অন্যান্য ট্যাগে আগ্রহী হয় যাতে কোনও AAR নেই, তাহলে এটি কাজে লাগে। যেমন, আপনি হয়ত নিশ্চিত করতে চান যে আপনার অ্যাপ্লিকেশন আপনার ডেপ্লয় করা মালিকানাধীন ট্যাগ এবং থার্ড-পার্টির ডেপ্লয় করা সাধারণ ট্যাগ ম্যানেজ করে। মনে রাখবেন যে AAR হল Android 4.0 বা তার পরবর্তী ভার্সনের ডিভাইসের জন্য নির্দিষ্ট, তাই ট্যাগ ডিপ্লয় করার সময়, আপনি সম্ভবত AAR এবং MIME প্রকার/URI-এর কম্বিনেশন ব্যবহার করতে চাইবেন যাতে সর্বাধিক সংখ্যক ডিভাইসে তা কাজ করে। এছাড়াও, NFC ট্যাগ ডিপ্লয় করার সময়, বেশিরভাগ ডিভাইসে (Android-চালিত এবং অন্যান্য ডিভাইস) যাতে কাজ করে সেই জন্য NFC ট্যাগ কীভাবে লিখবেন তা ভেবে দেখুন। আপনি এটি করতে পারেন তুলনামূলকভাবে অনন্য MIME-এর প্রকার বা URI সংজ্ঞায়িত করে যাতে অ্যাপ্লিকেশনগুলির পক্ষে পার্থক্য করা সহজ হয়।

AAR তৈরি করার জন্য Android একটি সহজ API প্রদান করে, createApplicationRecord()। আপনাকে শুধু NdefMessage-এর যেকোনও জায়গায় AAR এম্বেড করতে হবে। আপনি NdefMessage-এর প্রথম রেকর্ড ব্যবহার করতে চান না, যদি না AAR, NdefMessage-এর একমাত্র রেকর্ড হয়। কারণ, Android সিস্টেম NdefMessage-এর প্রথম রেকর্ড চেক করে ট্যাগের MIME-এর ধরন বা URI নির্ধারণ করে, যা অ্যাপ্লিকেশনের জন্য ফিল্টার করার ইনটেন্ট তৈরি করতে ব্যবহার করা হয়। নিচে দেওয়া কোড থেকে আপনি জানতে পারবেন কীভাবে AAR তৈরি করতে হয়:

Kotlin

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

জাভা

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

NFC ট্যাগ স্ক্যান করার জন্য অ্যাপের অনুমোদিত তালিকা

Android 16 থেকে, NFC ট্যাগ স্ক্যান করার জন্য কোনও অ্যাপ প্রথমবার NFC ইনটেন্ট পেলে ব্যবহারকারীদের জানানো হয়। বিজ্ঞপ্তিতে ব্যবহারকারীকে NFC ট্যাগ স্ক্যান করার জন্য অ্যাপকে আর অনুমতি না দেওয়ার বিকল্প প্রদান করা হয়।

  • ব্যবহারকারী NfcAdapter.isTagIntentAllowed() ব্যবহার করে NFC ট্যাগ স্ক্যান করার জন্য অ্যাপকে অনুমতি দিয়েছেন কিনা তা অ্যাপ চেক করতে পারে।
  • অ্যাপগুলি ইনটেন্ট পাঠিয়ে ব্যবহারকারীকে আবার NFC ট্যাগ স্ক্যান করার অনুমতি দেওয়ার জন্য প্রম্পট করতে পারে ACTION_CHANGE_TAG_INTENT_PREFERENCE।

মনে রাখবেন: NFC ট্যাগ স্ক্যান অ্যাপের অনুমোদিত তালিকা Settings > Apps > Special app access > Launch via NFC-এর অধীনে অ্যাক্সেস করা যাবে।

এই মেকানিজমটি ব্যবহারকারীদের উত্থাপিত উদ্বেগের সমাধান করার জন্য যোগ করা হয়েছে যেখানে কিছু অ্যাপ যা NFC ট্যাগ ইনটেন্টের জন্য ইনটেন্ট ফিল্টার রেজিস্টার করেছে, সেগুলি বারবার ফোরগ্রাউন্ডে আনা হয় যখন তারা ফোনটি একটি NFC ট্যাগের (ক্রেডিট কার্ড, অন্য ফোন/ঘড়ি ইত্যাদি) পাশে রাখে।