BluetoothAdapter — คืออะไร เมธอด และการจัดการ Bluetooth ใน Android

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-07-16 เวลาอ่าน: 10 นาที

BluetoothAdapter เป็นคลาสระบบ Android ที่แสดงถึงอแดปเตอร์ Bluetooth ในเครื่องของอุปกรณ์ BluetoothAdapter เป็นจุดเริ่มต้นสำหรับการดำเนินการ Bluetooth ทั้งหมดบน Android: การเปิดวิทยุ (enable) การสแกนอุปกรณ์ การจัดการการมองเห็น (setScanMode) การรับข้อมูลอแดปเตอร์ (getName, getAddress, getState) คลาสนี้สามารถใช้งานได้ผ่าน BluetoothManager.getAdapter() (API 18+) หรือ BluetoothAdapter.getDefaultAdapter() บนอุปกรณ์ที่ไม่มีโมดูล Bluetooth getDefaultAdapter() จะคืนค่า null ตาม Android Developers, 2026 BluetoothAdapter เป็นคอมโพเนนต์ที่จำเป็นสำหรับแอปพลิเคชัน BLE บน Android ตั้งแต่ API 5

ประเด็นสำคัญ

  • BluetoothAdapter เป็นคลาสระบบ Android สำหรับจัดการอแดปเตอร์ Bluetooth ในเครื่องของอุปกรณ์
  • getDefaultAdapter() เป็นเมธอดสแตติกสำหรับรับอินสแตนซ์ คืนค่า null บนอุปกรณ์ที่ไม่มี Bluetooth
  • getBluetoothLeScanner() เป็นเมธอดสำหรับเข้าถึงสแกนเนอร์ BLE สมัยใหม่ (API 21+)
  • enable/disable เป็นเมธอดสำหรับเปิดและปิดวิทยุ Bluetooth (ต้องการสิทธิ์ BLUETOOTH_ADMIN)
  • startDiscovery/startLeScan เป็นเมธอดการสแกนแบบคลาสสิกและ BLE (LE Scan เลิกใช้แล้ว ใช้ BluetoothLeScanner)

BluetoothAdapter คืออะไร: สาระสำคัญและการรับอินสแตนซ์

BluetoothAdapter แสดงถึงอแดปเตอร์ Bluetooth ทางกายภาพของอุปกรณ์ Android แต่ละอุปกรณ์มีอแดปเตอร์หนึ่งตัว (ยกเว้น Android Automotive ที่มีชิป Bluetooth หลายตัว ซึ่งใช้ BluetoothManager.getAdapterList()) BluetoothAdapter ห่อหุ้มสถานะวิทยุ: STATE_OFF (0), STATE_TURNING_ON (1), STATE_ON (2), STATE_TURNING_OFF (3) สถานะถูกติดตามผ่าน BroadcastReceiver บน ACTION_STATE_CHANGED

การรับอินสแตนซ์ BluetoothAdapter เป็นขั้นตอนแรกของแอปพลิเคชัน BLE บน Android เมธอดที่แนะนำคือผ่าน BluetoothManager.getAdapter() ตั้งแต่ API 18+ ทางเลือกคือเมธอดสแตติก 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 สาธิตการรับ BluetoothAdapter ผ่าน BluetoothManager ด้วยการตรวจสอบ null ภายหลัง 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() ระบบจะเริ่มกระบวนการเปิดวิทยุ และสถานะจะถูกติดตามผ่าน BroadcastReceiver ด้วยแอคชัน BluetoothAdapter.ACTION_STATE_CHANGED บน Android 10+ enable() และ disable() ต้องการสิทธิพิเศษของระบบเพิ่มเติม — แอปพลิเคชันทั่วไปไม่สามารถควบคุม Bluetooth ผ่านโปรแกรมได้โดยไม่มีไดอะล็อกผู้ใช้

getState() คืนค่าสถานะปัจจุบันของอแดปเตอร์: STATE_OFF (10), STATE_TURNING_ON (11), STATE_ON (12), STATE_TURNING_OFF (13) getAddress() คืนค่าที่อยู่ MAC ของอแดปเตอร์ Bluetooth บน Android 6+ ต้องใช้ ACCESS_FINE_LOCATION (หรือ ACCESS_COARSE_LOCATION สำหรับ API 31+) เพื่อขอที่อยู่ MAC บน Android 10+ getAddress() คืนค่าที่อยู่คงที่ 02:00:00:00:00:00 — ที่อยู่จริงไม่สามารถใช้งานได้ผ่าน API สาธารณะ

