উন্নত NFC ওভারভিউ

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

সমর্থিত ট্যাগ প্রযুক্তির সাথে কাজ করুন

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

সারণী 1. সমর্থিত ট্যাগ প্রযুক্তি

ক্লাস বর্ণনা
TagTechnology ইন্টারফেস যা সমস্ত ট্যাগ প্রযুক্তি ক্লাস বাস্তবায়ন করতে হবে।
NfcA NFC-A (ISO 14443-3A) বৈশিষ্ট্য এবং I/O অপারেশনগুলিতে অ্যাক্সেস প্রদান করে।
NfcB NFC-B (ISO 14443-3B) বৈশিষ্ট্য এবং I/O অপারেশনগুলিতে অ্যাক্সেস প্রদান করে।
NfcF NFC-F (JIS 6319-4) বৈশিষ্ট্য এবং I/O অপারেশনগুলিতে অ্যাক্সেস প্রদান করে।
NfcV NFC-V (ISO 15693) বৈশিষ্ট্য এবং I/O অপারেশনগুলিতে অ্যাক্সেস প্রদান করে।
IsoDep ISO-DEP (ISO 14443-4) বৈশিষ্ট্য এবং I/O অপারেশনগুলিতে অ্যাক্সেস প্রদান করে।
Ndef এনডিইএফ ডেটা এবং এনএফসি ট্যাগের অপারেশনগুলিতে অ্যাক্সেস প্রদান করে যা এনডিইএফ হিসাবে ফর্ম্যাট করা হয়েছে।
NdefFormatable NDEF ফর্ম্যাটেবল হতে পারে এমন ট্যাগগুলির জন্য একটি ফর্ম্যাট অপারেশন প্রদান করে৷

নিম্নলিখিত ট্যাগ প্রযুক্তিগুলি Android-চালিত ডিভাইসগুলির দ্বারা সমর্থিত হওয়ার প্রয়োজন নেই৷

সারণী 2. ঐচ্ছিক সমর্থিত ট্যাগ প্রযুক্তি

ক্লাস বর্ণনা
MifareClassic MIFARE ক্লাসিক বৈশিষ্ট্য এবং I/O অপারেশনগুলিতে অ্যাক্সেস প্রদান করে, যদি এই Android ডিভাইসটি MIFARE সমর্থন করে।
MifareUltralight MIFARE আল্ট্রালাইট বৈশিষ্ট্য এবং I/O অপারেশনগুলিতে অ্যাক্সেস প্রদান করে, যদি এই Android ডিভাইসটি MIFARE সমর্থন করে।

ট্যাগ প্রযুক্তি এবং ACTION_TECH_DISCOVERED উদ্দেশ্য নিয়ে কাজ করুন

যখন একটি ডিভাইস একটি ট্যাগ স্ক্যান করে যেটিতে NDEF ডেটা রয়েছে, কিন্তু একটি MIME বা URI-তে ম্যাপ করা যায়নি, তখন ট্যাগ ডিসপ্যাচ সিস্টেম ACTION_TECH_DISCOVERED অভিপ্রায়ের সাথে একটি কার্যকলাপ শুরু করার চেষ্টা করে৷ ACTION_TECH_DISCOVERED ব্যবহার করা হয় যখন নন-NDEF ডেটা সহ একটি ট্যাগ স্ক্যান করা হয়। এই ফলব্যাক থাকা আপনাকে ট্যাগের ডেটার সাথে সরাসরি কাজ করতে দেয় যদি ট্যাগ ডিসপ্যাচ সিস্টেম আপনার জন্য এটি পার্স করতে না পারে। ট্যাগ প্রযুক্তির সাথে কাজ করার সময় প্রাথমিক পদক্ষেপগুলি নিম্নরূপ:

  1. আপনি যে ট্যাগ প্রযুক্তিগুলি পরিচালনা করতে চান তা নির্দিষ্ট করে একটি ACTION_TECH_DISCOVERED অভিপ্রায়ের জন্য ফিল্টার করুন৷ আরও তথ্যের জন্য NFC ইন্টেন্টের জন্য ফিল্টারিং দেখুন। সাধারণভাবে, ট্যাগ ডিসপ্যাচ সিস্টেম একটি ACTION_TECH_DISCOVERED অভিপ্রায় শুরু করার চেষ্টা করে যখন একটি NDEF বার্তা একটি MIME প্রকার বা URI-তে ম্যাপ করা যায় না, বা যদি স্ক্যান করা ট্যাগটিতে NDEF ডেটা না থাকে। এটি কীভাবে নির্ধারণ করা হয় সে সম্পর্কে আরও তথ্যের জন্য, ট্যাগ ডিসপ্যাচ সিস্টেম দেখুন।
  2. যখন আপনার আবেদনটি অভিপ্রায় গ্রহণ করে, তখন অভিপ্রায় থেকে Tag বস্তুটি পান:
    var tagFromIntent: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)
    Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
  3. android.nfc.tech প্যাকেজের ক্লাসের একটি get ফ্যাক্টরি পদ্ধতিতে কল করে TagTechnology এর একটি উদাহরণ পান। get ফ্যাক্টরি পদ্ধতিতে কল করার আগে getTechList() কল করে আপনি ট্যাগের সমর্থিত প্রযুক্তিগুলি গণনা করতে পারেন। উদাহরণস্বরূপ, একটি Tag থেকে MifareUltralight এর একটি উদাহরণ পেতে, নিম্নলিখিতগুলি করুন:
    MifareUltralight.get(intent.getParcelableExtra(NfcAdapter.EXTRA_TAG))
    MifareUltralight.get(intent.getParcelableExtra(NfcAdapter.EXTRA_TAG));

পড়ুন এবং ট্যাগ লিখুন

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

package com.example.android.nfc
import android.nfc.Tag
import android.nfc.tech.MifareUltralight
import java.io.IOException
import java.nio.charset.Charset

class MifareUltralightTagTester {

   
fun writeTag(tag: Tag, tagText: String) {
       
MifareUltralight.get(tag)?.use { ultralight ->
            ultralight
.connect()
           
Charset.forName("US-ASCII").also { usAscii ->
                ultralight
.writePage(4, "abcd".toByteArray(usAscii))
                ultralight
.writePage(5, "efgh".toByteArray(usAscii))
                ultralight
.writePage(6, "ijkl".toByteArray(usAscii))
                ultralight
.writePage(7, "mnop".toByteArray(usAscii))
           
}
       
}
   
}

   
fun readTag(tag: Tag): String? {
       
return MifareUltralight.get(tag)?.use { mifare ->
            mifare
.connect()
           
val payload = mifare.readPages(4)
           
String(payload, Charset.forName("US-ASCII"))
       
}
   
}
}
package com.example.android.nfc;

import android.nfc.Tag;
import android.nfc.tech.MifareUltralight;
import android.util.Log;
import java.io.IOException;
import java.nio.charset.Charset;

public class MifareUltralightTagTester {

   
private static final String TAG = MifareUltralightTagTester.class.getSimpleName();

   
public void writeTag(Tag tag, String tagText) {
       
MifareUltralight ultralight = MifareUltralight.get(tag);
       
try {
            ultralight
.connect();
            ultralight
.writePage(4, "abcd".getBytes(Charset.forName("US-ASCII")));
            ultralight
.writePage(5, "efgh".getBytes(Charset.forName("US-ASCII")));
            ultralight
.writePage(6, "ijkl".getBytes(Charset.forName("US-ASCII")));
            ultralight
.writePage(7, "mnop".getBytes(Charset.forName("US-ASCII")));
       
} catch (IOException e) {
           
Log.e(TAG, "IOException while writing MifareUltralight...", e);
       
} finally {
           
try {
                ultralight
.close();
           
} catch (IOException e) {
               
Log.e(TAG, "IOException while closing MifareUltralight...", e);
           
}
       
}
   
}

   
public String readTag(Tag tag) {
       
MifareUltralight mifare = MifareUltralight.get(tag);
       
try {
            mifare
.connect();
           
byte[] payload = mifare.readPages(4);
           
return new String(payload, Charset.forName("US-ASCII"));
       
} catch (IOException e) {
           
Log.e(TAG, "IOException while reading MifareUltralight message...", e);
       
} finally {
           
if (mifare != null) {
               
try {
                   mifare
.close();
               
}
               
catch (IOException e) {
                   
Log.e(TAG, "Error closing tag...", e);
               
}
           
}
       
}
       
return null;
   
}
}

ফোরগ্রাউন্ড ডিসপ্যাচ সিস্টেম ব্যবহার করুন

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

  1. আপনার কার্যকলাপের onCreate() পদ্ধতিতে নিম্নলিখিত কোড যোগ করুন:
    1. একটি পরিবর্তনযোগ্য PendingIntent অবজেক্ট তৈরি করুন যাতে অ্যান্ড্রয়েড সিস্টেম স্ক্যান করার সময় ট্যাগের বিশদ বিবরণ দিয়ে এটি পূরণ করতে পারে।
      val intent = Intent(this, javaClass).apply {
          addFlags
      (Intent.FLAG_ACTIVITY_SINGLE_TOP)
      }
      var pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, intent,
             
      PendingIntent.FLAG_MUTABLE)
      PendingIntent pendingIntent = PendingIntent.getActivity(
         
      this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP),
         
      PendingIntent.FLAG_MUTABLE);
    2. আপনি যে অভিপ্রায়গুলিকে আটকাতে চান তা পরিচালনা করতে অভিপ্রায় ফিল্টার ঘোষণা করুন। ফোরগ্রাউন্ড ডিসপ্যাচ সিস্টেম ডিভাইসটি একটি ট্যাগ স্ক্যান করার সময় প্রাপ্ত অভিপ্রায়ের সাথে নির্দিষ্ট উদ্দেশ্য ফিল্টারগুলি পরীক্ষা করে। যদি এটি মেলে, তাহলে আপনার অ্যাপ্লিকেশন অভিপ্রায় পরিচালনা করে। যদি এটি মেলে না, তাহলে ফোরগ্রাউন্ড ডিসপ্যাচ সিস্টেমটি উদ্দেশ্য প্রেরণ সিস্টেমে ফিরে আসে। অভিপ্রায় ফিল্টার এবং প্রযুক্তি ফিল্টারগুলির একটি null অ্যারে নির্দিষ্ট করে, নির্দিষ্ট করে যে আপনি সমস্ত ট্যাগের জন্য ফিল্টার করতে চান যেগুলি TAG_DISCOVERED অভিপ্রায়ে পড়ে৷ নীচের কোড স্নিপেটটি NDEF_DISCOVERED এর জন্য সমস্ত MIME প্রকার পরিচালনা করে। আপনি শুধুমাত্র আপনার প্রয়োজন যে বেশী হ্যান্ডেল করা উচিত.
      val ndef = IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED).apply {
         
      try {
              addDataType
      ("*/*")    /* Handles all MIME based dispatches.
                                       You should specify only the ones that you need. */

         
      } catch (e: IntentFilter.MalformedMimeTypeException) {
             
      throw RuntimeException("fail", e)
         
      }
      }

      intentFiltersArray
      = arrayOf(ndef)
      IntentFilter ndef = new IntentFilter(NfcAdapter.ACTION_NDEF_DISCOVERED);
         
      try {
              ndef
      .addDataType("*/*");    /* Handles all MIME based dispatches.
                                             You should specify only the ones that you need. */

         
      }
         
      catch (MalformedMimeTypeException e) {
             
      throw new RuntimeException("fail", e);
         
      }
         intentFiltersArray
      = new IntentFilter[] {ndef, };
    3. ট্যাগ প্রযুক্তির একটি অ্যারে সেট আপ করুন যা আপনার অ্যাপ্লিকেশন পরিচালনা করতে চায়৷ আপনি যে প্রযুক্তি সমর্থন করতে চান তার ক্লাস পেতে Object.class.getName() পদ্ধতিতে কল করুন।
      techListsArray = arrayOf(arrayOf<String>(NfcF::class.java.name))
      techListsArray = new String[][] { new String[] { NfcF.class.getName() } };
  2. নিম্নলিখিত অ্যাক্টিভিটি লাইফসাইকেল কলব্যাকগুলি ওভাররাইড করুন এবং যখন অ্যাক্টিভিটি হারায় ( onPause() ) এবং ( onResume() ) ফোকাস ফিরে পায় তখন ফোরগ্রাউন্ড ডিসপ্যাচ সক্ষম ও নিষ্ক্রিয় করতে যুক্তি যোগ করুন৷ enableForegroundDispatch() মূল থ্রেড থেকে কল করতে হবে এবং শুধুমাত্র যখন কার্যকলাপটি অগ্রভাগে থাকে ( onResume() -এ কল করা এটির নিশ্চয়তা দেয়)। স্ক্যান করা NFC ট্যাগ থেকে ডেটা প্রক্রিয়া করার জন্য আপনাকে onNewIntent কলব্যাকটি বাস্তবায়ন করতে হবে।
  3. public override fun onPause() {
       
    super.onPause()
        adapter
    .disableForegroundDispatch(this)
    }

    public override fun onResume() {
       
    super.onResume()
        adapter
    .enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray)
    }

    public override fun onNewIntent(intent: Intent) {
       
    val tagFromIntent: Tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG)
       
    // do something with tagFromIntent
    }
    public void onPause() {
       
    super.onPause();
        adapter
    .disableForegroundDispatch(this);
    }

    public void onResume() {
       
    super.onResume();
        adapter
    .enableForegroundDispatch(this, pendingIntent, intentFiltersArray, techListsArray);
    }

    public void onNewIntent(Intent intent) {
       
    Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
       
    // do something with tagFromIntent
    }