NFC বেসিক

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

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

ট্যাগ প্রেরণ সিস্টেম

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

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

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

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

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

ট্যাগ ডিসপ্যাচ সিস্টেম এনডিইএফ বার্তায় একটি MIME প্রকার বা URI ম্যাপ করার চেষ্টা করার জন্য TNF এবং টাইপ ক্ষেত্র ব্যবহার করে। সফল হলে, এটি প্রকৃত পেলোড সহ একটি ACTION_NDEF_DISCOVERED অভিপ্রায়ের ভিতরে সেই তথ্যগুলিকে অন্তর্ভুক্ত করে৷ যাইহোক, এমন কিছু ক্ষেত্রে আছে যখন ট্যাগ ডিসপ্যাচ সিস্টেম প্রথম NDEF রেকর্ডের উপর ভিত্তি করে ডেটার ধরন নির্ধারণ করতে পারে না। এটি ঘটে যখন NDEF ডেটা একটি MIME প্রকার বা URI-তে ম্যাপ করা যায় না, বা যখন NFC ট্যাগে শুরু করার জন্য NDEF ডেটা থাকে না। এই ধরনের ক্ষেত্রে, ট্যাগের প্রযুক্তি এবং পেলোড সম্পর্কে তথ্য আছে এমন একটি Tag অবজেক্ট এর পরিবর্তে একটি ACTION_TECH_DISCOVERED উদ্দেশ্যের ভিতরে এনক্যাপসুলেট করা হয়।

সারণী 1 বর্ণনা করে কিভাবে ট্যাগ ডিসপ্যাচ সিস্টেম TNF ম্যাপ করে এবং ক্ষেত্রগুলিকে MIME প্রকার বা URI-তে টাইপ করে। এটি বর্ণনা করে যে কোন TNFগুলিকে একটি MIME প্রকার বা URI-তে ম্যাপ করা যাবে না৷ এই ক্ষেত্রে, ট্যাগ ডিসপ্যাচ সিস্টেম ACTION_TECH_DISCOVERED এ ফিরে আসে।

উদাহরণস্বরূপ, যদি ট্যাগ ডিসপ্যাচ সিস্টেমটি TNF_ABSOLUTE_URI টাইপের একটি রেকর্ডের সম্মুখীন হয়, তাহলে এটি সেই রেকর্ডের পরিবর্তনশীল দৈর্ঘ্যের ক্ষেত্রটিকে একটি URI-তে ম্যাপ করে। ট্যাগ ডিসপ্যাচ সিস্টেম একটি ACTION_NDEF_DISCOVERED উদ্দেশ্যের ডেটা ক্ষেত্রে সেই URIকে ট্যাগ সম্পর্কিত অন্যান্য তথ্যের সাথে অন্তর্ভুক্ত করে, যেমন পেলোড। অন্যদিকে, যদি এটি TNF_UNKNOWN টাইপের একটি রেকর্ডের সম্মুখীন হয়, তবে এটি একটি উদ্দেশ্য তৈরি করে যা ট্যাগের প্রযুক্তিগুলিকে এনক্যাপসুলেট করে।

সারণি 1. সমর্থিত TNF এবং তাদের ম্যাপিং

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

সারণি 2. 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 পেলোড পার্স করার উপর ভিত্তি করে ইউআরআই।
RTD_TEXT MIME ধরনের text/plain
RTD_URI পেলোডের উপর ভিত্তি করে ইউআরআই।

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

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

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

    দ্রষ্টব্য: Android 16 শুরু করে, NFC ট্যাগগুলি স্ক্যান করা যা URL লিঙ্কগুলিকে সংরক্ষণ করে (যেমন URI স্কিম হল "httttps://" বা "http://") ACTION_NDEF_DISCOVERED অভিপ্রায়ের পরিবর্তে ACTION_VIEW অভিপ্রায় ট্রিগার করবে৷

  2. ACTION_TECH_DISCOVERED : ACTION_NDEF_DISCOVERED অভিপ্রায় পরিচালনা করার জন্য যদি কোনো কার্যক্রম নিবন্ধিত না হয়, ট্যাগ প্রেরণ সিস্টেম এই অভিপ্রায় দিয়ে একটি অ্যাপ্লিকেশন শুরু করার চেষ্টা করে। এই অভিপ্রায়টি সরাসরি শুরু হয় (প্রথমে ACTION_NDEF_DISCOVERED শুরু না করে) যদি স্ক্যান করা ট্যাগটিতে NDEF ডেটা থাকে যা একটি MIME প্রকার বা URI-তে ম্যাপ করা যায় না, অথবা যদি ট্যাগটিতে NDEF ডেটা না থাকে তবে এটি একটি পরিচিত ট্যাগ প্রযুক্তির।
  3. ACTION_TAG_DISCOVERED : এই অভিপ্রায় শুরু হয় যদি কোনো ক্রিয়াকলাপ ACTION_NDEF_DISCOVERED বা ACTION_TECH_DISCOVERED উদ্দেশ্যগুলি পরিচালনা না করে৷

ট্যাগ ডিসপ্যাচ সিস্টেমের কাজ করার প্রাথমিক উপায় নিম্নরূপ:

  1. NFC ট্যাগ (হয় ACTION_NDEF_DISCOVERED বা ACTION_TECH_DISCOVERED ) পার্স করার সময় ট্যাগ ডিসপ্যাচ সিস্টেম দ্বারা তৈরি করা অভিপ্রায়ে একটি কার্যকলাপ শুরু করার চেষ্টা করুন।
  2. যদি কোনও অ্যাক্টিভিটি সেই অভিপ্রায়ের জন্য ফিল্টার না করে, তাহলে পরবর্তী সর্বনিম্ন অগ্রাধিকারের অভিপ্রায় (হয় ACTION_TECH_DISCOVERED বা ACTION_TAG_DISCOVERED ) দিয়ে একটি অ্যাক্টিভিটি শুরু করার চেষ্টা করুন যতক্ষণ না কোনও অ্যাপ্লিকেশন অভিপ্রায়ের জন্য ফিল্টার না করে বা যতক্ষণ না ট্যাগ ডিসপ্যাচ সিস্টেম সমস্ত সম্ভাব্য উদ্দেশ্যগুলি চেষ্টা করে।
  3. যদি কোনও উদ্দেশ্যগুলির জন্য কোনও অ্যাপ্লিকেশন ফিল্টার না করে তবে কিছুই করবেন না।
চিত্র 1. ট্যাগ ডিসপ্যাচ সিস্টেম

যখনই সম্ভব, NDEF বার্তা এবং ACTION_NDEF_DISCOVERED উদ্দেশ্য নিয়ে কাজ করুন, কারণ এটি তিনটির মধ্যে সবচেয়ে নির্দিষ্ট। এই অভিপ্রায়টি আপনাকে ব্যবহারকারীকে আরও ভাল অভিজ্ঞতা প্রদান করে অন্য দুটি অভিপ্রায়ের চেয়ে আরও উপযুক্ত সময়ে আপনার অ্যাপ্লিকেশন শুরু করতে দেয়৷