getScanMode() กำหนดโหมดการมองเห็นของอแดปเตอร์: SCAN_MODE_NONE (มองไม่เห็น), SCAN_MODE_CONNECTABLE (มองเห็นสำหรับอุปกรณ์ที่เชื่อมต่อ), SCAN_MODE_CONNECTABLE_DISCOVERABLE (มองเห็นสำหรับทุกคน) โหมดการมองเห็นถูกจำกัดเวลา (ปกติ 60–300 วินาที) เพื่อความปลอดภัย การตั้งค่าโหมดผ่าน setScanMode() ต้องการ BLUETOOTH_ADMIN และสิทธิ์ระบบบน Android 10+

เมธอดคำอธิบายสิทธิ์ที่ต้องการ
enable()เปิดวิทยุ BluetoothBLUETOOTH_ADMIN
disable()ปิดวิทยุ BluetoothBLUETOOTH_ADMIN
getState()สถานะปัจจุบันของอแดปเตอร์BLUETOOTH
getAddress()ที่อยู่ MAC ของอแดปเตอร์BLUETOOTH + ACCESS_FINE_LOCATION (API 23+)
getScanMode()โหมดการมองเห็นของอุปกรณ์BLUETOOTH
setScanMode()ตั้งค่าโหมดการมองเห็นBLUETOOTH_ADMIN

การสแกนอุปกรณ์: startDiscovery และ BluetoothLeScanner

BluetoothAdapter รองรับการสแกนสองประเภท การสแกน Bluetooth แบบคลาสสิก (BR/EDR) เริ่มต้นผ่าน startDiscovery() — ค้นพบอุปกรณ์ Bluetooth ทุกประเภทรวมถึงโทรศัพท์และชุดหูฟัง ผลลัพธ์จะถูกส่งคืนผ่าน BroadcastReceiver ด้วยแอคชัน BluetoothDevice.ACTION_FOUND startDiscovery() ทำงาน 12 วินาทีและสามารถยกเลิกได้โดยเรียก cancelDiscovery() เมธอดนี้เลิกใช้สำหรับ BLE — ใช้ BluetoothLeScanner

การสแกน BLE ผ่าน BluetoothAdapter ใช้เมธอดที่เลิกใช้แล้ว startLeScan(LeScanCallback) ตั้งแต่ API 21 Google แนะนำให้ใช้ BluetoothLeScanner ซึ่งได้รับผ่าน BluetoothAdapter.getBluetoothLeScanner() BluetoothLeScanner จัดเตรียม API ที่ยืดหยุ่นมากขึ้น: การกำหนดค่าการสแกนผ่าน ScanSettings (โหมด, ประเภท callback, โหมดการจับคู่), การกรองผ่าน ScanFilter (โดย UUID บริการ, ชื่ออุปกรณ์, ที่อยู่ MAC) และการสนับสนุน PendingIntent สำหรับการสแกนพื้นหลัง

kotlin
// API การสแกน BLE แบบเก่า (เลิกใช้) เทียบกับใหม่
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 ใช้ ScanSettings กับโหมด LOW_LATENCY (ความเร็วการค้นพบสูงสุด) และ ScanFilter สำหรับกรองตาม UUID บริการอัตราการเต้นของหัวใจ (0x180D) ScanCallback จัดเตรียม onScanResult พร้อมออบเจ็กต์ ScanResult ที่มีข้อมูลเพิ่มเติม: ชื่อ, RSSI, ข้อมูลโฆษณา, ประเภทการเชื่อมต่อ

BluetoothManager: API สมัยใหม่สำหรับเข้าถึง BluetoothAdapter

BluetoothManager เป็นบริการระบบ Android ที่นำมาใช้ใน API 18 (Android 4.3) สำหรับจัดการการดำเนินการ Bluetooth ก่อน API 18 วิธีเดียวที่จะรับ BluetoothAdapter คือเมธอดสแตติก getDefaultAdapter() BluetoothManager จัดเตรียม: adapter — อินสแตนซ์ BluetoothAdapter, getConnectedDevices() — รายการอุปกรณ์ที่เชื่อมต่อ, getDevicesMatchingConnectionStates() — การกรองตามสถานะ BluetoothManager ยังใช้สำหรับรับ BluetoothLeScanner บน API เก่า

