BluetoothAdapter — এটি কী, পদ্ধতি এবং Android-এ Bluetooth ব্যবস্থাপনা

লেখক: IT Sectr প্রকাশিত: 2026-07-16 পড়ার সময়: 10 মিনিট

BluetoothAdapter একটি সিস্টেম Android ক্লাস যা ডিভাইসের স্থানীয় Bluetooth অ্যাডাপ্টার উপস্থাপন করে। BluetoothAdapter Android-এ সমস্ত Bluetooth অপারেশনের জন্য প্রবেশ বিন্দু: রেডিও চালু করা (enable), ডিভাইস স্ক্যান করা, দৃশ্যমানতা পরিচালনা করা (setScanMode), এবং অ্যাডাপ্টার তথ্য প্রাপ্ত করা (getName, getAddress, getState)। ক্লাসটি BluetoothManager.getAdapter() (API 18+) বা BluetoothAdapter.getDefaultAdapter() এর মাধ্যমে উপলব্ধ। Bluetooth মডিউল ছাড়া ডিভাইসে, getDefaultAdapter() null ফেরত দেয়। Android Developers, 2026 অনুসারে, BluetoothAdapter API 5 থেকে শুরু করে Android-এ যেকোনো BLE অ্যাপ্লিকেশনের জন্য বাধ্যতামূলক উপাদান।

মুখ্য বিষয়

  • BluetoothAdapter ডিভাইসের স্থানীয় Bluetooth অ্যাডাপ্টার পরিচালনার জন্য একটি সিস্টেম Android ক্লাস
  • getDefaultAdapter() একটি স্ট্যাটিক পদ্ধতি যা ইনস্ট্যান্স পাওয়ার জন্য; Bluetooth ছাড়া ডিভাইসে null ফেরত দেয়
  • getBluetoothLeScanner() আধুনিক BLE স্ক্যানার (API 21+) অ্যাক্সেস করার পদ্ধতি
  • enable/disable Bluetooth রেডিও চালু এবং বন্ধ করার পদ্ধতি (BLUETOOTH_ADMIN অনুমতি প্রয়োজন)
  • startDiscovery/startLeScan ক্লাসিক এবং BLE স্ক্যানিং পদ্ধতি (LE Scan অবচিত, BluetoothLeScanner ব্যবহার করুন)

BluetoothAdapter কী: সারমর্ম এবং ইনস্ট্যান্স প্রাপ্তি

BluetoothAdapter একটি Android ডিভাইসের ভৌত Bluetooth অ্যাডাপ্টার উপস্থাপন করে। প্রতিটি ডিভাইসে ঠিক একটি অ্যাডাপ্টার থাকে (ব্যতিক্রম Android Automotive যাতে একাধিক Bluetooth চিপ থাকে, যা BluetoothManager.getAdapterList() ব্যবহার করে)। BluetoothAdapter রেডিও অবস্থা সংপুটিত করে: STATE_OFF (0), STATE_TURNING_ON (1), STATE_ON (2), STATE_TURNING_OFF (3)। অবস্থা ACTION_STATE_CHANGED-এ BroadcastReceiver এর মাধ্যমে ট্র্যাক করা হয়।

BluetoothAdapter ইনস্ট্যান্স প্রাপ্তি Android-এ যেকোনো BLE অ্যাপ্লিকেশনের প্রথম ধাপ। প্রস্তাবিত পদ্ধতি হল API 18+ থেকে BluetoothManager.getAdapter() এর মাধ্যমে। বিকল্প হল স্ট্যাটিক পদ্ধতি BluetoothAdapter.getDefaultAdapter(), যা API 5 থেকে কাজ করে তবে কম নমনীয়। উভয় পদ্ধতি null ফেরত দেয় যদি ডিভাইসে Bluetooth মডিউল না থাকে (শুধুমাত্র Wi-Fi ট্যাবলেট, এমুলেটর)। null পরীক্ষা বাধ্যতামূলক: অ্যাপ্লিকেশনটিকে সঠিকভাবে বন্ধ করতে হবে বা BLE বৈশিষ্ট্যগুলি নিষ্ক্রিয় করতে হবে।

