USB অ্যাক্সেসরি মোড ব্যবহারকারীদের Android-পরিচালিত ডিভাইসের জন্য বিশেষভাবে ডিজাইন করা USB হোস্ট হার্ডওয়্যার কানেক্ট করতে দেয়। অ্যাক্সেসরিকে অবশ্যই Android অ্যাক্সেসরি ডেভেলপমেন্ট কিট ডকুমেন্টেশনে বর্ণিত Android অ্যাক্সেসরি প্রোটোকল মেনে চলতে হবে। এর ফলে, USB হোস্ট হিসেবে কাজ করতে পারে না এমন Android-পরিচালিত ডিভাইস এখনও USB হার্ডওয়্যারের সাথে ইন্টার্যাক্ট করতে পারে। Android-পরিচালিত ডিভাইস USB অ্যাক্সেসরি মোডে থাকলে, অ্যাটাচ করা Android USB অ্যাক্সেসরি হোস্ট হিসেবে কাজ করে, USB বাসে পাওয়ার প্রদান করে এবং কানেক্ট করা ডিভাইস গণনা করে। Android 3.1 (API লেভেল 12) USB অ্যাক্সেসরি মোডে কাজ করে এবং আরও বেশি ডিভাইসে কাজ করার জন্য এই ফিচার Android 2.3.4 (API লেভেল 10)-এও ব্যাকপোর্ট করা হয়েছে।
সঠিক USB অ্যাক্সেসরি API বেছে নেওয়া
USB অ্যাক্সেসরি API Android 3.1-এ প্ল্যাটফর্মে চালু করা হলেও, Google API অ্যাড-অন লাইব্রেরি ব্যবহার করে সেগুলি Android 2.3.4-এও উপলভ্য। যেহেতু এইসব API এক্সটার্নাল লাইব্রেরি ব্যবহার করে ব্যাকপোর্ট করা হয়েছে, তাই USB অ্যাক্সেসরি মোড কাজ করানোর জন্য আপনি দুটি প্যাকেজ ইমপোর্ট করতে পারবেন। আপনি কোন Android-পরিচালিত ডিভাইসে কাজ করতে চান তার উপর নির্ভর করে, আপনাকে হয়ত একটির পরিবর্তে অন্যটি ব্যবহার করতে হবে:
com.android.future.usb: Android 2.3.4-এ USB অ্যাক্সেসরি মোড কাজ করানোর জন্য, Google API অ্যাড-অন লাইব্রেরিতে ব্যাকপোর্ট করা USB অ্যাক্সেসরি API অন্তর্ভুক্ত থাকে এবং সেগুলি এই নেমস্পেসে থাকে। এছাড়াও, Android 3.1-এ অ্যাড-অন লাইব্রেরি দিয়ে লেখা অ্যাপ্লিকেশন যাতে কাজ করে, সেই জন্য এই নেমস্পেসের মধ্যে ক্লাস ইমপোর্ট ও কল করা যায়। এই অ্যাড-অন লাইব্রেরি হলandroid.hardware.usbঅ্যাক্সেসরি API-এর একটি পাতলা র্যাপার এবং এটি USB হোস্ট মোডে কাজ করে না। আপনি যদি USB অ্যাক্সেসরি মোড কাজ করে এমন ডিভাইসের সবচেয়ে বড় রেঞ্জকে সাপোর্ট করতে চান, তাহলে অ্যাড-অন লাইব্রেরি ব্যবহার করুন এবং এই প্যাকেজ ইমপোর্ট করুন। এটি মনে রাখা গুরুত্বপূর্ণ যে, সব Android 2.3.4 ডিভাইসে USB অ্যাক্সেসরি ফিচার কাজ করতে হবে না। প্রতিটি ডিভাইস প্রস্তুতকারী সংস্থা সিদ্ধান্ত নেয় যে এই সুবিধা কাজ করবে কিনা, সেই জন্য আপনাকে ম্যানিফেস্ট ফাইলে এটি ঘোষণা করতে হবে।android.hardware.usb: এই নেমস্পেসে এমন ক্লাস আছে যা Android 3.1-এ USB অ্যাক্সেসরি মোড কাজ করতে সাহায্য করে। এই প্যাকেজটি ফ্রেমওয়ার্ক API-এর অংশ হিসেবে অন্তর্ভুক্ত করা হয়েছে, তাই Android 3.1-এ অ্যাড-অন লাইব্রেরি ব্যবহার না করেই USB অ্যাক্সেসরি মোড কাজ করে। আপনি যদি শুধুমাত্র Android 3.1 বা এর পরের যেকোনও ভার্সনের ডিভাইসের ব্যাপারে আগ্রহী হন, যেগুলিতে USB অ্যাক্সেসরি মোডের জন্য হার্ডওয়্যার সহায়তা আছে, তাহলে এই প্যাকেজটি ব্যবহার করুন। এটি আপনি নিজের মেনিফেস্ট ফাইলে ঘোষণা করতে পারবেন।
Google API অ্যাড-অন লাইব্রেরি ইনস্টল করা
আপনি অ্যাড-অন ইনস্টল করতে চাইলে, SDK Manager-এর মাধ্যমে Google APIs Android API 10 প্যাকেজ ইনস্টল করে তা করতে পারবেন। অ্যাড-অন লাইব্রেরি ইনস্টল করা সম্পর্কে আরও তথ্যের জন্য Google API অ্যাড-অন ইনস্টল করা দেখুন।
API ওভারভিউ
যেহেতু অ্যাড-অন লাইব্রেরি হল ফ্রেমওয়ার্ক API-এর র্যাপার, তাই যে ক্লাসগুলি USB অ্যাক্সেসরি ফিচারের সাথে কাজ করে সেগুলি একই রকম হয়।
আপনি অ্যাড-অন লাইব্রেরি ব্যবহার করলেও android.hardware.usb-এর রেফারেন্স ডকুমেন্টেশন ব্যবহার করতে পারবেন।
মনে রাখবেন: তবে, অ্যাড-অন লাইব্রেরি এবং ফ্রেমওয়ার্ক API-এর মধ্যে সামান্য ব্যবহার সংক্রান্ত পার্থক্য রয়েছে যা আপনার জানা উচিত।
নিচের সারণীতে USB অ্যাক্সেসরি API কাজ করে এমন ক্লাস সম্পর্কে বর্ণনা করা হয়েছে:
| শ্রেণী | বর্ণনা |
|---|---|
UsbManager |
কানেক্ট করা USB অ্যাক্সেসরি গণনা ও সেটির সাথে যোগাযোগ করার অনুমতি দেয়। |
UsbAccessory |
USB অ্যাক্সেসরিকে বোঝায় এবং এর শনাক্তকারী তথ্য অ্যাক্সেস করার পদ্ধতি থাকে। |
অ্যাড-অন লাইব্রেরি ও প্ল্যাটফর্ম API-এর মধ্যে ব্যবহারের পার্থক্য
Google API অ্যাড-অন লাইব্রেরি এবং প্ল্যাটফর্ম API ব্যবহার করার মধ্যে দুটি পার্থক্য আছে।
আপনি অ্যাড-অন লাইব্রেরি ব্যবহার করলে, আপনাকে অবশ্যই নিম্নলিখিত পদ্ধতিতে UsbManager অবজেক্ট পেতে হবে:
Kotlin
val manager = UsbManager.getInstance(this)
জাভা
UsbManager manager = UsbManager.getInstance(this);
আপনি অ্যাড-অন লাইব্রেরি ব্যবহার না করলে, আপনাকে অবশ্যই নিম্নলিখিত পদ্ধতিতে UsbManager অবজেক্ট পেতে হবে:
Kotlin
val manager = getSystemService(Context.USB_SERVICE) as UsbManager
জাভা
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
আপনি যখন কোনও ইনটেন্ট ফিল্টার সহ কানেক্ট করা অ্যাক্সেসরি ফিল্টার করেন, তখন UsbAccessory অবজেক্টটি আপনার
অ্যাপ্লিকেশনে পাস করা ইনটেন্টের মধ্যে থাকে। আপনি অ্যাড-অন লাইব্রেরি ব্যবহার করলে, আপনাকে অবশ্যই নিম্নলিখিত পদ্ধতিতে UsbAccessory অবজেক্ট পেতে হবে:
Kotlin
val accessory = UsbManager.getAccessory(intent)
জাভা
UsbAccessory accessory = UsbManager.getAccessory(intent);
আপনি অ্যাড-অন লাইব্রেরি ব্যবহার না করলে, আপনাকে অবশ্যই নিম্নলিখিত পদ্ধতিতে UsbAccessory অবজেক্ট পেতে হবে:
Kotlin
val accessory = intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY) as UsbAccessory
জাভা
UsbAccessory accessory = (UsbAccessory) intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
Android ম্যানিফেস্ট সংক্রান্ত প্রয়োজনীয়তা
USB অ্যাক্সেসরি API-এর সাথে কাজ করার আগে আপনার অ্যাপ্লিকেশনের ম্যানিফেস্ট ফাইলে কী কী যোগ করতে হবে তা নিম্নলিখিত তালিকা থেকে জানতে পারবেন। ম্যানিফেস্ট ও রিসোর্স ফাইলের উদাহরণ থেকে কীভাবে এই আইটেম ঘোষণা করতে হয় তা জানুন:
- কারণ, সব Android-পরিচালিত ডিভাইসে USB অ্যাক্সেসরি API কাজ করবে এমন গ্যারান্টি নেই,
<uses-feature>এলিমেন্ট যোগ করুন যা ঘোষণা করে যে আপনার অ্যাপ্লিকেশনandroid.hardware.usb.accessoryফিচার ব্যবহার করে। - আপনি যদি
অ্যাড-অন লাইব্রেরি ব্যবহার করেন,
তাহলে
<uses-library>এলিমেন্ট যোগ করে লাইব্রেরির জন্যcom.android.future.usb.accessoryনির্দিষ্ট করুন। - আপনি যদি অ্যাড-অন লাইব্রেরি
ব্যবহার করেন তাহলে অ্যাপ্লিকেশনের ন্যূনতম SDK API লেভেল ১০-এ সেট করুন
অথবা আপনি যদি
android.hardware.usbপ্যাকেজ ব্যবহার করেন তাহলে ১২-এ সেট করুন। -
আপনি যদি চান যে আপনার অ্যাপ্লিকেশনটি একটি অ্যাটাচ করা USB অ্যাক্সেসরি সম্পর্কে বিজ্ঞপ্তি পাক, তাহলে আপনার মূল অ্যাক্টিভিটিতে
android.hardware.usb.action.USB_ACCESSORY_ATTACHEDইনটেন্টের জন্য একটি<intent-filter>এবং<meta-data>এলিমেন্ট পেয়ার নির্দিষ্ট করুন।<meta-data>এলিমেন্ট একটি এক্সটার্নাল XML রিসোর্স ফাইলের দিকে পয়েন্ট করে যা আপনি শনাক্ত করতে চান এমন অ্যাক্সেসরি সম্পর্কে শনাক্তকারী তথ্য ঘোষণা করে।XML রিসোর্স ফাইলে, আপনি যেসব অ্যাক্সেসরি ফিল্টার করতে চান সেগুলির জন্য
<usb-accessory>এলিমেন্ট ঘোষণা করুন। প্রতিটি<usb-accessory>-এর নিম্নলিখিত অ্যাট্রিবিউট থাকতে পারে:manufacturermodelversion
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 সিস্টেম নির্ধারণ করতে পারে যে কানেক্ট করা অ্যাক্সেসরিতে আপনার অ্যাপ্লিকেশন আগ্রহী কিনা। যদি তাই হয়, তাহলে আপনি চাইলে অ্যাক্সেসরির সাথে যোগাযোগ সেট-আপ করতে পারবেন। এটি করতে, আপনার আবেদনকে এগুলি করতে হবে:
- অ্যাট্যাচ করা ইভেন্ট ফিল্টার করে এমন ইনটেন্ট ফিল্টার ব্যবহার করে কানেক্ট করা অ্যাক্সেসরি খুঁজে দেখুন অথবা কানেক্ট করা অ্যাক্সেসরি গণনা করে উপযুক্তটি খুঁজে নিন।
- অ্যাক্সেসরির সাথে যোগাযোগ করার জন্য ব্যবহারকারীর অনুমতি নিন, যদি আগে থেকে না নেওয়া হয়ে থাকে।
- সঠিক ইন্টারফেস এন্ডপয়েন্টে ডেটা লিখে ও পড়ে অ্যাক্সেসরির সাথে যোগাযোগ করুন।
অ্যাক্সেসরি খুঁজে দেখা
ব্যবহারকারী কোনও অ্যাক্সেসরি কানেক্ট করলে, সেই বিষয়ে বিজ্ঞপ্তি পেতে আপনার অ্যাপ্লিকেশন ইনটেন্ট ফিল্টার ব্যবহার করে অথবা আগে থেকেই কানেক্ট করা অ্যাক্সেসরি গণনা করে অ্যাক্সেসরি খুঁজে পেতে পারে। আপনি যদি চান যে আপনার অ্যাপ্লিকেশনটি অটোমেটিক একটি পছন্দসই অ্যাক্সেসরি শনাক্ত করতে পারুক, তাহলে ইনটেন্ট ফিল্টার ব্যবহার করা কার্যকর। কানেক্ট করা সব অ্যাক্সেসরি তালিকাভুক্ত করতে চাইলে অথবা আপনার অ্যাপ্লিকেশন কোনও ইনটেন্ট ফিল্টার না করলে, কানেক্ট করা অ্যাক্সেসরি গণনা করা কাজে লাগে।
ইনটেন্ট ফিল্টার ব্যবহার করা
আপনার অ্যাপ্লিকেশন যাতে কোনও নির্দিষ্ট 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>
আপনি যেসব USB অ্যাক্সেসরি সম্পর্কে আগ্রহী, সংশ্লিষ্ট রিসোর্স ফাইল ঘোষণা করার পদ্ধতি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
<?xml version="1.0" encoding="utf-8"?> <resources> <usb-accessory manufacturer="Google, Inc." model="DemoKit" version="1.0" /> </resources>
আপনার অ্যাক্টিভিটিতে, আপনি UsbAccessory পেতে পারেন যা এই ধরনের ইনটেন্ট থেকে অ্যাটাচ করা অ্যাক্সেসরিকে
প্রতিনিধিত্ব করে (অ্যাড-অন লাইব্রেরির সাথে):
Kotlin
val accessory = UsbManager.getAccessory(intent)
জাভা
UsbAccessory accessory = UsbManager.getAccessory(intent);
অথবা এই ধরনের (প্ল্যাটফর্ম API সহ):
Kotlin
val accessory = intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY) as UsbAccessory
জাভা
UsbAccessory accessory = (UsbAccessory)intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
অ্যাক্সেসরি গণনা করা
আপনার অ্যাপ্লিকেশন চলাকালীন শনাক্ত করা অ্যাক্সেসরিগুলি আপনার অ্যাপ্লিকেশনকে গণনা করতে দিতে পারেন।
কানেক্ট করা সব USB অ্যাক্সেসরিয়ের একটি অ্যারে পেতে, getAccessoryList() পদ্ধতি
ব্যবহার করুন:
Kotlin
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()-এ কল করলে, অ্যাক্সেসরি কানেক্ট করার অনুমতি চেয়ে
ব্যবহারকারীকে একটি ডায়ালগ দেখানো হয়। নিম্নলিখিত স্যাম্পেল কোড থেকে কীভাবে
ব্রডকাস্ট রিসিভার তৈরি করতে হয় তা জানুন:
Kotlin
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() পদ্ধতিতে এটি যোগ করুন:
activity:
Kotlin
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() মেথড কল করুন:
Kotlin
lateinit var accessory: UsbAccessory ... usbManager.requestPermission(accessory, permissionIntent)
জাভা
UsbAccessory accessory; ... usbManager.requestPermission(accessory, permissionIntent);
ব্যবহারকারী ডায়ালগের উত্তর দিলে, আপনার ব্রডকাস্ট রিসিভার এমন ইনটেন্ট পায় যাতে
EXTRA_PERMISSION_GRANTED অতিরিক্ত তথ্য থাকে, এটি হল একটি বুলিয়ান
যা উত্তরকে রিপ্রেজেন্ট করে। অ্যাক্সেসরি
-তে কানেক্ট করার আগে এই এক্সট্রা ভ্যালু true আছে কিনা চেক করুন।
অ্যাক্সেসরির সাথে যোগাযোগ করা
অ্যাক্সেসরির সাথে যোগাযোগ করতে, আপনি UsbManager ব্যবহার করে
একটি ফাইল ডেসক্রিপ্টর পেতে পারেন যা আপনি ইনপুট ও আউটপুট স্ট্রিম সেট-আপ করতে ব্যবহার করতে পারেন যাতে ডেসক্রিপ্টরে ডেটা
পড়া ও লেখা যায়। স্ট্রিমগুলি অ্যাক্সেসরির ইনপুট ও আউটপুট বাল্ক এন্ডপয়েন্টকে উপস্থাপন করে। ডিভাইস ও অ্যাক্সেসরির মধ্যে কমিউনিকেশন অন্য থ্রেডে সেট-আপ
করতে হবে, যাতে মূল UI থ্রেড লক না হয়ে যায়।
কীভাবে যোগাযোগ করার জন্য অ্যাক্সেসরি খুলতে হয় তা নিম্নলিখিত উদাহরণ থেকে দেখুন:
Kotlin
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 প্যাকেট ডেটা
স্টোর করার জন্য যথেষ্ট বড় হয় তা নিশ্চিত করুন। Android অ্যাক্সেসরি প্রোটোকল ১৬৩৮৪ বাইট পর্যন্ত
প্যাকেট বাফার কাজ করে, তাই আপনি সবসময় এই
সাইজের বাফার ঘোষণা করতে পারেন।
মনে রাখবেন: কম লেভেলে, USB ফুল-স্পিড অ্যাক্সেসরির জন্য প্যাকেট ৬৪ বাইট এবং USB হাই-স্পিড অ্যাক্সেসরির জন্য ৫১২ বাইট হয়। Android অ্যাক্সেসরি প্রোটোকল, সরলতার জন্য দুটি স্পিডের প্যাকেটকে একসাথে একটি লজিক্যাল প্যাকেটে বান্ডেল করে।
Android-এ থ্রেড ব্যবহার করা সম্পর্কে আরও জানতে, প্রসেস ও থ্রেড দেখুন।
অ্যাক্সেসরির সাথে যোগাযোগ বন্ধ করা
অ্যাক্সেসরির সাথে যোগাযোগ করা হয়ে গেলে অথবা অ্যাক্সেসরিটি খুলে নেওয়া হলে, close() কল করে আপনি যে ফাইল ডেসক্রিপ্টর খুলেছিলেন সেটি বন্ধ করুন।
আলাদা করা ইভেন্ট শোনার জন্য, নিচের মতো একটি ব্রডকাস্ট রিসিভার তৈরি করুন:
Kotlin
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 } } } };
ম্যানিফেস্টের মধ্যে নয়, অ্যাপ্লিকেশনের মধ্যে ব্রডকাস্ট রিসিভার তৈরি করলে, আপনার অ্যাপ্লিকেশনটি চালু থাকাকালীন শুধুমাত্র ডিট্যাচ করা ইভেন্ট হ্যান্ডেল করতে পারবে। এইভাবে, বিচ্ছিন্ন ইভেন্টগুলি শুধুমাত্র সেই অ্যাপ্লিকেশনকে পাঠানো হয় যা বর্তমানে চলছে এবং সমস্ত অ্যাপ্লিকেশনকে ব্রডকাস্ট করা হয় না।