ইউএসবি হোস্ট ওভারভিউ

যখন আপনার Android-চালিত ডিভাইসটি USB হোস্ট মোডে থাকে, তখন এটি USB হোস্ট হিসাবে কাজ করে, বাসকে শক্তি দেয় এবং সংযুক্ত USB ডিভাইসগুলিকে গণনা করে৷ USB হোস্ট মোড Android 3.1 এবং উচ্চতর সংস্করণে সমর্থিত।

API ওভারভিউ

আপনি শুরু করার আগে, আপনাকে যে ক্লাসগুলির সাথে কাজ করতে হবে তা বোঝা গুরুত্বপূর্ণ। নিম্নলিখিত টেবিলটি android.hardware.usb প্যাকেজে USB হোস্ট API গুলি বর্ণনা করে৷

সারণী 1. USB হোস্ট API

ক্লাস বর্ণনা
UsbManager আপনাকে সংযুক্ত ইউএসবি ডিভাইসগুলির সাথে গণনা করতে এবং যোগাযোগ করতে দেয়৷
UsbDevice একটি সংযুক্ত ইউএসবি ডিভাইসের প্রতিনিধিত্ব করে এবং এটির সনাক্তকরণ তথ্য, ইন্টারফেস এবং শেষ পয়েন্টগুলি অ্যাক্সেস করার পদ্ধতি ধারণ করে।
UsbInterface একটি USB ডিভাইসের একটি ইন্টারফেস প্রতিনিধিত্ব করে, যা ডিভাইসের জন্য কার্যকারিতার একটি সেট সংজ্ঞায়িত করে। একটি ডিভাইসে এক বা একাধিক ইন্টারফেস থাকতে পারে যার মাধ্যমে যোগাযোগ করা যায়।
UsbEndpoint একটি ইন্টারফেস এন্ডপয়েন্ট প্রতিনিধিত্ব করে, যা এই ইন্টারফেসের জন্য একটি যোগাযোগ চ্যানেল। একটি ইন্টারফেসে এক বা একাধিক এন্ডপয়েন্ট থাকতে পারে এবং সাধারণত ডিভাইসের সাথে দ্বিমুখী যোগাযোগের জন্য ইনপুট এবং আউটপুট এন্ডপয়েন্ট থাকে।
UsbDeviceConnection ডিভাইসের সাথে একটি সংযোগের প্রতিনিধিত্ব করে, যা শেষ পয়েন্টে ডেটা স্থানান্তর করে। এই ক্লাস আপনাকে সিঙ্ক্রোনাস বা অ্যাসিঙ্ক্রোনাসভাবে ডেটা পাঠাতে দেয়।
UsbRequest একটি UsbDeviceConnection মাধ্যমে একটি ডিভাইসের সাথে যোগাযোগ করার জন্য একটি অ্যাসিঙ্ক্রোনাস অনুরোধের প্রতিনিধিত্ব করে৷
UsbConstants লিনাক্স কার্নেলের linux/usb/ch9.h-এর সংজ্ঞার সাথে মিলে যাওয়া USB ধ্রুবককে সংজ্ঞায়িত করে।

বেশিরভাগ পরিস্থিতিতে, একটি USB ডিভাইসের সাথে যোগাযোগ করার সময় আপনাকে এই সমস্ত ক্লাসগুলি ব্যবহার করতে হবে ( যদি আপনি অ্যাসিঙ্ক্রোনাস যোগাযোগ করেন তবেই UsbRequest প্রয়োজন হয়)৷ সাধারণভাবে, আপনি পছন্দসই UsbDevice পুনরুদ্ধার করতে একটি UsbManager পাবেন। আপনার কাছে যখন ডিভাইস থাকে, তখন যোগাযোগ করার জন্য আপনাকে উপযুক্ত UsbInterface এবং সেই ইন্টারফেসের UsbEndpoint খুঁজে বের করতে হবে। একবার আপনি সঠিক এন্ডপয়েন্ট পেয়ে গেলে, USB ডিভাইসের সাথে যোগাযোগ করতে একটি UsbDeviceConnection খুলুন।

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

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

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

    XML রিসোর্স ফাইলে, আপনি যে USB ডিভাইসগুলি ফিল্টার করতে চান তার জন্য <usb-device> উপাদানগুলি ঘোষণা করুন। নিচের তালিকাটি <usb-device> এর বৈশিষ্ট্য বর্ণনা করে। সাধারণভাবে, যদি আপনি একটি নির্দিষ্ট ডিভাইসের জন্য ফিল্টার করতে চান তাহলে বিক্রেতা এবং পণ্যের আইডি ব্যবহার করুন এবং যদি আপনি USB ডিভাইসের একটি গ্রুপ যেমন ভর স্টোরেজ ডিভাইস বা ডিজিটাল ক্যামেরার জন্য ফিল্টার করতে চান তাহলে ক্লাস, সাবক্লাস এবং প্রোটোকল ব্যবহার করুন। আপনি এই বৈশিষ্ট্যগুলির কোনটি বা সমস্ত নির্দিষ্ট করতে পারবেন না। কোনও বৈশিষ্ট্য নির্দিষ্ট করা প্রতিটি USB ডিভাইসের সাথে মেলে না, তাই আপনার অ্যাপ্লিকেশনের প্রয়োজন হলেই এটি করুন:

    • vendor-id
    • product-id
    • class
    • subclass
    • protocol (ডিভাইস বা ইন্টারফেস)

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

  1. ব্যবহারকারী একটি USB ডিভাইস সংযোগ করলে অথবা ইতিমধ্যেই সংযুক্ত USB ডিভাইসগুলিকে গণনা করে বিজ্ঞপ্তি পাওয়ার জন্য একটি অভিপ্রায় ফিল্টার ব্যবহার করে সংযুক্ত USB ডিভাইসগুলি আবিষ্কার করুন৷
  2. ইউএসবি ডিভাইসের সাথে সংযোগ করার অনুমতির জন্য ব্যবহারকারীকে জিজ্ঞাসা করুন, যদি ইতিমধ্যে প্রাপ্ত না হয়।
  3. উপযুক্ত ইন্টারফেস এন্ডপয়েন্টে ডেটা পড়ে এবং লিখে 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>

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

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

<resources>
    <usb-device vendor-id="1234" product-id="5678" />
</resources>

আপনার ক্রিয়াকলাপে, আপনি UsbDevice পেতে পারেন যা এই মত উদ্দেশ্য থেকে সংযুক্ত ডিভাইসের প্রতিনিধিত্ব করে:

কোটলিন

val device: UsbDevice? = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE)

জাভা

UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);

ডিভাইসগুলি গণনা করুন

আপনার অ্যাপ্লিকেশনটি চলমান থাকাকালীন সংযুক্ত সমস্ত USB ডিভাইসগুলি পরিদর্শন করতে আগ্রহী হলে, এটি বাসে থাকা ডিভাইসগুলিকে গণনা করতে পারে৷ কানেক্ট করা সমস্ত USB ডিভাইসের হ্যাশ ম্যাপ পেতে getDeviceList() পদ্ধতি ব্যবহার করুন। আপনি যদি মানচিত্র থেকে একটি ডিভাইস পেতে চান তবে হ্যাশ মানচিত্রটি USB ডিভাইসের নাম দ্বারা চাবি করা হয়।

কোটলিন

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

যদি ইচ্ছা হয়, আপনি হ্যাশ মানচিত্র থেকে একটি পুনরাবৃত্তিকারীও পেতে পারেন এবং প্রতিটি ডিভাইস একে একে প্রক্রিয়া করতে পারেন:

কোটলিন

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() কলটি ব্যবহারকারীর কাছে ডিভাইসের সাথে সংযোগ করার অনুমতি চেয়ে একটি ডায়ালগ প্রদর্শন করে। নিম্নলিখিত নমুনা কোড দেখায় কিভাবে সম্প্রচার রিসিভার তৈরি করতে হয়:

কোটলিন

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() পদ্ধতিতে এটি যোগ করুন:

কোটলিন

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() পদ্ধতিতে কল করুন:

কোটলিন

lateinit var device: UsbDevice
...
usbManager.requestPermission(device, permissionIntent)

জাভা

UsbDevice device;
...
usbManager.requestPermission(device, permissionIntent);

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

একটি ডিভাইসের সাথে যোগাযোগ করুন

একটি USB ডিভাইসের সাথে যোগাযোগ সিঙ্ক্রোনাস বা অ্যাসিঙ্ক্রোনাস হতে পারে। উভয় ক্ষেত্রেই, আপনার একটি নতুন থ্রেড তৈরি করা উচিত যাতে সমস্ত ডেটা ট্রান্সমিশন করা যায়, যাতে আপনি UI থ্রেড ব্লক না করেন। একটি ডিভাইসের সাথে যোগাযোগ সঠিকভাবে সেট আপ করার জন্য, আপনি যে ডিভাইসে যোগাযোগ করতে চান তার উপযুক্ত UsbInterface এবং UsbEndpoint পেতে হবে এবং একটি UsbDeviceConnection এর সাথে এই এন্ডপয়েন্টে অনুরোধ পাঠাতে হবে। সাধারণভাবে, আপনার কোড করা উচিত:

  • আপনি ডিভাইসের সাথে যোগাযোগ করতে চান কিনা তা নির্ধারণ করতে একটি UsbDevice অবজেক্টের বৈশিষ্ট্যগুলি পরীক্ষা করুন, যেমন পণ্য আইডি, বিক্রেতা আইডি, বা ডিভাইস ক্লাস।
  • আপনি যখন নিশ্চিত হন যে আপনি ডিভাইসটির সাথে যোগাযোগ করতে চান, তখন উপযুক্ত UsbInterface খুঁজুন যা আপনি সেই ইন্টারফেসের উপযুক্ত UsbEndpoint সাথে যোগাযোগ করতে ব্যবহার করতে চান। ইন্টারফেসে এক বা একাধিক এন্ডপয়েন্ট থাকতে পারে এবং সাধারণত দ্বিমুখী যোগাযোগের জন্য একটি ইনপুট এবং আউটপুট এন্ডপয়েন্ট থাকবে।
  • যখন আপনি সঠিক এন্ডপয়েন্টটি খুঁজে পান, সেই এন্ডপয়েন্টে একটি UsbDeviceConnection খুলুন।
  • bulkTransfer() বা controlTransfer() পদ্ধতির মাধ্যমে আপনি যে ডেটা এন্ডপয়েন্টে প্রেরণ করতে চান তা সরবরাহ করুন। প্রধান UI থ্রেড ব্লক করা প্রতিরোধ করার জন্য আপনাকে অন্য থ্রেডে এই পদক্ষেপটি চালাতে হবে। অ্যান্ড্রয়েডে থ্রেড ব্যবহার সম্পর্কে আরও তথ্যের জন্য, প্রসেস এবং থ্রেড দেখুন।

নিম্নলিখিত কোড স্নিপেট একটি সিঙ্ক্রোনাস ডেটা স্থানান্তর করার একটি তুচ্ছ উপায়। যোগাযোগের জন্য সঠিক ইন্টারফেস এবং এন্ডপয়েন্টগুলি সঠিকভাবে খুঁজে পেতে আপনার কোডের আরও যুক্তি থাকা উচিত এবং মূল UI থ্রেডের চেয়ে আলাদা থ্রেডে ডেটা স্থানান্তর করা উচিত:

কোটলিন

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

অ্যাসিঙ্ক্রোনাসভাবে ডেটা পাঠাতে, একটি অ্যাসিঙ্ক্রোনাস অনুরোধ initialize এবং queue UsbRequest ক্লাস ব্যবহার করুন, তারপর requestWait() দিয়ে ফলাফলের জন্য অপেক্ষা করুন।

একটি ডিভাইসের সাথে যোগাযোগ বন্ধ করা

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

কোটলিন

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

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