kotlin
// BluetoothAdapter প্রাপ্তি (প্রস্তাবিত)
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothManager
import android.content.Context

class BluetoothHelper(context: Context) {

    private val bluetoothAdapter: BluetoothAdapter?

    init {
        // পদ্ধতি 1: BluetoothManager এর মাধ্যমে (API 18+)
        val manager = context.getSystemService(Context.BLUETOOTH_SERVICE)
                as BluetoothManager?
        bluetoothAdapter = manager?.adapter

        // পদ্ধতি 2: স্ট্যাটিক পদ্ধতির মাধ্যমে (API 5+)
        // val adapter = BluetoothAdapter.getDefaultAdapter()

        // null পরীক্ষা
        if (bluetoothAdapter == null) {
            // ডিভাইস Bluetooth সমর্থন করে না
        }
    }

    // Bluetooth অবস্থা পরীক্ষা করুন
    fun isBluetoothEnabled(): Boolean {
        return bluetoothAdapter?.isEnabled == true
    }

    // অ্যাডাপ্টার তথ্য প্রাপ্তি
    fun getAdapterInfo(): Map<String, String> {
        return mapOf(
            "name" to (bluetoothAdapter?.name ?: "N/A"),
            "address" to (bluetoothAdapter?.address ?: "N/A"),
            "state" to (bluetoothAdapter?.state?.toString() ?: "N/A"),
            "scanMode" to (bluetoothAdapter?.scanMode?.toString() ?: "N/A")
        )
    }
}

BluetoothHelper ক্লাস পরবর্তী null পরীক্ষার সাথে BluetoothManager এর মাধ্যমে BluetoothAdapter প্রাপ্তি প্রদর্শন করে। isBluetoothEnabled isEnabled পরীক্ষা করে — যেকোনো BLE অপারেশনের আগে একটি বাধ্যতামূলক শর্ত। getAdapterInfo ডিভাইসের নাম, MAC ঠিকানা, অবস্থা এবং দৃশ্যমানতা মোড ফেরত দেয়। গুরুত্বপূর্ণ: Android 10+ (API 29+) এ, সিস্টেম পরিষেবা একটি জাল MAC ঠিকানা (02:00:00:00:00:00) ফেরত দেয় যদি অ্যাপ্লিকেশনের BLUETOOTH_ADMIN এবং ACCESS_FINE_LOCATION অনুমতি না থাকে।

BluetoothAdapter এর প্রধান পদ্ধতি: enable, disable, getState, getAddress

BluetoothAdapter Bluetooth রেডিও নিয়ন্ত্রণের জন্য পদ্ধতি প্রদান করে। enable() এবং disable() Bluetooth চালু এবং বন্ধ করে। উভয় পদ্ধতির জন্য BLUETOOTH_ADMIN অনুমতি প্রয়োজন এবং অ্যাসিঙ্ক্রোনাসভাবে সম্পাদিত হয়: enable() কল করার পর, সিস্টেম রেডিও চালু করার প্রক্রিয়া শুরু করে, এবং অবস্থা BluetoothAdapter.ACTION_STATE_CHANGED অ্যাকশনের সাথে BroadcastReceiver এর মাধ্যমে ট্র্যাক করা হয়। Android 10+ এ, enable() এবং disable() এর জন্য অতিরিক্ত সিস্টেম বিশেষাধিকার প্রয়োজন — সাধারণ অ্যাপ্লিকেশন ব্যবহারকারী সংলাপ ছাড়া প্রোগ্রামেটিকভাবে Bluetooth নিয়ন্ত্রণ করতে পারে না।

getState() অ্যাডাপ্টারের বর্তমান অবস্থা ফেরত দেয়: STATE_OFF (10), STATE_TURNING_ON (11), STATE_ON (12), STATE_TURNING_OFF (13)। getAddress() Bluetooth অ্যাডাপ্টারের MAC ঠিকানা ফেরত দেয়। Android 6+ এ, MAC ঠিকানা অনুরোধ করতে ACCESS_FINE_LOCATION (বা API 31+ এর জন্য ACCESS_COARSE_LOCATION) প্রয়োজন। Android 10+ এ, getAddress() ধ্রুবক ঠিকানা 02:00:00:00:00:00 ফেরত দেয় — প্রকৃত ঠিকানা পাবলিক API এর মাধ্যমে উপলব্ধ নয়।

getScanMode() অ্যাডাপ্টারের দৃশ্যমানতা মোড নির্ধারণ করে: SCAN_MODE_NONE (অদৃশ্য), SCAN_MODE_CONNECTABLE (সংযুক্ত ডিভাইসের জন্য দৃশ্য), SCAN_MODE_CONNECTABLE_DISCOVERABLE (সবার জন্য দৃশ্য)। দৃশ্যমানতা মোড নিরাপত্তার জন্য সময়ে সীমিত (সাধারণত 60–300 সেকেন্ড)। setScanMode() এর মাধ্যমে মোড সেট করতে Android 10+ এ BLUETOOTH_ADMIN এবং সিস্টেম অনুমতি প্রয়োজন।

পদ্ধতিবিবরণপ্রয়োজনীয় অনুমতি
enable()Bluetooth রেডিও চালু করাBLUETOOTH_ADMIN
disable()Bluetooth রেডিও বন্ধ করাBLUETOOTH_ADMIN
getState()অ্যাডাপ্টারের বর্তমান অবস্থাBLUETOOTH
getAddress()অ্যাডাপ্টারের MAC ঠিকানাBLUETOOTH + ACCESS_FINE_LOCATION (API 23+)
getScanMode()ডিভাইসের দৃশ্যমানতা মোডBLUETOOTH
setScanMode()দৃশ্যমানতা মোড সেট করাBLUETOOTH_ADMIN

ডিভাইস স্ক্যানিং: startDiscovery এবং BluetoothLeScanner

BluetoothAdapter দুই ধরনের স্ক্যানিং সমর্থন করে। ক্লাসিক Bluetooth স্ক্যানিং (BR/EDR) startDiscovery() এর মাধ্যমে শুরু হয় — এটি ফোন এবং হেডসেট সহ সব ধরনের Bluetooth ডিভাইস আবিষ্কার করে। ফলাফল BluetoothDevice.ACTION_FOUND অ্যাকশনের সাথে BroadcastReceiver এর মাধ্যমে ফেরত দেওয়া হয়। startDiscovery() 12 সেকেন্ড পর্যন্ত চলে এবং cancelDiscovery() কল করে বাতিল করা যেতে পারে। এই পদ্ধতিটি BLE এর জন্য অবচিত — BluetoothLeScanner ব্যবহার করুন।

BluetoothAdapter এর মাধ্যমে BLE স্ক্যানিং অবচিত পদ্ধতি startLeScan(LeScanCallback) ব্যবহার করে। API 21 থেকে শুরু করে, Google BluetoothLeScanner ব্যবহারের সুপারিশ করে, যা BluetoothAdapter.getBluetoothLeScanner() এর মাধ্যমে প্রাপ্ত হয়। BluetoothLeScanner আরও নমনীয় API প্রদান করে: ScanSettings এর মাধ্যমে স্ক্যানিং কনফিগারেশন (মোড, কলব্যাক প্রকার, ম্যাচ মোড), ScanFilter এর মাধ্যমে ফিল্টারিং (সার্ভিস UUID, ডিভাইস নাম, MAC ঠিকানা দ্বারা), এবং ব্যাকগ্রাউন্ড স্ক্যানিংয়ের জন্য PendingIntent সমর্থন।