Android ম্যানিফেস্টে NFC অ্যাক্সেসের অনুরোধ করুন

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

  • NFC হার্ডওয়্যার অ্যাক্সেস করার জন্য NFC <uses-permission> উপাদান:
    <uses-permission android:name="android.permission.NFC" />
  • ন্যূনতম SDK সংস্করণ যা আপনার অ্যাপ্লিকেশন সমর্থন করতে পারে৷ API স্তর 9 শুধুমাত্র ACTION_TAG_DISCOVERED এর মাধ্যমে সীমিত ট্যাগ প্রেরণ সমর্থন করে, এবং শুধুমাত্র EXTRA_NDEF_MESSAGES অতিরিক্ত মাধ্যমে NDEF বার্তাগুলিতে অ্যাক্সেস দেয়৷ অন্য কোন ট্যাগ বৈশিষ্ট্য বা I/O অপারেশন অ্যাক্সেসযোগ্য নয়। API স্তর 10-এ ব্যাপক পাঠক/লেখক সমর্থনের পাশাপাশি ফোরগ্রাউন্ড NDEF পুশিং অন্তর্ভুক্ত রয়েছে এবং API স্তর 14 NDEF রেকর্ড তৈরি করার জন্য অতিরিক্ত সুবিধার পদ্ধতি প্রদান করে।
    <uses-sdk android:minSdkVersion="10"/>
  • uses-feature উপাদান যাতে আপনার অ্যাপ্লিকেশন শুধুমাত্র NFC হার্ডওয়্যার আছে এমন ডিভাইসগুলির জন্য Google Play-তে দেখানো হয়:
    <uses-feature android:name="android.hardware.nfc" android:required="true" />

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

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 ইন্টেন্টের জন্য ফিল্টার করতে, আপনি যে ধরনের ডেটা ফিল্টার করতে চান তার সাথে ইন্টেন্ট ফিল্টার ঘোষণা করুন। নিম্নোক্ত উদাহরণ ACTION_NDEF_DISCOVERED ইন্টেন্টের জন্য MIME ধরনের text/plain সহ ফিল্টার:

<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 আকারে একটি URI-এর জন্য ফিল্টার করে।

<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_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 ফাইলে, নিম্নলিখিত উদাহরণের মতো <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 উদ্দেশ্য নিয়ে কাজ করার বিষয়ে আরও তথ্যের জন্য, উন্নত NFC নথিতে সমর্থিত ট্যাগ প্রযুক্তিগুলির সাথে কাজ করা দেখুন৷

ACTION_TAG_আবিষ্কার

ACTION_TAG_DISCOVERED ফিল্টার করতে নিম্নলিখিত উদ্দেশ্য ফিল্টারটি ব্যবহার করুন:

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

ACTION_VIEW

Android 16 শুরু করে, URL লিঙ্কগুলি সঞ্চয় করে এমন NFC ট্যাগগুলি স্ক্যান করা ACTION_VIEW অভিপ্রায়কে ট্রিগার করবে৷ ACTION_VIEW ফিল্টার করতে this পড়ুন। ইউআরএলের জন্য আপনার অ্যাপ খুলতে Android app links ব্যবহার করুন।

উদ্দেশ্য থেকে তথ্য প্রাপ্ত

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

  • EXTRA_TAG (প্রয়োজনীয়): একটি Tag বস্তু যা স্ক্যান করা ট্যাগের প্রতিনিধিত্ব করে।
  • EXTRA_NDEF_MESSAGES (ঐচ্ছিক): ট্যাগ থেকে পার্স করা NDEF বার্তাগুলির একটি অ্যারে৷ এই অতিরিক্ত ACTION_NDEF_DISCOVERED ইন্টেন্টে বাধ্যতামূলক৷
  • EXTRA_ID (ঐচ্ছিক): ট্যাগের নিম্ন-স্তরের 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 রেকর্ড তৈরি করুন

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 রেকর্ড তৈরি করতে পারেন:

কোটলিন

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 রেকর্ডের জন্য অভিপ্রায় ফিল্টারটি দেখতে এইরকম হবে:

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

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 রেকর্ডের জন্য অভিপ্রায় ফিল্টারটি দেখতে এইরকম হবে:

<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 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 রেকর্ডের জন্য অভিপ্রায় ফিল্টারটি দেখতে এইরকম হবে:

<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 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 রেকর্ডের জন্য অভিপ্রায় ফিল্টারটি দেখতে এইরকম হবে:

<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 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 রেকর্ডের জন্য অভিপ্রায় ফিল্টারটি দেখতে এইরকম হবে:

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

অ্যান্ড্রয়েড-চালিত এবং নন-অ্যান্ড্রয়েড-চালিত ডিভাইসগুলিকে আরও ভালভাবে সমর্থন করতে আরও জেনেরিক NFC ট্যাগ স্থাপনের জন্য TNF_EXTERNAL_TYPE ব্যবহার করুন৷

দ্রষ্টব্য : TNF_EXTERNAL_TYPE এর জন্য URN-এর একটি ক্যানোনিকাল ফর্ম্যাট রয়েছে: urn:nfc:ext:example.com:externalType , তবে NFC ফোরাম RTD স্পেসিফিকেশন ঘোষণা করে যে URN-এর urn:nfc:ext: অংশটি অবশ্যই NDE রেকর্ড থেকে বাদ দিতে হবে। তাই আপনাকে যা দিতে হবে তা হল ডোমেইন (উদাহরণে example.com ) এবং টাইপ (উদাহরণে externalType ) একটি কোলন দ্বারা পৃথক করা। TNF_EXTERNAL_TYPE পাঠানোর সময়, Android urn:nfc:ext:example.com:externalType URN-কে একটি vnd.android.nfc://ext/example.com:externalType URI-তে রূপান্তর করে, যা উদাহরণের উদ্দেশ্য ফিল্টার ঘোষণা করে।

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

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 দিয়ে কোনো অ্যাপ্লিকেশন শুরু না হয়, তাহলে AAR-এর উপর ভিত্তি করে অ্যাপ্লিকেশনটি ডাউনলোড করতে Google Play-তে যান।

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

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

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

কোটলিন

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

জাভা

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

এনএফসি ট্যাগ স্ক্যানিংয়ের জন্য অ্যাপের অনুমতি তালিকা

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

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

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

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

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

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

ট্যাগ প্রেরণ সিস্টেম

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

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

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

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

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

ট্যাগ ডিসপ্যাচ সিস্টেম এনডিইএফ বার্তায় একটি MIME প্রকার বা URI ম্যাপ করার চেষ্টা করার জন্য TNF এবং টাইপ ক্ষেত্র ব্যবহার করে। সফল হলে, এটি প্রকৃত পেলোড সহ একটি ACTION_NDEF_DISCOVERED অভিপ্রায়ের ভিতরে সেই তথ্যগুলিকে অন্তর্ভুক্ত করে৷ যাইহোক, এমন কিছু ক্ষেত্রে আছে যখন ট্যাগ ডিসপ্যাচ সিস্টেম প্রথম NDEF রেকর্ডের উপর ভিত্তি করে ডেটার ধরন নির্ধারণ করতে পারে না। এটি ঘটে যখন NDEF ডেটা একটি MIME প্রকার বা URI-তে ম্যাপ করা যায় না, বা যখন NFC ট্যাগে শুরু করার জন্য NDEF ডেটা থাকে না। এই ধরনের ক্ষেত্রে, ট্যাগের প্রযুক্তি এবং পেলোড সম্পর্কে তথ্য আছে এমন একটি Tag অবজেক্ট এর পরিবর্তে একটি ACTION_TECH_DISCOVERED উদ্দেশ্যের ভিতরে এনক্যাপসুলেট করা হয়।

সারণী 1 বর্ণনা করে কিভাবে ট্যাগ ডিসপ্যাচ সিস্টেম TNF ম্যাপ করে এবং ক্ষেত্রগুলিকে MIME প্রকার বা URI-তে টাইপ করে। এটি বর্ণনা করে যে কোন TNFগুলিকে একটি MIME প্রকার বা URI-তে ম্যাপ করা যাবে না৷ এই ক্ষেত্রে, ট্যাগ ডিসপ্যাচ সিস্টেম ACTION_TECH_DISCOVERED এ ফিরে আসে।

উদাহরণস্বরূপ, যদি ট্যাগ ডিসপ্যাচ সিস্টেমটি TNF_ABSOLUTE_URI টাইপের একটি রেকর্ডের সম্মুখীন হয়, তাহলে এটি সেই রেকর্ডের পরিবর্তনশীল দৈর্ঘ্যের ক্ষেত্রটিকে একটি URI-তে ম্যাপ করে। ট্যাগ ডিসপ্যাচ সিস্টেম একটি ACTION_NDEF_DISCOVERED উদ্দেশ্যের ডেটা ক্ষেত্রে সেই URIকে ট্যাগ সম্পর্কিত অন্যান্য তথ্যের সাথে অন্তর্ভুক্ত করে, যেমন পেলোড। অন্যদিকে, যদি এটি TNF_UNKNOWN টাইপের একটি রেকর্ডের সম্মুখীন হয়, তবে এটি একটি উদ্দেশ্য তৈরি করে যা ট্যাগের প্রযুক্তিগুলিকে এনক্যাপসুলেট করে।

সারণি 1. সমর্থিত TNF এবং তাদের ম্যাপিং

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

সারণি 2. 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 পেলোড পার্স করার উপর ভিত্তি করে ইউআরআই।
RTD_TEXT MIME ধরনের text/plain
RTD_URI পেলোডের উপর ভিত্তি করে ইউআরআই।

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

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

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

    দ্রষ্টব্য: Android 16 শুরু করে, NFC ট্যাগগুলি স্ক্যান করা যা URL লিঙ্কগুলিকে সংরক্ষণ করে (যেমন URI স্কিম হল "httttps://" বা "http://") ACTION_NDEF_DISCOVERED অভিপ্রায়ের পরিবর্তে ACTION_VIEW অভিপ্রায় ট্রিগার করবে৷

  2. ACTION_TECH_DISCOVERED : ACTION_NDEF_DISCOVERED অভিপ্রায় পরিচালনা করার জন্য যদি কোনো কার্যক্রম নিবন্ধিত না হয়, ট্যাগ প্রেরণ সিস্টেম এই অভিপ্রায় দিয়ে একটি অ্যাপ্লিকেশন শুরু করার চেষ্টা করে। এই অভিপ্রায়টি সরাসরি শুরু হয় (প্রথমে ACTION_NDEF_DISCOVERED শুরু না করে) যদি স্ক্যান করা ট্যাগটিতে NDEF ডেটা থাকে যা একটি MIME প্রকার বা URI-তে ম্যাপ করা যায় না, অথবা যদি ট্যাগটিতে NDEF ডেটা না থাকে তবে এটি একটি পরিচিত ট্যাগ প্রযুক্তির।
  3. ACTION_TAG_DISCOVERED : এই অভিপ্রায় শুরু হয় যদি কোনো ক্রিয়াকলাপ ACTION_NDEF_DISCOVERED বা ACTION_TECH_DISCOVERED উদ্দেশ্যগুলি পরিচালনা না করে৷

ট্যাগ ডিসপ্যাচ সিস্টেম কাজ করার প্রাথমিক উপায় নিম্নরূপ:

  1. NFC ট্যাগ (হয় ACTION_NDEF_DISCOVERED বা ACTION_TECH_DISCOVERED ) পার্স করার সময় ট্যাগ ডিসপ্যাচ সিস্টেম দ্বারা তৈরি করা অভিপ্রায়ে একটি কার্যকলাপ শুরু করার চেষ্টা করুন।
  2. যদি কোনও অ্যাক্টিভিটি সেই অভিপ্রায়ের জন্য ফিল্টার না করে, তাহলে পরবর্তী সর্বনিম্ন অগ্রাধিকারের অভিপ্রায় (হয় ACTION_TECH_DISCOVERED বা ACTION_TAG_DISCOVERED ) দিয়ে একটি অ্যাক্টিভিটি শুরু করার চেষ্টা করুন যতক্ষণ না কোনও অ্যাপ্লিকেশন অভিপ্রায়ের জন্য ফিল্টার না করে বা যতক্ষণ না ট্যাগ ডিসপ্যাচ সিস্টেম সমস্ত সম্ভাব্য উদ্দেশ্যগুলি চেষ্টা করে।
  3. যদি কোনও উদ্দেশ্যগুলির জন্য কোনও অ্যাপ্লিকেশন ফিল্টার না করে তবে কিছুই করবেন না।
চিত্র 1. ট্যাগ ডিসপ্যাচ সিস্টেম

যখনই সম্ভব, NDEF বার্তা এবং ACTION_NDEF_DISCOVERED উদ্দেশ্য নিয়ে কাজ করুন, কারণ এটি তিনটির মধ্যে সবচেয়ে নির্দিষ্ট। এই অভিপ্রায়টি আপনাকে ব্যবহারকারীকে আরও ভাল অভিজ্ঞতা প্রদান করে অন্য দুটি অভিপ্রায়ের চেয়ে আরও উপযুক্ত সময়ে আপনার অ্যাপ্লিকেশন শুরু করতে দেয়৷

Android ম্যানিফেস্টে NFC অ্যাক্সেসের অনুরোধ করুন

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

  • NFC হার্ডওয়্যার অ্যাক্সেস করার জন্য NFC <uses-permission> উপাদান:
    <uses-permission android:name="android.permission.NFC" />
  • ন্যূনতম SDK সংস্করণ যা আপনার অ্যাপ্লিকেশন সমর্থন করতে পারে৷ API স্তর 9 শুধুমাত্র ACTION_TAG_DISCOVERED এর মাধ্যমে সীমিত ট্যাগ প্রেরণ সমর্থন করে, এবং শুধুমাত্র EXTRA_NDEF_MESSAGES অতিরিক্ত মাধ্যমে NDEF বার্তাগুলিতে অ্যাক্সেস দেয়৷ অন্য কোন ট্যাগ বৈশিষ্ট্য বা I/O অপারেশন অ্যাক্সেসযোগ্য নয়। API স্তর 10-এ ব্যাপক পাঠক/লেখক সমর্থনের পাশাপাশি ফোরগ্রাউন্ড NDEF পুশিং অন্তর্ভুক্ত রয়েছে এবং API স্তর 14 NDEF রেকর্ড তৈরি করার জন্য অতিরিক্ত সুবিধার পদ্ধতি প্রদান করে।
    <uses-sdk android:minSdkVersion="10"/>
  • uses-feature উপাদান যাতে আপনার অ্যাপ্লিকেশন শুধুমাত্র NFC হার্ডওয়্যার আছে এমন ডিভাইসগুলির জন্য Google Play-তে দেখানো হয়:
    <uses-feature android:name="android.hardware.nfc" android:required="true" />

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

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

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

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

অ্যাকশন_এনডিএফ_ডিস্কোভেড

ACTION_NDEF_DISCOVERED ইনটেন্টগুলির জন্য ফিল্টার করতে, আপনি যে ধরণের ডেটা ফিল্টার করতে চান তার সাথে উদ্দেশ্যযুক্ত ফিল্টারটি ঘোষণা করুন। ACTION_NDEF_DISCOVERED ইনটেন্টগুলির জন্য নিম্নলিখিত উদাহরণগুলি একটি মাইম ধরণের text/plain :

<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_DISCOVERED ইন্টেন্টের জন্য ফিল্টারগুলি ফিল্টার করে, আপনাকে অবশ্যই একটি এক্সএমএল রিসোর্স ফাইল তৈরি করতে হবে যা আপনার ক্রিয়াকলাপগুলি একটি tech-list সেটের মধ্যে সমর্থন করে এমন প্রযুক্তিগুলি নির্দিষ্ট করে। আপনার ক্রিয়াকলাপটি ম্যাচ হিসাবে বিবেচিত হয় যদি কোনও tech-list সেটটি প্রযুক্তিগুলির একটি উপসেট যা ট্যাগ দ্বারা সমর্থিত, যা আপনি getTechList() কল করে পেতে পারেন।

উদাহরণস্বরূপ, স্ক্যান করা ট্যাগটি যদি মাইফারক্লাসিক, এনডিফর্মেটেবল এবং এনএফসিএকে সমর্থন করে তবে আপনার tech-list সেটটি অবশ্যই আপনার ক্রিয়াকলাপের সাথে মিলে যাওয়ার জন্য তিনটি, দুটি, বা অন্য কোনও প্রযুক্তি (এবং অন্য কিছু নয়) নির্দিষ্ট করতে হবে।

নিম্নলিখিত নমুনা সমস্ত প্রযুক্তি সংজ্ঞায়িত করে। আপনার এনএফসি ট্যাগ দ্বারা সমর্থিত নয় এমনগুলি আপনাকে অবশ্যই সরিয়ে ফেলতে হবে। এই ফাইলটি সংরক্ষণ করুন (আপনি এটি পছন্দ করতে পারেন এমন কিছু নামকরণ করতে পারেন) <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 ফাইলে, আপনি সবেমাত্র <meta-data> উপাদানটিতে <activity> উপাদানটির মধ্যে তৈরি করা রিসোর্স ফাইলটি নির্দিষ্ট করুন নীচের উদাহরণের মতো:

<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_DISCOVERED জন্য ফিল্টার করতে নিম্নলিখিত অভিপ্রায় ফিল্টারটি ব্যবহার করুন:

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

অ্যাকশন_ভিউ

অ্যান্ড্রয়েড 16 শুরু করে, ইউআরএল লিঙ্কগুলি সঞ্চয় করে এমন এনএফসি ট্যাগগুলি স্ক্যান করে ACTION_VIEW অভিপ্রায়টি ট্রিগার করবে। ACTION_VIEW জন্য ফিল্টার করতে this দেখুন। URL এর জন্য আপনার অ্যাপ্লিকেশনটি খুলতে Android app links ব্যবহার করুন।

অভিপ্রায় থেকে তথ্য পান

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

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

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

কোটলিন

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

সাধারণ ধরণের এনডিইএফ রেকর্ড তৈরি করুন

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

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

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

পূর্ববর্তী এনডিইএফ রেকর্ডের জন্য অভিপ্রায় ফিল্টারটি দেখতে এটির মতো হবে:

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

Tnf_mime_media

আপনি নিম্নলিখিত উপায়ে একটি TNF_MIME_MEDIA এনডিইএফ রেকর্ড তৈরি করতে পারেন:

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

পূর্ববর্তী এনডিইএফ রেকর্ডের জন্য অভিপ্রায় ফিল্টারটি দেখতে এটির মতো হবে:

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

Tnf_well_nown 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;
}

পূর্ববর্তী এনডিইএফ রেকর্ডের জন্য অভিপ্রায় ফিল্টারটি দেখতে এটির মতো হবে:

<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="text/plain" />
</intent-filter>

Tnf_well_ পরিচিত rtd_uri সহ

আপনি নিম্নলিখিত উপায়ে একটি TNF_WELL_KNOWN এনডিইএফ রেকর্ড তৈরি করতে পারেন:

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

পূর্ববর্তী এনডিইএফ রেকর্ডের জন্য অভিপ্রায় ফিল্টারটি দেখতে এটির মতো হবে:

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

পূর্ববর্তী এনডিইএফ রেকর্ডের জন্য অভিপ্রায় ফিল্টারটি দেখতে এটির মতো হবে:

<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 ব্যবহার করুন।

দ্রষ্টব্য : TNF_EXTERNAL_TYPE এর জন্য urns এর একটি ক্যানোনিকাল ফর্ম্যাট রয়েছে: urn:nfc:ext:example.com:externalType , তবে এনএফসি ফোরাম আরটিডি স্পেসিফিকেশন ঘোষণা করে যে urn:nfc:ext: urn এর অংশটি এনডিইএফ রেকর্ড থেকে বাদ দিতে হবে। সুতরাং আপনাকে যা সরবরাহ করতে হবে তা হ'ল ডোমেন (উদাহরণস্বরূপ example.com ) এবং টাইপ (উদাহরণে externalType ) একটি কোলন দ্বারা পৃথক করা। TNF_EXTERNAL_TYPE প্রেরণ করার সময়, অ্যান্ড্রয়েডটি urn:nfc:ext:example.com:externalType ইউআরএনকে একটি vnd.android.nfc://ext/example.com:externalType ইউআরআই, যা উদাহরণস্বরূপ ঘোষণায় ইন্টেন্ট ফিল্টার।

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

অ্যান্ড্রয়েড 4.0.০ (এপিআই স্তর 14) এ প্রবর্তিত, একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন রেকর্ড (এএআর) একটি শক্তিশালী নিশ্চিততা সরবরাহ করে যে কোনও এনএফসি ট্যাগ স্ক্যান করা হলে আপনার আবেদনটি শুরু হয়। একটি এএআর একটি এনডিইএফ রেকর্ডের ভিতরে এম্বেড থাকা একটি অ্যাপ্লিকেশনটির প্যাকেজ নাম রয়েছে। আপনি আপনার এনডিইএফ বার্তার যে কোনও এনডিইএফ রেকর্ডে একটি এএআর যুক্ত করতে পারেন, কারণ অ্যান্ড্রয়েড এআরএসের জন্য পুরো এনডিইএফ বার্তাটি অনুসন্ধান করে। যদি এটি কোনও এএআর খুঁজে পায় তবে এটি এএআর -এর অভ্যন্তরে প্যাকেজের নামের ভিত্তিতে অ্যাপ্লিকেশনটি শুরু করে। যদি অ্যাপ্লিকেশনটি ডিভাইসে উপস্থিত না থাকে তবে অ্যাপ্লিকেশনটি ডাউনলোড করতে গুগল প্লে চালু করা হয়।

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

যদি কোনও ট্যাগে এআর থাকে তবে ট্যাগ প্রেরণ সিস্টেমটি নিম্নলিখিত পদ্ধতিতে প্রেরণ করে:

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

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

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

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

কোটলিন

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

জাভা

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

এনএফসি ট্যাগ স্ক্যানিংয়ের জন্য অ্যাপ্লিকেশন অনুমতি দেয়

অ্যান্ড্রয়েড 16 শুরু করে, ব্যবহারকারীদের যখন কোনও অ্যাপ্লিকেশন এনএফসি ট্যাগগুলি স্ক্যান করার প্রথম এনএফসি অভিপ্রায় গ্রহণ করে তখন তাদের অবহিত করা হয়। ব্যবহারকারীকে নোটিফিকেশনটিতে আর এনএফসি ট্যাগগুলির জন্য স্ক্যান করা থেকে অ্যাপ্লিকেশনটিকে অস্বীকার করার বিকল্প সরবরাহ করা হয়েছে।

  • অ্যাপ্লিকেশনগুলি NfcAdapter.isTagIntentAllowed() ব্যবহার করে অ্যাপটিকে এনএফসি ট্যাগগুলি স্ক্যান করার অনুমতি দিয়েছে কিনা তা পরীক্ষা করতে পারে।
  • অ্যাপ্লিকেশনগুলি ব্যবহারকারীকে ACTION_CHANGE_TAG_INTENT_PREFERENCE প্রেরণ করে আবার এনএফসি ট্যাগ স্ক্যানিংয়ের অনুমতি দিতে অনুরোধ করতে পারে।

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

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