আপনার Android-চালিত ডিভাইস USB হোস্ট মোডে থাকলে, এটি USB হোস্ট হিসেবে কাজ করে, বাসকে পাওয়ার দেয় এবং কানেক্ট করা USB ডিভাইসকে গণনা করে। Android 3.1 এবং তার পরবর্তী যেকোনও ভার্সনে USB হোস্ট মোড কাজ করে।
API ওভারভিউ
শুরু করার আগে, আপনাকে কোন ক্লাস নিয়ে কাজ করতে হবে তা বুঝে নেওয়া গুরুত্বপূর্ণ। নিম্নলিখিত
সারণীতে android.hardware.usb প্যাকেজে USB হোস্ট API-এর বর্ণনা দেওয়া হয়েছে।
টেবিল ১. USB হোস্ট API
| শ্রেণী | বর্ণনা |
|---|---|
UsbManager |
কানেক্ট করা USB ডিভাইসের সাথে আপনাকে গণনা ও যোগাযোগ করতে দেয়। |
UsbDevice |
কানেক্ট করা USB ডিভাইসকে দেখায় এবং এর শনাক্তকরণ তথ্য, ইন্টারফেস ও এন্ডপয়েন্ট অ্যাক্সেস করার পদ্ধতি এতে থাকে। |
UsbInterface |
USB ডিভাইসের ইন্টারফেস দেখায়, যা ডিভাইসের জন্য কার্যকারিতার সেট নির্ধারণ করে। একটি ডিভাইসে এক বা একাধিক ইন্টারফেস থাকতে পারে যার মাধ্যমে যোগাযোগ করা যায়। |
UsbEndpoint |
একটি ইন্টারফেস এন্ডপয়েন্টকে দেখায়, যা এই ইন্টারফেসের জন্য একটি কমিউনিকেশন চ্যানেল। একটি ইন্টারফেসে এক বা একাধিক এন্ডপয়েন্ট থাকতে পারে এবং ডিভাইসের সাথে দ্বিমুখী যোগাযোগের জন্য সাধারণত ইনপুট এবং আউটপুট এন্ডপয়েন্ট থাকে। |
UsbDeviceConnection |
ডিভাইসের সাথে কানেকশন দেখায়, যা এন্ডপয়েন্টে ডেটা ট্রান্সফার করে। এই ক্লাস আপনাকে সিঙ্ক্রোনাস বা অ্যাসিঙ্ক্রোনাসভাবে ডেটা পাঠাতে ও গ্রহণ করতে দেয়। |
UsbRequest |
UsbDeviceConnection-এর মাধ্যমে ডিভাইসের সাথে যোগাযোগ করার জন্য অ্যাসিঙ্ক্রোনাস অনুরোধকে দেখায়। |
UsbConstants |
USB কনস্ট্যান্টকে সংজ্ঞায়িত করে যা Linux কার্নেলের linux/usb/ch9.h-এ দেওয়া সংজ্ঞার সাথে সম্পর্কিত। |
বেশিরভাগ ক্ষেত্রে, USB ডিভাইসের সাথে যোগাযোগ করার সময় আপনাকে এইসব ক্লাস ব্যবহার করতে হবে (UsbRequest শুধুমাত্র তখনই প্রয়োজন যখন আপনি অ্যাসিঙ্ক্রোনাস কমিউনিকেশন করছেন)। সাধারণত, আপনি কাঙ্খিত UsbDevice পুনরুদ্ধার করতে একটি UsbManager পান।
আপনার কাছে ডিভাইস থাকলে, আপনাকে উপযুক্ত UsbInterface এবং সেই ইন্টারফেসের UsbEndpoint খুঁজে বের করতে হবে
যার মাধ্যমে আপনি যোগাযোগ করতে পারবেন। সঠিক এন্ডপয়েন্ট পাওয়ার পরে, USB ডিভাইসের সাথে যোগাযোগ করতে UsbDeviceConnection খুলুন।
Android ম্যানিফেস্ট সংক্রান্ত প্রয়োজনীয়তা
USB হোস্ট API-এর সাথে কাজ করার আগে আপনার অ্যাপ্লিকেশনের ম্যানিফেস্ট ফাইলে কী যোগ করতে হবে তা নিম্নলিখিত তালিকায় বর্ণনা করা হয়েছে:
- যেহেতু সব Android-চালিত ডিভাইস USB হোস্ট API-কে সাপোর্ট করবেই এমন কোনও গ্যারেন্টি নেই,
তাই
<uses-feature>এলিমেন্ট যোগ করুন যা ঘোষণা করে যে আপনার অ্যাপ্লিকেশনandroid.hardware.usb.hostফিচার ব্যবহার করে। - অ্যাপ্লিকেশনের ন্যূনতম SDK, API লেভেল ১২ বা তার পরবর্তী ভার্সনে সেট করুন। USB হোস্ট API আগের API লেভেলে উপস্থিত নেই।
- আপনি যদি চান যে আপনার অ্যাপ্লিকেশনটি একটি সংযুক্ত USB ডিভাইসের বিজ্ঞপ্তি পাবে, তাহলে আপনার প্রধান অ্যাক্টিভিটিতে
android.hardware.usb.action.USB_DEVICE_ATTACHEDইনটেন্টের জন্য একটি<intent-filter>এবং<meta-data>এলিমেন্ট পেয়ার নির্দিষ্ট করুন।<meta-data>এলিমেন্টটি একটি এক্সটার্নাল XML রিসোর্স ফাইলকে নির্দেশ করে যা আপনি যে ডিভাইসটি শনাক্ত করতে চান তার শনাক্তকরণ তথ্য ঘোষণা করে।XML রিসোর্স ফাইলে, আপনি ফিল্টার করতে চান এমন USB ডিভাইসের জন্য
<usb-device>এলিমেন্ট ঘোষণা করুন। নিচের তালিকায়<usb-device>-এর অ্যাট্রিবিউট বর্ণনা করা হয়েছে। সাধারণত, আপনি কোনও নির্দিষ্ট ডিভাইসের জন্য ফিল্টার করতে চাইলে ভেন্ডর ও প্রোডাক্ট আইডি ব্যবহার করুন এবং আপনি যদি USB ডিভাইসের কোনও গ্রুপের জন্য ফিল্টার করতে চান, যেমন মাস স্টোরেজ ডিভাইস বা ডিজিটাল ক্যামেরা, তাহলে ক্লাস, সাবক্লাস ও প্রোটোকল ব্যবহার করুন। আপনি এই অ্যাট্রিবিউটগুলির মধ্যে কোনওটিই বা সবকটি নির্দিষ্ট করতে পারেন। কোনও অ্যাট্রিবিউট নির্দিষ্ট না করলে তা প্রতিটি USB ডিভাইসের সাথে মিলে যায়, তাই আপনার অ্যাপ্লিকেশনের প্রয়োজন হলেই শুধুমাত্র এটি করুন:vendor-idproduct-idclasssubclassprotocol(ডিভাইস বা ইন্টারফেস)
res/xml/ডিরেক্টরিতে রিসোর্স ফাইল সেভ করুন। রিসোর্স ফাইলের নাম (.xml এক্সটেনশন ছাড়া) অবশ্যই<meta-data>এলিমেন্টে আপনার উল্লেখ করা নামের মতোই হতে হবে। XML রিসোর্স ফাইলের ফর্ম্যাট নিচে উদাহরণ হিসেবে দেওয়া হল।
ম্যানিফেস্ট এবং রিসোর্স ফাইলের উদাহরণ
নিচের উদাহরণে একটি স্যাম্পেল ম্যানিফেস্ট এবং তার সাথে সম্পর্কিত রিসোর্স ফাইল দেখানো হয়েছে:
<manifest ...> <uses-feature android:name="android.hardware.usb.host" /> <uses-sdk android:minSdkVersion="12" /> ... <application> <activity ...> ... <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> </intent-filter> <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" /> </activity> </application> </manifest>
এই ক্ষেত্রে, নিম্নলিখিত রিসোর্স ফাইলটি
res/xml/device_filter.xml-এ সেভ করা উচিত এবং উল্লেখ করে যে নির্দিষ্ট অ্যাট্রিবিউট সহ যেকোনও USB ডিভাইস
ফিল্টার করা উচিত:
<?xml version="1.0" encoding="utf-8"?> <resources> <usb-device vendor-id="1234" product-id="5678" class="255" subclass="66" protocol="1" /> </resources>
ডিভাইসের সাথে কাজ করা
ব্যবহারকারী Android-চালিত ডিভাইসে USB ডিভাইস কানেক্ট করলে, Android সিস্টেম নির্ধারণ করতে পারে যে আপনার অ্যাপ্লিকেশন কানেক্ট করা ডিভাইসে আগ্রহী কিনা। যদি তা হয়, তাহলে আপনি চাইলে ডিভাইসের সাথে কমিউনিকেশন সেট-আপ করতে পারবেন। এটি করতে, আপনার অ্যাপ্লিকেশনকে:
- ব্যবহারকারী কোনও USB ডিভাইস কানেক্ট করলে বিজ্ঞপ্তি পাওয়ার জন্য ইনটেন্ট ফিল্টার ব্যবহার করে কানেক্ট করা USB ডিভাইস খুঁজুন অথবা আগে থেকেই কানেক্ট করা USB ডিভাইস গণনা করে এটি করুন।
- USB ডিভাইসে কানেক্ট করার জন্য ব্যবহারকারীর কাছে অনুমতি চান, যদি আগে থেকে তা না পেয়ে থাকেন।
- উপযুক্ত ইন্টারফেস এন্ডপয়েন্টে ডেটা পড়া ও লেখার মাধ্যমে USB ডিভাইসের সাথে যোগাযোগ করুন।
ডিভাইস খুঁজে পাওয়া
ব্যবহারকারী কোনও ডিভাইস কানেক্ট করলে বিজ্ঞপ্তি পাওয়ার জন্য ইনটেন্ট ফিল্টার ব্যবহার করে অথবা আগে থেকেই কানেক্ট করা আছে এমন USB ডিভাইস গণনা করে, আপনার অ্যাপ্লিকেশন USB ডিভাইস খুঁজে পেতে পারে। আপনি যদি চান যে আপনার অ্যাপ্লিকেশন অটোমেটিক কোনও কাঙ্খিত ডিভাইস শনাক্ত করুক, তাহলে ইনটেন্ট ফিল্টার ব্যবহার করা উপযোগী। আপনি যদি সব কানেক্ট করা ডিভাইসের তালিকা পেতে চান অথবা আপনার অ্যাপ্লিকেশন যদি কোনও ইনটেন্টের জন্য ফিল্টার না করে, তাহলে কানেক্ট করা USB ডিভাইস গণনা করা উপযোগী।
ইনটেন্ট ফিল্টার ব্যবহার করুন
আপনার অ্যাপ্লিকেশন যাতে কোনও নির্দিষ্ট USB ডিভাইস খুঁজে পায়, তার জন্য আপনি android.hardware.usb.action.USB_DEVICE_ATTACHED ইনটেন্টের জন্য ফিল্টার করতে
একটি ইনটেন্ট ফিল্টার নির্দিষ্ট করতে পারেন। এই ইনটেন্ট ফিল্টারের
সাথে, আপনাকে একটি রিসোর্স ফাইল উল্লেখ করতে হবে যা USB ডিভাইসের প্রপার্টি উল্লেখ করে, যেমন প্রোডাক্ট এবং ভেন্ডর আইডি। ব্যবহারকারীরা আপনার ডিভাইস ফিল্টারের সাথে মেলে এমন একটি ডিভাইস কানেক্ট করলে, সিস্টেম তাদের একটি ডায়ালগ দেখায় যা জিজ্ঞাসা করে যে তারা আপনার অ্যাপ্লিকেশন শুরু করতে চায় কিনা।
ব্যবহারকারী অনুমতি দিলে, ডিভাইসটি ডিসকানেক্ট না হওয়া পর্যন্ত আপনার অ্যাপ্লিকেশন অটোমেটিক ডিভাইসটি অ্যাক্সেস করার অনুমতি পেয়ে যায়।
ইনটেন্ট ফিল্টার কীভাবে ঘোষণা করতে হয় তা নিম্নলিখিত উদাহরণ থেকে দেখুন:
<activity ...> ... <intent-filter> <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> </intent-filter> <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" /> </activity>
আপনি যে USB ডিভাইস ব্যবহার করতে চান তা উল্লেখ করে এমন সংশ্লিষ্ট রিসোর্স ফাইল কীভাবে ঘোষণা করবেন তা নিম্নলিখিত উদাহরণে দেখানো হয়েছে:
<?xml version="1.0" encoding="utf-8"?> <resources> <usb-device vendor-id="1234" product-id="5678" /> </resources>
আপনার অ্যাক্টিভিটিতে, আপনি UsbDevice পেতে পারেন যা
এই ধরনের ইনটেন্ট থেকে অ্যাটাচ করা ডিভাইসকে দেখায়:
Kotlin
val device: UsbDevice? = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE)
জাভা
UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
ডিভাইস গণনা করুন
আপনার অ্যাপ্লিকেশন চলাকালীন বর্তমানে কানেক্ট করা সব USB ডিভাইস পরীক্ষা করতে চাইলে, এটি বাসে ডিভাইসগুলি গণনা করতে পারে। কানেক্ট করা সব USB ডিভাইসের হ্যাশ ম্যাপ পেতে
getDeviceList() পদ্ধতি ব্যবহার করুন। আপনি যদি ম্যাপ থেকে কোনও ডিভাইস পেতে চান, তাহলে হ্যাশ ম্যাপটি USB ডিভাইসের নাম দ্বারা
কী করা হয়।
Kotlin
val manager = getSystemService(Context.USB_SERVICE) as UsbManager ... val deviceList = manager.getDeviceList() val device = deviceList.get("deviceName")
জাভা
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); ... HashMap<String, UsbDevice> deviceList = manager.getDeviceList(); UsbDevice device = deviceList.get("deviceName");
আপনি চাইলে, হ্যাশ ম্যাপ থেকে একটি ইটারেটর পেতে পারেন এবং প্রতিটি ডিভাইস একটি একটি করে প্রসেস করতে পারেন:
Kotlin
val manager = getSystemService(Context.USB_SERVICE) as UsbManager .. val deviceList: HashMap<String, UsbDevice> = manager.deviceList deviceList.values.forEach { device -> // your code }
জাভা
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE); ... HashMap<String, UsbDevice> deviceList = manager.getDeviceList(); Iterator<UsbDevice> deviceIterator = deviceList.values().iterator(); while(deviceIterator.hasNext()){ UsbDevice device = deviceIterator.next(); // your code }
কোনও ডিভাইসের সাথে যোগাযোগ করার অনুমতি পাওয়া
USB ডিভাইসের সাথে যোগাযোগ করার আগে, আপনার অ্যাপ্লিকেশনকে অবশ্যই আপনার ব্যবহারকারীদের কাছ থেকে অনুমতি নিতে হবে।
মনে রাখবেন: আপনার অ্যাপ্লিকেশন যদি USB ডিভাইস কানেক্ট করার সময় তা খুঁজে পেতে ইনটেন্ট ফিল্টার ব্যবহার করে, তাহলে ব্যবহারকারী আপনার অ্যাপ্লিকেশনকে ইনটেন্ট ম্যানেজ করার অনুমতি দিলে, এটি অটোমেটিক অনুমতি পেয়ে যায়। যদি তা না হয়, তাহলে ডিভাইসের সাথে কানেক্ট করার আগে আপনাকে অবশ্যই আপনার অ্যাপ্লিকেশনে স্পষ্টভাবে অনুমতি চাইতে হবে।
কিছু পরিস্থিতিতে স্পষ্টভাবে অনুমতি চাওয়ার প্রয়োজন হতে পারে, যেমন আপনার অ্যাপ্লিকেশন আগে থেকেই কানেক্ট করা 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 device: UsbDevice? = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE) if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { device?.apply { // call method to set up device communication } } else { Log.d(TAG, "permission denied for device $device") } } } } }
জাভা
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) { UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { if(device != null){ // call method to set up device communication } } else { Log.d(TAG, "permission denied for device " + device); } } } } };
ব্রডকাস্ট রিসিভার রেজিস্টার করতে, আপনার অ্যাক্টিভিটিতে onCreate() পদ্ধতিতে এটি যোগ করুন:
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), PendingIntent.FLAG_IMMUTABLE) 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), PendingIntent.FLAG_IMMUTABLE); IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); registerReceiver(usbReceiver, filter);
ডিভাইসে কানেক্ট করার জন্য ব্যবহারকারীর থেকে অনুমতি চাওয়ার ডায়ালগ দেখাতে, requestPermission() মেথড কল করুন:
Kotlin
lateinit var device: UsbDevice ... usbManager.requestPermission(device, permissionIntent)
জাভা
UsbDevice device; ... usbManager.requestPermission(device, permissionIntent);
ব্যবহারকারী ডায়ালগের উত্তর দিলে, আপনার সম্প্রচার রিসিভার সেই ইনটেন্ট পায় যাতে
EXTRA_PERMISSION_GRANTED অতিরিক্ত থাকে, এটি একটি বুলিয়ান
যা উত্তরকে দেখায়। ডিভাইসের সাথে কানেক্ট করার আগে, এই অতিরিক্ত ভ্যালু true কিনা তা চেক করুন।
ডিভাইসের সাথে যোগাযোগ করুন
USB ডিভাইসের সাথে কমিউনিকেশন সিঙ্ক্রোনাস বা অ্যাসিঙ্ক্রোনাস হতে পারে। যেকোনও ক্ষেত্রেই, সমস্ত ডেটা ট্রান্সমিশন করার জন্য আপনার একটি নতুন থ্রেড তৈরি করা উচিত, যাতে আপনি UI থ্রেড ব্লক না করেন। কোনও ডিভাইসের সাথে যোগাযোগ সঠিকভাবে সেট-আপ করতে, আপনি যে ডিভাইসের সাথে যোগাযোগ করতে চান, সেটির উপযুক্ত
UsbInterface এবং UsbEndpoint আপনাকে পেতে হবে এবং
UsbDeviceConnection সহ এই এন্ডপয়েন্টে অনুরোধ পাঠাতে হবে। সাধারণত, আপনার কোড:
- আপনি ডিভাইসের সাথে যোগাযোগ করতে চান কিনা তা নির্ধারণ করতে
UsbDeviceঅবজেক্টের অ্যাট্রিবিউট, যেমন প্রোডাক্ট আইডি, ভেন্ডর আইডি বা ডিভাইস ক্লাস চেক করুন। - আপনি যখন নিশ্চিত হবেন যে আপনি ডিভাইসের সাথে যোগাযোগ করতে চান, তখন উপযুক্ত
UsbInterfaceখুঁজুন যা আপনি যোগাযোগের জন্য ব্যবহার করতে চান এবং সেই সাথে সেই ইন্টারফেসের উপযুক্তUsbEndpointখুঁজুন। ইন্টারফেসে এক বা একাধিক এন্ডপয়েন্ট থাকতে পারে এবং সাধারণত দ্বিমুখী যোগাযোগের জন্য একটি ইনপুট এবং আউটপুট এন্ডপয়েন্ট থাকবে। - আপনি সঠিক এন্ডপয়েন্ট খুঁজে পেলে, সেই এন্ডপয়েন্টে একটি
UsbDeviceConnectionখুলুন। bulkTransfer()বাcontrolTransfer()পদ্ধতি ব্যবহার করে এন্ডপয়েন্টে যে ডেটা ট্রান্সমিট করতে চান তা প্রদান করুন। প্রধান UI থ্রেড ব্লক করা আটকাতে, আপনাকে অন্য থ্রেডে এই ধাপটি সম্পূর্ণ করতে হবে। Android-এ থ্রেড ব্যবহার করার ব্যাপারে আরও জানতে, প্রসেস ও থ্রেড দেখুন।
নিম্নলিখিত কোড স্নিপেট হল সিঙ্ক্রোনাস ডেটা ট্রান্সফার করার একটি সাধারণ উপায়। আপনার কোডে আরও লজিক থাকা উচিত যাতে যোগাযোগের জন্য সঠিক ইন্টারফেস এবং এন্ডপয়েন্ট সঠিকভাবে খুঁজে পাওয়া যায় এবং মূল UI থ্রেড ছাড়া অন্য থ্রেডে ডেটা ট্রান্সফার করা উচিত:
Kotlin
private lateinit var bytes: ByteArray private val TIMEOUT = 0 private val forceClaim = true ... device?.getInterface(0)?.also { intf -> intf.getEndpoint(0)?.also { endpoint -> usbManager.openDevice(device)?.apply { claimInterface(intf, forceClaim) bulkTransfer(endpoint, bytes, bytes.size, TIMEOUT) //do in another thread } } }
জাভা
private Byte[] bytes; private static int TIMEOUT = 0; private boolean forceClaim = true; ... UsbInterface intf = device.getInterface(0); UsbEndpoint endpoint = intf.getEndpoint(0); UsbDeviceConnection connection = usbManager.openDevice(device); connection.claimInterface(intf, forceClaim); connection.bulkTransfer(endpoint, bytes, bytes.length, TIMEOUT); //do in another thread
অ্যাসিঙ্ক্রোনাসভাবে ডেটা পাঠাতে, UsbRequest ক্লাস ব্যবহার করে initialize এবং queue একটি অ্যাসিঙ্ক্রোনাস অনুরোধ করুন, তারপর requestWait()-এর সাথে
ফলাফলের জন্য অপেক্ষা করুন।
ডিভাইসের সাথে যোগাযোগ বন্ধ করা হচ্ছে
কোনও ডিভাইসের সাথে আপনার যোগাযোগ করা হয়ে গেলে অথবা ডিভাইসটি বিচ্ছিন্ন করা হলে, releaseInterface() এবং
close()-এ কল করে
UsbInterface এবং UsbDeviceConnection বন্ধ করুন। বিচ্ছিন্ন ইভেন্ট শোনার জন্য,
নিচের মতো একটি ব্রডকাস্ট রিসিভার তৈরি করুন:
Kotlin
var usbReceiver: BroadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (UsbManager.ACTION_USB_DEVICE_DETACHED == intent.action) { val device: UsbDevice? = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE) device?.apply { // call your method that cleans up and closes communication with the device } } } }
জাভা
BroadcastReceiver usbReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) { UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (device != null) { // call your method that cleans up and closes communication with the device } } } };
ম্যানিফেস্টের মধ্যে নয়, অ্যাপ্লিকেশনের মধ্যে ব্রডকাস্ট রিসিভার তৈরি করলে, আপনার অ্যাপ্লিকেশন শুধুমাত্র চালু থাকার সময় ডিট্যাচ করা ইভেন্ট ম্যানেজ করতে পারে। এইভাবে, ডিটাচ করা ইভেন্টগুলি শুধুমাত্র বর্তমানে চলছে এমন অ্যাপ্লিকেশনে পাঠানো হয় এবং সমস্ত অ্যাপ্লিকেশনে ব্রডকাস্ট করা হয় না।