kotlin
// পুরানো (অবচিত) বনাম নতুন BLE স্ক্যানিং API
import android.bluetooth.BluetoothAdapter
import android.bluetooth.le.*

class BLEScanner(private val bluetoothAdapter: BluetoothAdapter?) {

    // অবচিত: startLeScan (API 18+, API 21)
    @Suppress("DEPRECATION")
    fun legacyScan() {
        bluetoothAdapter?.startLeScan { device, rssi, scanRecord ->
            print("Found (LE Scan): $device.name, RSSI: $rssi")
        }
    }

    // নতুন: BluetoothLeScanner (API 21+)
    fun modernScan() {
        val scanner = bluetoothAdapter?.bluetoothLeScanner
            ?: return

        // স্ক্যান সেটিংস
        val settings = ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
            .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
            .setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE)
            .build()

        // পরিষেবা দ্বারা ফিল্টার (হার্ট রেট UUID)
        val filters = listOf(
            ScanFilter.Builder()
                .setServiceUuid(ParcelUuid.fromString("0000180D-0000-1000-8000-00805F9B34FB"))
                .build()
        )

        // স্ক্যান শুরু করুন
        scanner.startScan(filters, settings, object : ScanCallback() {
            override fun onScanResult(callbackType: Int, result: ScanResult) {
                val device = result.device
                val rssi = result.rssi
                print("Found (BLE Scanner): ${device.name}, RSSI: $rssi, address: ${device.address}")
            }

            override fun onScanFailed(errorCode: Int) {
                print("Scan error: $errorCode")
            }
        })
    }
}

BLEScanner ক্লাস অবচিত startLeScan এবং আধুনিক BluetoothLeScanner তুলনা করে। legacyScan এ, LeScanCallback BluetoothDevice, RSSI এবং কাঁচা scanRecord গ্রহণ করে। modernScan এ, LOW_LATENCY মোড (সর্বোচ্চ আবিষ্কার গতি) সহ ScanSettings এবং হার্ট রেট সার্ভিস UUID (0x180D) দ্বারা ফিল্টার করার জন্য ScanFilter ব্যবহার করা হয়। ScanCallback বিস্তারিত তথ্য সহ ScanResult অবজেক্ট প্রদান করে: নাম, RSSI, বিজ্ঞাপন ডেটা, সংযোগ প্রকার।

BluetoothManager: BluetoothAdapter অ্যাক্সেস করার জন্য আধুনিক API

BluetoothManager একটি সিস্টেম Android পরিষেবা, যা API 18 (Android 4.3) এ প্রবর্তিত, Bluetooth অপারেশন পরিচালনার জন্য। API 18 এর আগে, BluetoothAdapter প্রাপ্তির একমাত্র উপায় ছিল স্ট্যাটিক পদ্ধতি getDefaultAdapter()। BluetoothManager প্রদান করে: adapter — একটি BluetoothAdapter ইনস্ট্যান্স, getConnectedDevices() — সংযুক্ত ডিভাইসের তালিকা, getDevicesMatchingConnectionStates() — অবস্থা অনুযায়ী ফিল্টারিং। BluetoothManager পুরানো APIs এ BluetoothLeScanner প্রাপ্তির জন্যও ব্যবহৃত হয়।

BluetoothManager এর সুবিধা সরাসরি BluetoothAdapter.getDefaultAdapter() কল করার তুলনায়: অ্যাপ্লিকেশন একটি স্ট্যাটিক সিঙ্গলটনের উপর নির্ভর করে না, ম্যানেজার প্রসঙ্গ (Activity/Application) সম্মান করে, যা Android Enterprise এর মাল্টি-অ্যাকাউন্ট পরিস্থিতির জন্য গুরুত্বপূর্ণ। একাধিক Bluetooth চিপযুক্ত Android Automotive এ, BluetoothManager.getAdapterList() সমস্ত উপলব্ধ অ্যাডাপ্টার ফেরত দেয় — BluetoothAdapter.getDefaultAdapter() শুধুমাত্র প্রথমটি ফেরত দেয়।