ข้อดีของ BluetoothManager เมื่อเทียบกับการเรียก BluetoothAdapter.getDefaultAdapter() โดยตรง: แอปพลิเคชันไม่ขึ้นอยู่กับซิงเกิลตันสแตติก ผู้จัดการเคารพบริบท (Activity/Application) ซึ่งสำคัญสำหรับสถานการณ์หลายบัญชีของ Android Enterprise บน Android Automotive ที่มีชิป Bluetooth หลายตัว BluetoothManager.getAdapterList() คืนค่าอแดปเตอร์ทั้งหมดที่มี — BluetoothAdapter.getDefaultAdapter() คืนค่าเฉพาะตัวแรก

kotlin
// ใช้ BluetoothManager สำหรับ BLE
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 ใช้ BluetoothManager เพื่อเข้าถึง BluetoothAdapter และรับรายการอุปกรณ์ GATT ที่เชื่อมต่อ isBLESupported ตรวจสอบการมีวิทยุ BLE ผ่าน PackageManager.hasSystemFeature(FEATURE_BLUETOOTH_LE) — การตรวจสอบสำคัญสำหรับอุปกรณ์ที่มี Bluetooth Classic แต่ไม่มี BLE requestEnableBluetooth แสดงไดอะล็อกระบบเปิด Bluetooth (ACTION_REQUEST_ENABLE) โดยไม่ต้องใช้สิทธิ์ BLUETOOTH_ADMIN — นี่เป็นวิธีที่ถูกต้องตามกฎหมายเพียงวิธีเดียวในการเปิด Bluetooth บน Android 10+ โดยไม่มีแอปพลิเคชันระบบ

สิทธิ์ Android สำหรับทำงานกับ BluetoothAdapter

สิทธิ์ สำหรับ BluetoothAdapter ได้พัฒนาตามแต่ละเวอร์ชัน Android บน Android 6–11 (API 23–30) จำเป็นต้องมี BLUETOOTH, BLUETOOTH_ADMIN และ ACCESS_FINE_LOCATION สำหรับการสแกน BLE บน Android 12+ (API 31+) Google ได้แบ่งสิทธิ์: ACCESS_FINE_LOCATION ถูกแทนที่ด้วย BLUETOOTH_SCAN (การสแกน), BLUETOOTH_CONNECT (การเชื่อมต่อ), BLUETOOTH_ADVERTISE (การโฆษณา) สำหรับการค้นพบอุปกรณ์ BLE BLUETOOTH_SCAN ก็เพียงพอ ไม่จำเป็นต้องใช้ตำแหน่ง

ตารางสิทธิ์ ตามเวอร์ชัน Android:

การดำเนินการAPI 23–30API 31+
การสแกน BLEACCESS_FINE_LOCATIONBLUETOOTH_SCAN (ไม่ต้องใช้ตำแหน่ง)
การเชื่อมต่อ BLEACCESS_FINE_LOCATIONBLUETOOTH_CONNECT
การโฆษณา BLEACCESS_FINE_LOCATIONBLUETOOTH_ADVERTISE
เปิด/ปิดBLUETOOTH_ADMINBLUETOOTH_ADMIN (ระบบ)
รับที่อยู่ MACACCESS_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
// ขอสิทธิ์ Bluetooth บน Android 12+
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 ยังคงต้องการ ACCESS_FINE_LOCATION สำหรับการสแกน BLE นักพัฒนาต้องพิจารณาทั้งสองสถานการณ์เมื่อขอสิทธิ์ผ่าน ActivityResultContracts หรือ RxPermissions

ตัวอย่างสมบูรณ์ของ BluetoothAdapter ใน Kotlin

ตัวอย่างสมบูรณ์ ของแอปพลิเคชัน BLE ใน Kotlin ที่ใช้ BluetoothAdapter สำหรับสแกน เชื่อมต่อ และอ่านข้อมูลจากอุปกรณ์ BLE ตัวอย่างครอบคลุมการตรวจสอบสิทธิ์ การรับอแดปเตอร์ การสแกนผ่าน BluetoothLeScanner และการเชื่อมต่อผ่าน BluetoothDevice.connectGatt

kotlin
// ตัวจัดการ BLE เต็มรูปแบบใน Kotlin
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 รวมวงจร BLE ที่สมบูรณ์บน Android: การตรวจสอบอแดปเตอร์และสิทธิ์ (canScan), การสแกนผ่าน BluetoothLeScanner ด้วย ScanSettings (startScanning), การเชื่อมต่อผ่าน BluetoothDevice.connectGatt ด้วย TRANSPORT_LE (connectToDevice), และการปล่อยทรัพยากร (disconnect) การดำเนินการ BLE ทั้งหมดทำงานบนเธรด UI — Android เรียก callback BluetoothGattCallback บนเธรดหลัก สำหรับงาน BLE ที่ต้องการประสิทธิภาพสูง แนะนำให้ย้ายการดำเนินการ GATT ไปยัง HandlerThread พื้นหลัง

คำถามที่พบบ่อย

BluetoothAdapter ใน Android คืออะไร?

BluetoothAdapter เป็นคลาสที่แสดงถึงอแดปเตอร์ Bluetooth ในเครื่องของอุปกรณ์ Android ได้รับผ่าน BluetoothManager.getAdapter() (API 18+) หรือ BluetoothAdapter.getDefaultAdapter() จัดเตรียมเมธอดสำหรับเปิด/ปิด Bluetooth สแกนอุปกรณ์ จัดการการมองเห็นและรับข้อมูลอแดปเตอร์ คืนค่า null บนอุปกรณ์ที่ไม่มีโมดูล Bluetooth

ทำไม BluetoothAdapter.getDefaultAdapter() คืนค่า null?

สาเหตุคือไม่มีวิทยุ Bluetooth บนอุปกรณ์ พบได้ทั่วไปในแท็บเล็ต Wi-Fi เท่านั้น อีมูเลเตอร์ Android และ Android TV ที่ไม่มี Bluetooth ตรวจสอบ getDefaultAdapter() เป็น null เมื่อเริ่มต้นแอปพลิเคชันและปิดการทำงาน BLE หากไม่มีอแดปเตอร์ ทางเลือกคือการตรวจสอบผ่าน PackageManager.hasSystemFeature(FEATURE_BLUETOOTH_LE) เพื่อการตรวจจับที่แม่นยำยิ่งขึ้น

BluetoothLeScanner แตกต่างจาก startLeScan อย่างไร?

BluetoothLeScanner (API 21+) เป็น API สมัยใหม่สำหรับการสแกน BLE ที่รองรับ ScanFilter, ScanSettings และ PendingIntent startLeScan (API 18+) เป็นเมธอด BluetoothAdapter ที่เลิกใช้แล้วซึ่งรับ LeScanCallback ด้วยชุดข้อมูลที่จำกัด Google แนะนำ BluetoothLeScanner สำหรับโปรเจกต์ใหม่ทั้งหมด สามารถกรองตาม UUID กำหนดค่าโหมดการใช้พลังงานและทำงานพื้นหลังผ่าน PendingIntent

ต้องใช้สิทธิ์อะไรบ้างสำหรับ BLE บน Android 12+?

บน 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 ในแมนิเฟสต์ไม่ให้สิทธิ์ enable() บน Android 10+

สรุป

  • BluetoothAdapter เป็นจุดเริ่มต้นสำหรับการดำเนินการ Bluetooth ทั้งหมดบน Android ได้รับผ่าน BluetoothManager หรือ getDefaultAdapter()
  • getState() และ isEnabled เป็นการตรวจสอบพื้นฐานของสถานะวิทยุ Bluetooth ก่อนการดำเนินการ BLE ใด ๆ
  • BluetoothLeScanner (API 21+) แทนที่ startLeScan ที่เลิกใช้แล้วด้วยการสนับสนุน ScanFilter, ScanSettings และ PendingIntent
  • BluetoothManager เป็นวิธีสมัยใหม่ในการรับ BluetoothAdapter ที่รองรับสถานการณ์หลายบัญชีและ Automotive
  • สิทธิ์ ได้พัฒนา: ACCESS_FINE_LOCATION (API 23-30) → BLUETOOTH_SCAN/CONNECT/ADVERTISE (API 31+)
  • enable()/disable() — บน Android 10+ สำหรับแอปพลิเคชันทั่วไปผ่านไดอะล็อกระบบ ACTION_REQUEST_ENABLE เท่านั้น
  • connectGatt เป็นเมธอด BluetoothDevice สำหรับสร้างการเชื่อมต่อ GATT กับอุปกรณ์ต่อพ่วง BLE ผ่าน BluetoothGattCallback

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม