ইউএসবি আনুষঙ্গিক ওভারভিউ

USB আনুষঙ্গিক মোড ব্যবহারকারীদের বিশেষভাবে Android-চালিত ডিভাইসগুলির জন্য ডিজাইন করা USB হোস্ট হার্ডওয়্যার সংযোগ করতে দেয়৷ আনুষাঙ্গিকগুলিকে অবশ্যই Android অ্যাকসেসরি ডেভেলপমেন্ট কিট ডকুমেন্টেশনে বর্ণিত অ্যান্ড্রয়েড আনুষঙ্গিক প্রোটোকল মেনে চলতে হবে। এটি Android-চালিত ডিভাইসগুলিকে USB হার্ডওয়্যারের সাথে ইন্টারঅ্যাক্ট করতে USB হোস্ট হিসাবে কাজ করতে পারে না। যখন একটি Android-চালিত ডিভাইস USB আনুষঙ্গিক মোডে থাকে, তখন সংযুক্ত Android USB আনুষঙ্গিক হোস্ট হিসাবে কাজ করে, USB বাসে শক্তি প্রদান করে এবং সংযুক্ত ডিভাইসগুলিকে গণনা করে৷ Android 3.1 (API স্তর 12) USB আনুষঙ্গিক মোড সমর্থন করে এবং বৈশিষ্ট্যটি Android 2.3.4 (API স্তর 10) এ ব্যাকপোর্ট করা হয়েছে যাতে ডিভাইসগুলির একটি বিস্তৃত পরিসরের জন্য সমর্থন সক্ষম করা যায়।

সঠিক USB আনুষঙ্গিক APIগুলি চয়ন করুন৷

যদিও ইউএসবি আনুষঙ্গিক এপিআইগুলি প্ল্যাটফর্মে অ্যান্ড্রয়েড 3.1-এ প্রবর্তন করা হয়েছিল, সেগুলি Google API-এর অ্যাড-অন লাইব্রেরি ব্যবহার করে অ্যান্ড্রয়েড 2.3.4-তেও উপলব্ধ। যেহেতু এই APIগুলি একটি বাহ্যিক লাইব্রেরি ব্যবহার করে ব্যাকপোর্ট করা হয়েছিল, সেখানে দুটি প্যাকেজ রয়েছে যা আপনি USB আনুষঙ্গিক মোড সমর্থন করতে আমদানি করতে পারেন৷ আপনি কোন Android-চালিত ডিভাইসগুলিকে সমর্থন করতে চান তার উপর নির্ভর করে, আপনাকে একটির উপর একটি ব্যবহার করতে হতে পারে:

  • com.android.future.usb : Android 2.3.4-এ USB আনুষঙ্গিক মোড সমর্থন করার জন্য, Google APIs অ্যাড-অন লাইব্রেরিতে ব্যাকপোর্ট করা USB আনুষঙ্গিক APIগুলি অন্তর্ভুক্ত রয়েছে এবং সেগুলি এই নামস্থানে রয়েছে৷ অ্যান্ড্রয়েড 3.1 অ্যাড-অন লাইব্রেরি সহ লিখিত অ্যাপ্লিকেশনগুলিকে সমর্থন করার জন্য এই নামস্থানের মধ্যে ক্লাসগুলি আমদানি এবং কল করা সমর্থন করে৷ এই অ্যাড-অন লাইব্রেরিটি android.hardware.usb আনুষঙ্গিক APIগুলির চারপাশে একটি পাতলা মোড়ক এবং USB হোস্ট মোড সমর্থন করে না। আপনি যদি USB আনুষঙ্গিক মোড সমর্থন করে এমন ডিভাইসগুলির বিস্তৃত পরিসরকে সমর্থন করতে চান তবে অ্যাড-অন লাইব্রেরি ব্যবহার করুন এবং এই প্যাকেজটি আমদানি করুন৷ এটা মনে রাখা গুরুত্বপূর্ণ যে সমস্ত Android 2.3.4 ডিভাইসের USB আনুষঙ্গিক বৈশিষ্ট্য সমর্থন করার প্রয়োজন নেই। প্রতিটি স্বতন্ত্র ডিভাইস প্রস্তুতকারক সিদ্ধান্ত নেয় যে এই ক্ষমতাটি সমর্থন করবে কি না, তাই আপনাকে অবশ্যই এটি আপনার ম্যানিফেস্ট ফাইলে ঘোষণা করতে হবে।
  • android.hardware.usb : এই নেমস্পেসটিতে এমন ক্লাস রয়েছে যা অ্যান্ড্রয়েড 3.1-এ USB আনুষঙ্গিক মোড সমর্থন করে। এই প্যাকেজটি ফ্রেমওয়ার্ক API-এর অংশ হিসাবে অন্তর্ভুক্ত করা হয়েছে, তাই Android 3.1 একটি অ্যাড-অন লাইব্রেরি ব্যবহার না করেই USB আনুষঙ্গিক মোড সমর্থন করে৷ আপনি যদি শুধুমাত্র Android 3.1 বা USB আনুষঙ্গিক মোডের জন্য হার্ডওয়্যার সমর্থন করে এমন নতুন ডিভাইসগুলির বিষয়ে চিন্তা করেন তবে এই প্যাকেজটি ব্যবহার করুন, যা আপনি আপনার ম্যানিফেস্ট ফাইলে ঘোষণা করতে পারেন৷

Google APIs অ্যাড-অন লাইব্রেরি ইনস্টল করুন

আপনি যদি অ্যাড-অন ইনস্টল করতে চান, আপনি SDK ম্যানেজারের সাথে Google APIs Android API 10 প্যাকেজ ইনস্টল করে তা করতে পারেন। অ্যাড-অন লাইব্রেরি ইনস্টল করার বিষয়ে আরও তথ্যের জন্য Google APIs অ্যাড-অন ইনস্টল করা দেখুন।

API ওভারভিউ

যেহেতু অ্যাড-অন লাইব্রেরি ফ্রেমওয়ার্ক API-এর জন্য একটি মোড়ক, তাই USB আনুষঙ্গিক বৈশিষ্ট্য সমর্থন করে এমন ক্লাসগুলি একই রকম। আপনি অ্যাড-অন লাইব্রেরি ব্যবহার করলেও আপনি android.hardware.usb এর জন্য রেফারেন্স ডকুমেন্টেশন ব্যবহার করতে পারেন।

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

নিম্নলিখিত সারণীতে এমন ক্লাসগুলি বর্ণনা করা হয়েছে যা USB আনুষঙ্গিক API সমর্থন করে:

ক্লাস বর্ণনা
UsbManager আপনাকে সংযুক্ত ইউএসবি আনুষাঙ্গিকগুলির সাথে গণনা করতে এবং যোগাযোগ করতে দেয়৷
UsbAccessory একটি USB আনুষঙ্গিক প্রতিনিধিত্ব করে এবং এর সনাক্তকরণ তথ্য অ্যাক্সেস করার পদ্ধতি রয়েছে।

অ্যাড-অন লাইব্রেরি এবং প্ল্যাটফর্ম API-এর মধ্যে ব্যবহারের পার্থক্য

Google APIs অ্যাড-অন লাইব্রেরি এবং প্ল্যাটফর্ম API ব্যবহার করার মধ্যে দুটি ব্যবহারের পার্থক্য রয়েছে।

আপনি যদি অ্যাড-অন লাইব্রেরি ব্যবহার করেন তবে আপনাকে অবশ্যই নিম্নলিখিত পদ্ধতিতে UsbManager অবজেক্টটি পেতে হবে:

কোটলিন

val manager = UsbManager.getInstance(this)

জাভা

UsbManager manager = UsbManager.getInstance(this);

আপনি যদি অ্যাড-অন লাইব্রেরি ব্যবহার না করেন তবে আপনাকে অবশ্যই নিম্নলিখিত পদ্ধতিতে UsbManager অবজেক্টটি পেতে হবে:

কোটলিন

val manager = getSystemService(Context.USB_SERVICE) as UsbManager

জাভা

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);

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

কোটলিন

val accessory = UsbManager.getAccessory(intent)

জাভা

UsbAccessory accessory = UsbManager.getAccessory(intent);

আপনি যদি অ্যাড-অন লাইব্রেরি ব্যবহার না করেন, তাহলে আপনাকে অবশ্যই নিম্নলিখিত পদ্ধতিতে UsbAccessory অবজেক্টটি পেতে হবে:

কোটলিন

val accessory = intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY) as UsbAccessory

জাভা

UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);

অ্যান্ড্রয়েড ম্যানিফেস্ট প্রয়োজনীয়তা

USB আনুষঙ্গিক APIগুলির সাথে কাজ করার আগে আপনার অ্যাপ্লিকেশনের ম্যানিফেস্ট ফাইলে আপনাকে কী যোগ করতে হবে তা নিম্নলিখিত তালিকাটি বর্ণনা করে৷ ম্যানিফেস্ট এবং রিসোর্স ফাইলের উদাহরণগুলি দেখায় কিভাবে এই আইটেমগুলি ঘোষণা করতে হয়:

  • যেহেতু সমস্ত Android-চালিত ডিভাইসগুলি USB আনুষঙ্গিক APIগুলিকে সমর্থন করার গ্যারান্টিযুক্ত নয়, তাই একটি <uses-feature> উপাদান অন্তর্ভুক্ত করুন যা ঘোষণা করে যে আপনার অ্যাপ্লিকেশন android.hardware.usb.accessory বৈশিষ্ট্য ব্যবহার করে৷
  • আপনি যদি অ্যাড-অন লাইব্রেরি ব্যবহার করেন, তাহলে লাইব্রেরির জন্য com.android.future.usb.accessory নির্দিষ্ট করে <uses-library> উপাদান যোগ করুন।
  • আপনি যদি অ্যাড-অন লাইব্রেরি ব্যবহার করেন তবে অ্যাপ্লিকেশনটির ন্যূনতম SDK API স্তর 10 এ সেট করুন বা 12 যদি আপনি android.hardware.usb প্যাকেজ ব্যবহার করেন।
  • আপনি যদি চান যে আপনার অ্যাপ্লিকেশানটিকে একটি সংযুক্ত USB আনুষঙ্গিক বিষয়ে অবহিত করা হোক, আপনার প্রধান কার্যকলাপে android.hardware.usb.action.USB_ACCESSORY_ATTACHED অভিপ্রায়ের জন্য একটি <intent-filter> এবং <meta-data> > উপাদান জোড়া নির্দিষ্ট করুন। <meta-data> উপাদানটি একটি বাহ্যিক XML রিসোর্স ফাইলের দিকে নির্দেশ করে যা আপনি সনাক্ত করতে চান এমন আনুষঙ্গিক সম্পর্কে সনাক্তকারী তথ্য ঘোষণা করে।

    XML রিসোর্স ফাইলে, আপনি ফিল্টার করতে চান এমন আনুষাঙ্গিকগুলির জন্য <usb-accessory> উপাদানগুলি ঘোষণা করুন। প্রতিটি <usb-accessory> নিম্নলিখিত বৈশিষ্ট্য থাকতে পারে:

    • manufacturer
    • model
    • version

    version ফিল্টার করার পরামর্শ দেওয়া হয় না। একটি আনুষঙ্গিক বা ডিভাইস সবসময় একটি সংস্করণ স্ট্রিং নির্দিষ্ট নাও হতে পারে (ইচ্ছাকৃতভাবে বা অনিচ্ছাকৃতভাবে)। যখন আপনার অ্যাপ ফিল্টার করার জন্য একটি সংস্করণ বৈশিষ্ট্য ঘোষণা করে এবং আনুষঙ্গিক বা ডিভাইস কোনো সংস্করণ স্ট্রিং নির্দিষ্ট করে না, তখন এটি Android এর আগের সংস্করণগুলিতে একটি NullPointerException সৃষ্টি করে। এই সমস্যাটি Android 12 এ স্থির করা হয়েছে।

    রিসোর্স ফাইলটি res/xml/ ডিরেক্টরিতে সংরক্ষণ করুন। রিসোর্স ফাইলের নাম (.xml এক্সটেনশন ব্যতীত) আপনার <meta-data> উপাদানে উল্লেখ করা নামটির মতোই হতে হবে। XML রিসোর্স ফাইলের বিন্যাসটিও নীচের উদাহরণে দেখানো হয়েছে।

ম্যানিফেস্ট এবং রিসোর্স ফাইলের উদাহরণ

নিম্নলিখিত উদাহরণটি একটি নমুনা ম্যানিফেস্ট এবং এর সংশ্লিষ্ট সংস্থান ফাইল দেখায়:

<manifest ...>
    <uses-feature android:name="android.hardware.usb.accessory" />
    
    <uses-sdk android:minSdkVersion="<version>" />
    ...
    <application>
      <uses-library android:name="com.android.future.usb.accessory" />
        <activity ...>
            ...
            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
            </intent-filter>

            <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
                android:resource="@xml/accessory_filter" />
        </activity>
    </application>
</manifest>

এই ক্ষেত্রে, নিম্নলিখিত রিসোর্স ফাইলটি res/xml/accessory_filter.xml এ সংরক্ষিত করা উচিত এবং নির্দিষ্ট করে যে সংশ্লিষ্ট মডেল, প্রস্তুতকারক এবং সংস্করণ আছে এমন যেকোনো আনুষঙ্গিক ফিল্টার করা উচিত। আনুষঙ্গিক এই বৈশিষ্ট্যগুলি Android-চালিত ডিভাইসে পাঠায়:

<?xml version="1.0" encoding="utf-8"?>

<resources>
    <usb-accessory model="DemoKit" manufacturer="Google" version="1.0"/>
</resources>

আনুষাঙ্গিক সঙ্গে কাজ

যখন ব্যবহারকারীরা একটি Android-চালিত ডিভাইসের সাথে USB আনুষাঙ্গিক সংযোগ করে, তখন Android সিস্টেম আপনার অ্যাপ্লিকেশন সংযুক্ত আনুষঙ্গিকগুলিতে আগ্রহী কিনা তা নির্ধারণ করতে পারে৷ যদি তাই হয়, আপনি ইচ্ছা করলে আনুষঙ্গিক সঙ্গে যোগাযোগ সেট আপ করতে পারেন. এটি করার জন্য, আপনার আবেদন করতে হবে:

  1. একটি অভিপ্রায় ফিল্টার ব্যবহার করে সংযুক্ত আনুষাঙ্গিকগুলি আবিষ্কার করুন যা আনুষঙ্গিক সংযুক্ত ইভেন্টগুলির জন্য ফিল্টার করে বা সংযুক্ত আনুষাঙ্গিকগুলি গণনা করে এবং উপযুক্তটি খুঁজে বের করে৷
  2. ইতিমধ্যে প্রাপ্ত না হলে, আনুষঙ্গিক সাথে যোগাযোগ করার অনুমতির জন্য ব্যবহারকারীকে জিজ্ঞাসা করুন।
  3. উপযুক্ত ইন্টারফেস এন্ডপয়েন্টে ডেটা পড়ে এবং লিখে আনুষঙ্গিকের সাথে যোগাযোগ করুন।

একটি আনুষঙ্গিক আবিষ্কার করুন

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

একটি অভিপ্রায় ফিল্টার ব্যবহার করুন

আপনার অ্যাপ্লিকেশন একটি নির্দিষ্ট USB আনুষঙ্গিক আবিষ্কার করতে, আপনি android.hardware.usb.action.USB_ACCESSORY_ATTACHED অভিপ্রায়ের জন্য ফিল্টার করার জন্য একটি অভিপ্রায় ফিল্টার নির্দিষ্ট করতে পারেন৷ এই অভিপ্রায় ফিল্টারের সাথে, আপনাকে একটি সংস্থান ফাইল নির্দিষ্ট করতে হবে যা USB আনুষঙ্গিক বৈশিষ্ট্যগুলি নির্দিষ্ট করে, যেমন প্রস্তুতকারক, মডেল এবং সংস্করণ৷

নিম্নলিখিত উদাহরণ দেখায় কিভাবে অভিপ্রায় ফিল্টার ঘোষণা করতে হয়:

<activity ...>
    ...
    <intent-filter>
        <action android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED" />
    </intent-filter>

    <meta-data android:name="android.hardware.usb.action.USB_ACCESSORY_ATTACHED"
        android:resource="@xml/accessory_filter" />
</activity>

নিম্নলিখিত উদাহরণটি দেখায় কিভাবে সংশ্লিষ্ট রিসোর্স ফাইলটি ঘোষণা করতে হয় যা ইউএসবি আনুষাঙ্গিকগুলিকে নির্দিষ্ট করে যা আপনি আগ্রহী:

<?xml version="1.0" encoding="utf-8"?>

<resources>
    <usb-accessory manufacturer="Google, Inc." model="DemoKit" version="1.0" />
</resources>

আপনার কার্যকলাপে, আপনি UsbAccessory পেতে পারেন যা সংযুক্ত আনুষঙ্গিক প্রতিনিধিত্ব করে এই মত উদ্দেশ্য থেকে (অ্যাড-অন লাইব্রেরির সাথে):

কোটলিন

val accessory = UsbManager.getAccessory(intent)

জাভা

UsbAccessory accessory = UsbManager.getAccessory(intent);

বা এটির মতো (প্ল্যাটফর্ম APIগুলির সাথে):

কোটলিন

val accessory = intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY) as UsbAccessory

জাভা

UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);

আনুষাঙ্গিক গণনা

আপনি আপনার অ্যাপ্লিকেশনের গণনাকারী আনুষাঙ্গিকগুলি রাখতে পারেন যা আপনার অ্যাপ্লিকেশনটি চলাকালীন নিজেকে চিহ্নিত করেছে।

সংযুক্ত থাকা সমস্ত ইউএসবি আনুষাঙ্গিক অ্যারে পেতে getAccessoryList() পদ্ধতি ব্যবহার করুন:

কোটলিন

val manager = getSystemService(Context.USB_SERVICE) as UsbManager
val accessoryList: Array<out UsbAccessory> = manager.accessoryList

জাভা

UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
UsbAccessory[] accessoryList = manager.getAccessoryList();

দ্রষ্টব্য: একবারে শুধুমাত্র একটি সংযুক্ত আনুষঙ্গিক সমর্থিত।

একটি আনুষঙ্গিক সঙ্গে যোগাযোগ করার অনুমতি পান

USB আনুষঙ্গিক সঙ্গে যোগাযোগ করার আগে, আপনার অ্যাপ্লিকেশন আপনার ব্যবহারকারীদের কাছ থেকে অনুমতি থাকতে হবে.

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

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

স্পষ্টভাবে অনুমতি পেতে, প্রথমে একটি সম্প্রচার রিসিভার তৈরি করুন৷ আপনি requestPermission() কল করলে এই রিসিভারটি সম্প্রচারিত হওয়ার অভিপ্রায় শোনে। requestPermission() কলটি ব্যবহারকারীর কাছে একটি ডায়ালগ প্রদর্শন করে যা আনুষঙ্গিক সংযোগের জন্য অনুমতি চাচ্ছে। নিম্নলিখিত নমুনা কোড দেখায় কিভাবে সম্প্রচার রিসিভার তৈরি করতে হয়:

কোটলিন

private const val ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"

private val usbReceiver = object : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if (ACTION_USB_PERMISSION == intent.action) {
            synchronized(this) {
                val accessory: UsbAccessory? = intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY)

                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    accessory?.apply {
                        // call method to set up accessory communication
                    }
                } else {
                    Log.d(TAG, "permission denied for accessory $accessory")
                }
            }
        }
    }
}

জাভা

private static final String ACTION_USB_PERMISSION =
    "com.android.example.USB_PERMISSION";
private final BroadcastReceiver usbReceiver = new BroadcastReceiver() {

    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (ACTION_USB_PERMISSION.equals(action)) {
            synchronized (this) {
                UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);

                if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
                    if(accessory != null){
                        // call method to set up accessory communication
                    }
                }
                else {
                    Log.d(TAG, "permission denied for accessory " + accessory);
                }
            }
        }
    }
};

ব্রডকাস্ট রিসিভার নিবন্ধন করতে, আপনার কার্যকলাপে আপনার onCreate() পদ্ধতিতে এটি রাখুন:

কোটলিন

private const val ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION"
...
val manager = getSystemService(Context.USB_SERVICE) as UsbManager
...
permissionIntent = PendingIntent.getBroadcast(this, 0, Intent(ACTION_USB_PERMISSION), 0)
val filter = IntentFilter(ACTION_USB_PERMISSION)
registerReceiver(usbReceiver, filter)

জাভা

UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
private static final String ACTION_USB_PERMISSION =
    "com.android.example.USB_PERMISSION";
...
permissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
registerReceiver(usbReceiver, filter);

আনুষঙ্গিক সংযোগের জন্য ব্যবহারকারীদের অনুমতি চাওয়া ডায়ালগ প্রদর্শন করতে, requestPermission() পদ্ধতিতে কল করুন:

কোটলিন

lateinit var accessory: UsbAccessory
...
usbManager.requestPermission(accessory, permissionIntent)

জাভা

UsbAccessory accessory;
...
usbManager.requestPermission(accessory, permissionIntent);

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

একটি আনুষঙ্গিক সঙ্গে যোগাযোগ

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

কোটলিন

private lateinit var accessory: UsbAccessory
private var fileDescriptor: ParcelFileDescriptor? = null
private var inputStream: FileInputStream? = null
private var outputStream: FileOutputStream? = null
...

private fun openAccessory() {
    Log.d(TAG, "openAccessory: $mAccessory")
    fileDescriptor = usbManager.openAccessory(accessory)
    fileDescriptor?.fileDescriptor?.also { fd ->
        inputStream = FileInputStream(fd)
        outputStream = FileOutputStream(fd)
        val thread = Thread(null, this, "AccessoryThread")
        thread.start()
    }
}

জাভা

UsbAccessory accessory;
ParcelFileDescriptor fileDescriptor;
FileInputStream inputStream;
FileOutputStream outputStream;
...

private void openAccessory() {
    Log.d(TAG, "openAccessory: " + accessory);
    fileDescriptor = usbManager.openAccessory(accessory);
    if (fileDescriptor != null) {
        FileDescriptor fd = fileDescriptor.getFileDescriptor();
        inputStream = new FileInputStream(fd);
        outputStream = new FileOutputStream(fd);
        Thread thread = new Thread(null, this, "AccessoryThread");
        thread.start();
    }
}

থ্রেডের run() পদ্ধতিতে, আপনি FileInputStream বা FileOutputStream অবজেক্ট ব্যবহার করে আনুষঙ্গিক পড়তে এবং লিখতে পারেন। একটি FileInputStream অবজেক্টের সাথে একটি আনুষঙ্গিক থেকে ডেটা পড়ার সময়, নিশ্চিত করুন যে আপনি যে বাফারটি ব্যবহার করেন তা USB প্যাকেট ডেটা সংরক্ষণ করার জন্য যথেষ্ট বড়। অ্যান্ড্রয়েড আনুষঙ্গিক প্রোটোকল 16384 বাইট পর্যন্ত প্যাকেট বাফার সমর্থন করে, তাই আপনি সরলতার জন্য সর্বদা আপনার বাফারটিকে এই আকারের বলে ঘোষণা করতে পারেন৷

দ্রষ্টব্য: নিম্ন স্তরে, প্যাকেটগুলি USB ফুল-স্পীড আনুষাঙ্গিকগুলির জন্য 64 বাইট এবং USB উচ্চ-গতির আনুষাঙ্গিকগুলির জন্য 512 বাইট। অ্যান্ড্রয়েড আনুষঙ্গিক প্রোটোকল উভয় গতির জন্য প্যাকেটগুলিকে একত্রিত করে সরলতার জন্য একটি লজিক্যাল প্যাকেটে।

অ্যান্ড্রয়েডে থ্রেড ব্যবহার সম্পর্কে আরও তথ্যের জন্য, প্রসেস এবং থ্রেড দেখুন।

একটি আনুষঙ্গিক সঙ্গে যোগাযোগ বন্ধ

আপনি একটি আনুষঙ্গিক সাথে যোগাযোগ করা শেষ হয়ে গেলে বা আনুষঙ্গিকটি বিচ্ছিন্ন হয়ে গেলে, close() কল করে আপনি যে ফাইলটি খুলেছেন সেটি বন্ধ করুন। বিচ্ছিন্ন ইভেন্টগুলি শুনতে, নীচের মত একটি সম্প্রচার রিসিভার তৈরি করুন:

কোটলিন

var usbReceiver: BroadcastReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {

        if (UsbManager.ACTION_USB_ACCESSORY_DETACHED == intent.action) {
            val accessory: UsbAccessory? = intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY)
            accessory?.apply {
                // call your method that cleans up and closes communication with the accessory
            }
        }
    }
}

জাভা

BroadcastReceiver usbReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (UsbManager.ACTION_USB_ACCESSORY_DETACHED.equals(action)) {
            UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
            if (accessory != null) {
                // call your method that cleans up and closes communication with the accessory
            }
        }
    }
};

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