kotlin
// BLE এর জন্য BluetoothManager ব্যবহার
class BLEConnection(context: Context) {

    private val bluetoothManager: BluetoothManager =
        context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager

    private val adapter: BluetoothAdapter? = bluetoothManager.adapter

    // সংযুক্ত BLE ডিভাইসের তালিকা প্রাপ্তি
    fun getConnectedDevices(): List<BluetoothDevice> {
        return bluetoothManager.getConnectedDevices(
            BluetoothProfile.GATT
        )
    }

    // অবস্থা দ্বারা ডিভাইস ফিল্টার
    fun getDevicesByState(states: IntArray): List<BluetoothDevice> {
        return bluetoothManager.getDevicesMatchingConnectionStates(
            BluetoothProfile.GATT, states
        )
    }

    // ডিভাইসে BLE সমর্থন পরীক্ষা
    fun isBLESupported(): Boolean {
        return adapter != null && context.packageManager
            .hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)
    }

    // সিস্টেম সংলাপের মাধ্যমে Bluetooth চালু অনুরোধ
    fun requestEnableBluetooth(activity: MainActivity) {
        if (adapter?.isEnabled == false) {
            val intent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
            activity.startActivityForResult(intent, REQUEST_ENABLE_BT)
        }
    }

    companion object {
        const val REQUEST_ENABLE_BT = 1001
    }
}

BLEConnection ক্লাস BluetoothAdapter অ্যাক্সেস করতে এবং সংযুক্ত GATT ডিভাইসের তালিকা পেতে BluetoothManager ব্যবহার করে। isBLESupported PackageManager.hasSystemFeature(FEATURE_BLUETOOTH_LE) এর মাধ্যমে BLE রেডিও পরীক্ষা করে — BLE ছাড়া Bluetooth Classic ডিভাইসের জন্য একটি গুরুত্বপূর্ণ পরীক্ষা। requestEnableBluetooth Bluetooth চালু করার সিস্টেম সংলাপ দেখায় (ACTION_REQUEST_ENABLE), যার জন্য BLUETOOTH_ADMIN অনুমতি প্রয়োজন হয় না — এটি সিস্টেম অ্যাপ্লিকেশন ছাড়া Android 10+ এ Bluetooth চালু করার একমাত্র আইনি উপায়।

BluetoothAdapter নিয়ে কাজ করার জন্য Android অনুমতি

অনুমতিগুলি BluetoothAdapter এর জন্য প্রতিটি Android সংস্করণের সাথে বিবর্তিত হয়েছে। Android 6–11 (API 23–30) এ, BLE স্ক্যানিংয়ের জন্য BLUETOOTH, BLUETOOTH_ADMIN এবং ACCESS_FINE_LOCATION বাধ্যতামূলক। Android 12+ (API 31+) এ, Google অনুমতিগুলি বিভক্ত করেছে: ACCESS_FINE_LOCATION প্রতিস্থাপিত হয়েছে BLUETOOTH_SCAN (স্ক্যানিং), BLUETOOTH_CONNECT (সংযোগ), BLUETOOTH_ADVERTISE (বিজ্ঞাপন) দ্বারা। BLE ডিভাইস আবিষ্কারের জন্য, BLUETOOTH_SCAN যথেষ্ট, অবস্থান প্রয়োজন নেই।

অনুমতি সারণী Android সংস্করণ অনুযায়ী:

অপারেশনAPI 23–30API 31+
BLE স্ক্যানিংACCESS_FINE_LOCATIONBLUETOOTH_SCAN (অবস্থান ছাড়া)
BLE সংযোগACCESS_FINE_LOCATIONBLUETOOTH_CONNECT
BLE বিজ্ঞাপনACCESS_FINE_LOCATIONBLUETOOTH_ADVERTISE
চালু/বন্ধ করাBLUETOOTH_ADMINBLUETOOTH_ADMIN (সিস্টেম)
MAC ঠিকানা প্রাপ্তিACCESS_FINE_LOCATIONBLUETOOTH_CONNECT (জাল ঠিকানা)

Android 12+ এ, সমস্ত Bluetooth অনুমতি রানটাইম অনুমতি — সেগুলি ActivityResultContracts.RequestMultiplePermissions এর মাধ্যমে রানটাইমে অনুরোধ করা আবশ্যক। BLUETOOTH_SCAN এবং BLUETOOTH_ADVERTISE NEARBY_DEVICES গ্রুপের অন্তর্গত, BLUETOOTH_CONNECT একই গ্রুপের অন্তর্গত। BLUETOOTH এবং BLUETOOTH_ADMIN অনুমতিগুলি API < 31 এর সাথে সামঞ্জস্যের জন্য ম্যানিফেস্টে থাকে, কিন্তু API 31+ এর জন্য সেগুলি উপেক্ষা করা হয় — Google নতুন অনুমতিগুলি স্পষ্টভাবে উল্লেখ করতে প্রয়োজন।

kotlin
// Android 12+ এ Bluetooth অনুমতি অনুরোধ
import android.Manifest
import android.content.pm.PackageManager
import android.os.Build
import androidx.core.content.ContextCompat

class PermissionHelper(context: Context) {

    fun getRequiredPermissions(): Array<String> {
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            // Android 12+: BLE-
            arrayOf(
                Manifest.permission.BLUETOOTH_SCAN,
                Manifest.permission.BLUETOOTH_CONNECT,
                Manifest.permission.BLUETOOTH_ADVERTISE
            )
        } else {
            // Android 6-11: BLE
            arrayOf(
                Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.BLUETOOTH,
                Manifest.permission.BLUETOOTH_ADMIN
            )
        }
    }

    // সব অনুমতি পরীক্ষা করুন
    fun hasPermissions(context: Context): Boolean {
        return getRequiredPermissions().all { permission ->
            ContextCompat.checkSelfPermission(context, permission)
                    == PackageManager.PERMISSION_GRANTED
        }
    }
}

PermissionHelper ক্লাস API স্তরের উপর নির্ভর করে অনুমতির সঠিক সেট ফেরত দেয়। Android 12+ এ, অবস্থান ছাড়া BLUETOOTH_SCAN, BLUETOOTH_CONNECT, BLUETOOTH_ADVERTISE ব্যবহার করা হয়। Android 6–11 এ, BLE স্ক্যানিংয়ের জন্য এখনও ACCESS_FINE_LOCATION প্রয়োজন। ডেভেলপারকে ActivityResultContracts বা RxPermissions এর মাধ্যমে অনুমতি অনুরোধ করার সময় উভয় পরিস্থিতি বিবেচনা করা উচিত।

Kotlin-এ BluetoothAdapter এর সম্পূর্ণ উদাহরণ

সম্পূর্ণ উদাহরণ Kotlin-এ একটি BLE অ্যাপ্লিকেশনের যা BluetoothAdapter ব্যবহার করে BLE ডিভাইস স্ক্যান, সংযোগ এবং ডেটা পড়ে। উদাহরণটিতে অনুমতি পরীক্ষা, অ্যাডাপ্টার প্রাপ্তি, BluetoothLeScanner এর মাধ্যমে স্ক্যান করা এবং BluetoothDevice.connectGatt এর মাধ্যমে সংযোগ করা অন্তর্ভুক্ত।

kotlin
// Kotlin-এ সম্পূর্ণ BLE ম্যানেজার
class BLEManager(private val context: Context) {

    private val bluetoothManager: BluetoothManager =
        context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
    private val adapter: BluetoothAdapter? = bluetoothManager.adapter
    private var scanner: BluetoothLeScanner? = adapter?.bluetoothLeScanner
    private var gatt: BluetoothGatt? = null

    // 1. পরিষেবা আবিষ্কার
    fun canScan(): Boolean {
        return adapter?.isEnabled == true
                && scanner != null
                && PermissionHelper(context).hasPermissions(context)
    }

    // 2. ফিল্টার সহ
    fun startScanning(callback: (BluetoothDevice, Int) -> Unit) {
        if (!canScan()) return

        val settings = ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
            .setReportDelay(0)
            .build()

        scanner?.startScan(null, settings, object : ScanCallback() {
            override fun onScanResult(callbackType: Int, result: ScanResult) {
                callback(result.device, result.rssi)
            }
        })
    }

    // 3. স্ক্যান বন্ধ করুন
    fun stopScanning() {
        scanner?.stopScan(object : ScanCallback() {})
    }

    // 4. BLE ডিভাইসে সংযোগ করুন
    fun connectToDevice(device: BluetoothDevice) {
        if (adapter?.isEnabled != true) return

        gatt = device.connectGatt(
            context,
            false,
            object : BluetoothGattCallback() {
                override fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) {
                    if (newState == BluetoothProfile.STATE_CONNECTED) {
                        gatt.discoverServices()
                    }
                }

                override fun onServicesDiscovered(gatt: BluetoothGatt, status: Int) {
                    // পরিষেবা পাওয়া গেছে, বৈশিষ্ট্য পড়া যেতে পারে
                }
            },
            BluetoothDevice.TRANSPORT_LE
        )
    }

    // 5. সম্পদ মুক্ত করুন
    fun disconnect() {
        gatt?.disconnect()
        gatt?.close()
        gatt = null
    }
}

BLEManager ক্লাস Android-এ সম্পূর্ণ BLE চক্র একীভূত করে: অ্যাডাপ্টার এবং অনুমতি পরীক্ষা (canScan), ScanSettings সহ BluetoothLeScanner এর মাধ্যমে স্ক্যানিং (startScanning), TRANSPORT_LE সহ BluetoothDevice.connectGatt এর মাধ্যমে সংযোগ (connectToDevice), এবং সম্পদ মুক্ত করা (disconnect)। সমস্ত BLE অপারেশন UI থ্রেডে সম্পাদিত হয় — Android মূল থ্রেডে BluetoothGattCallback কলব্যাক কল করে। কর্মক্ষমতা-গুরুত্বপূর্ণ BLE কাজের জন্য, GATT অপারেশনগুলি ব্যাকগ্রাউন্ড HandlerThread-এ স্থানান্তর করার পরামর্শ দেওয়া হয়।

প্রায়শই জিজ্ঞাসিত প্রশ্ন

Android-এ BluetoothAdapter কী?

BluetoothAdapter একটি ক্লাস যা Android ডিভাইসের স্থানীয় Bluetooth অ্যাডাপ্টার উপস্থাপন করে। এটি BluetoothManager.getAdapter() (API 18+) বা BluetoothAdapter.getDefaultAdapter() এর মাধ্যমে প্রাপ্ত হয়। এটি Bluetooth চালু/বন্ধ করা, ডিভাইস স্ক্যান করা, দৃশ্যমানতা পরিচালনা এবং অ্যাডাপ্টার তথ্য প্রাপ্তির পদ্ধতি প্রদান করে। Bluetooth মডিউল ছাড়া ডিভাইসে null ফেরত দেয়।

কেন BluetoothAdapter.getDefaultAdapter() null ফেরত দেয়?

কারণ ডিভাইসে Bluetooth রেডিওর অনুপস্থিতি। শুধুমাত্র Wi-Fi ট্যাবলেট, Android এমুলেটর এবং Bluetooth ছাড়া Android TV-তে সাধারণ। অ্যাপ্লিকেশন স্টার্টআপে getDefaultAdapter() null এর জন্য পরীক্ষা করুন এবং যদি অ্যাডাপ্টার অনুপস্থিত থাকে তবে BLE বৈশিষ্ট্যগুলি নিষ্ক্রিয় করুন। আরও সঠিক সনাক্তকরণের জন্য PackageManager.hasSystemFeature(FEATURE_BLUETOOTH_LE) এর মাধ্যমে পরীক্ষা একটি বিকল্প।

BluetoothLeScanner startLeScan থেকে কীভাবে আলাদা?

BluetoothLeScanner (API 21+) ScanFilter, ScanSettings এবং PendingIntent সমর্থন সহ BLE স্ক্যানিংয়ের জন্য আধুনিক API। startLeScan (API 18+) একটি অবচিত BluetoothAdapter পদ্ধতি যা সীমিত ডেটা সেট সহ LeScanCallback গ্রহণ করে। Google সমস্ত নতুন প্রকল্পের জন্য BluetoothLeScanner সুপারিশ করে, এটি UUID দ্বারা ফিল্টার করা, পাওয়ার খরচ মোড কনফিগার করা এবং PendingIntent এর মাধ্যমে ব্যাকগ্রাউন্ড অপারেশনের অনুমতি দেয়।

Android 12+ এ BLE এর জন্য কী অনুমতি প্রয়োজন?

Android 12+ (API 31) এ, BLE স্ক্যানিংয়ের জন্য BLUETOOTH_SCAN, সংযোগের জন্য BLUETOOTH_CONNECT, এবং বিজ্ঞাপনের জন্য BLUETOOTH_ADVERTISE প্রয়োজন। অবস্থান অনুমতি ACCESS_FINE_LOCATION এখন BLE এর জন্য প্রয়োজন নেই। Android 6–11 এ, ACCESS_FINE_LOCATION প্রয়োজন। সমস্ত অনুমতি ActivityResultContracts এর মাধ্যমে রানটাইমে অনুরোধ করা হয়।

Bluetooth কি সংলাপ ছাড়া প্রোগ্রামেটিকভাবে চালু করা যেতে পারে?

Android 10+ এ, সিস্টেম সংলাপ ছাড়া প্রোগ্রামেটিক Bluetooth চালু করা শুধুমাত্র BLUETOOTH_PRIVILEGED অনুমতি সহ সিস্টেম অ্যাপ্লিকেশনের জন্য উপলব্ধ। সাধারণ অ্যাপ্লিকেশনগুলিকে Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE) এবং startActivityForResult ব্যবহার করতে হবে — ব্যবহারকারী সিস্টেম সংলাপে চালু করার নিশ্চিত করে। ম্যানিফেস্টে BLUETOOTH_ADMIN Android 10+ এ enable() অধিকার দেয় না।

সারাংশ

  • BluetoothAdapter Android-এ সমস্ত Bluetooth অপারেশনের জন্য প্রবেশ বিন্দু, BluetoothManager বা getDefaultAdapter() এর মাধ্যমে প্রাপ্ত হয়
  • getState() এবং isEnabled যেকোনো BLE অপারেশনের আগে Bluetooth রেডিও অবস্থার মৌলিক পরীক্ষা
  • BluetoothLeScanner (API 21+) ScanFilter, ScanSettings এবং PendingIntent সমর্থন সহ অবচিত startLeScan প্রতিস্থাপন করে
  • BluetoothManager মাল্টি-অ্যাকাউন্ট পরিস্থিতি এবং Automotive সমর্থন সহ BluetoothAdapter প্রাপ্তির আধুনিক উপায়
  • অনুমতিগুলি বিবর্তিত হয়েছে: ACCESS_FINE_LOCATION (API 23-30) → BLUETOOTH_SCAN/CONNECT/ADVERTISE (API 31+)
  • enable()/disable() — Android 10+ এ সাধারণ অ্যাপ্লিকেশনের জন্য শুধুমাত্র সিস্টেম সংলাপ ACTION_REQUEST_ENABLE এর মাধ্যমে
  • connectGatt BluetoothGattCallback এর মাধ্যমে BLE পেরিফেরালের সাথে GATT সংযোগ স্থাপনের জন্য BluetoothDevice পদ্ধতি

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন