BluetoothLeScanner — apa itu, metode dan pemindaian BLE di Android

Penulis: IT Sectr Diterbitkan: 2026-07-16 Waktu membaca: 10 mnt

BluetoothLeScanner — kelas Android untuk memindai perangkat Bluetooth Low Energy, tersedia sejak API 21 (Android 5.0). BluetoothLeScanner menggantikan metode usang startLeScan pada BluetoothAdapter, menyediakan API yang fleksibel dengan konfigurasi pemindaian (ScanSettings), penyaringan (ScanFilter), dan dukungan mode latar (PendingIntent). Instance diperoleh melalui BluetoothAdapter.getBluetoothLeScanner(). Menurut Android Developers, 2026, BluetoothLeScanner mendukung tiga mode konsumsi daya dan memungkinkan pemindaian paket iklan BLE dengan penyaringan berdasarkan UUID layanan, nama perangkat, atau alamat MAC.

Utama

  • BluetoothLeScanner — API Android modern (API 21+) untuk pemindaian BLE, pengganti startLeScan yang usang
  • ScanSettings — konfigurasi mode pemindaian: LOW_POWER, BALANCED, LOW_LATENCY dan tipe callback
  • ScanFilter — penyaringan hasil berdasarkan UUID layanan, nama perangkat, alamat MAC, data pabrikan
  • ScanCallback — callback hasil onScanResult, onBatchScanResults dan onScanFailed dengan kode kesalahan
  • PendingIntent — pemindaian latar melalui BroadcastReceiver, bahkan saat aplikasi di latar belakang

Apa itu BluetoothLeScanner: esensi dan memperoleh instance

BluetoothLeScanner — kelas sistem untuk mengelola pemindaian BLE di Android. Tidak seperti BluetoothAdapter.startLeScan() yang menerima callback LeScanCallback sederhana, BluetoothLeScanner menyediakan API berorientasi objek dengan pengaturan, filter, dan penanganan kesalahan yang diperluas. Kelas ini muncul di API 21 (Android 5.0) bersama dengan dukungan BLE 4.2 dan tetap menjadi cara utama pemindaian BLE di semua versi Android modern.

Memperoleh instance BluetoothLeScanner dilakukan melalui BluetoothAdapter.getBluetoothLeScanner(). Metode ini mengembalikan null jika adaptor Bluetooth tidak tersedia (Bluetooth dinonaktifkan atau perangkat tidak mendukung BLE). Sebelum memperoleh, periksa BluetoothAdapter.isEnabled() dan keberadaan FEATURE_BLUETOOTH_LE melalui PackageManager. Setelah scanner diperoleh, Anda dapat memulai pemindaian di thread mana pun — Android sendiri menjadwalkan operasi BLE di thread internal tumpukan Bluetooth.

kotlin
// Memperoleh BluetoothLeScanner
class BLEScannerManager(context: Context) {

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

    fun initScanner(): Boolean {
        // Periksa ketersediaan BLE
        if (!context.packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
            return false
        }

        // Periksa Bluetooth diaktifkan
        if (adapter?.isEnabled != true) {
            return false
        }

        // Dapatkan scanner
        scanner = adapter?.bluetoothLeScanner
        return scanner != null
    }

    // Periksa ketersediaan scanner
    val isAvailable: Boolean
        get() = scanner != null

    // Mulai pemindaian dasar tanpa filter
    fun startBasicScan() {
        scanner?.startScan(object : ScanCallback() {
            override fun onScanResult(callbackType: Int, result: ScanResult) {
                handleResult(result)
            }
        })
    }

    private fun handleResult(result: ScanResult) {
        val device = result.device
        print("Device: ${device.name ?: "Unnamed"}, RSSI: ${result.rssi}, address: ${device.address}")
    }
}

Kelas BLEScannerManager mendemonstrasikan perolehan dan inisialisasi BluetoothLeScanner yang aman. initScanner memeriksa keberadaan BLE melalui hasSystemFeature, Bluetooth yang diaktifkan, dan perolehan scanner yang berhasil. startBasicScan memulai pemindaian tanpa pengaturan dan filter — mendeteksi semua perangkat BLE dalam jangkauan. handleResult menganalisis ScanResult: BluetoothDevice (nama, alamat), RSSI (tingkat sinyal), scanRecord (data iklan).

ScanSettings: mode pemindaian dan tipe callback

ScanSettings — kelas untuk konfigurasi pemindaian BLE. Parameter utama — mode pemindaian (scanMode), yang menentukan kompromi antara konsumsi daya dan keterlambatan deteksi. ScanSettings.Builder memungkinkan konfigurasi: scanMode, callbackType (CALLBACK_TYPE_ALL_MATCHES, CALLBACK_TYPE_FIRST_MATCH, CALLBACK_TYPE_MATCH_LOST), matchMode (MATCH_MODE_AGGRESSIVE, MATCH_MODE_STICKY), reportDelay (penundaan pengiriman batch), dan phy (PHY_LE_1M, PHY_LE_2M, PHY_LE_CODED).

Tiga mode pemindaian: SCAN_MODE_LOW_POWER (0) — pemindaian latar dengan konsumsi daya rendah, keterlambatan deteksi beberapa detik. SCAN_MODE_BALANCED (1) — mode seimbang untuk sebagian besar skenario. SCAN_MODE_LOW_LATENCY (2) — keterlambatan deteksi minimal (sekitar 100 ms), konsumsi daya maksimal. Gunakan LOW_LATENCY untuk pencarian perangkat aktif, LOW_POWER untuk pemantauan latar.

reportDelay — penundaan dalam milidetik sebelum pengiriman hasil secara berkelompok. Jika reportDelay = 0, hasil dikirim segera setelah deteksi. Jika > 0, Android mengakumulasi hasil dan mengirim batch melalui onBatchScanResults. Pengiriman batch mengurangi jumlah panggilan callback dan menurunkan konsumsi daya, cocok untuk pemindaian latar dengan prioritas rendah.

kotlin
// Konfigurasi ScanSettings untuk berbagai skenario
class ScanSettingsProvider {

    // 1. Pemindaian cepat (pencarian aktif)
    fun lowLatencyScan(): ScanSettings {
        return ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
            .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
            .setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE)
            .setReportDelay(0)
            .setPhy(ScanSettings.PHY_LE_ALL_SUPPORTED)
            .build()
    }

    // 2. Pemindaian hemat daya (pemantauan latar)
    fun lowPowerScan(): ScanSettings {
        return ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)
            .setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH)
            .setMatchMode(ScanSettings.MATCH_MODE_STICKY)
            .setReportDelay(2000)  // batch setiap 2 detik
            .build()
    }

    // 3. Pemindaian BLE Long Range (Coded PHY)
    fun longRangeScan(): ScanSettings {
        return ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
            .setPhy(ScanSettings.PHY_LE_CODED)
            .setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
            .build()
    }

    // 4. Pemindaian hanya pada 2M PHY (BLE 5.0+)
    fun highSpeedScan(): ScanSettings {
        return ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
            .setPhy(ScanSettings.PHY_LE_2M)
            .build()
    }
}

Kelas ScanSettingsProvider berisi konfigurasi tipikal. lowLatencyScan — untuk pemindaian UI (pencarian ‘di sini dan sekarang’). lowPowerScan — untuk pemantauan latar dengan batch setiap 2 detik dan callbackType FIRST_MATCH (hanya aktif pada deteksi pertama). longRangeScan menggunakan PHY_LE_CODED (BLE Long Range, hingga 1 km). highSpeedScan — PHY_LE_2M (2 Mbit/s, hanya perangkat BLE 5.0+).

ScanFilter: penyaringan perangkat BLE berdasarkan UUID dan nama

ScanFilter — kelas untuk menyaring hasil pemindaian BLE. Tanpa filter, BluetoothLeScanner mengembalikan semua perangkat BLE dalam jangkauan — di lingkungan BLE yang padat, ini bisa ratusan paket per menit. ScanFilter mempersempit hasil ke perangkat yang diperlukan, mengurangi konsumsi daya dan beban aplikasi. Filter diterapkan di tingkat tumpukan Bluetooth — paket yang tidak sesuai ditolak sebelum dikirim ke aplikasi.

Jenis filter: setServiceUuid — UUID layanan (wajib format 128-bit lengkap). setDeviceName — substring nama perangkat (peka huruf besar/kecil, pencocokan substring tepat). setDeviceAddress — alamat MAC tepat. setManufacturerData — data pabrikan (ID perusahaan + mask). Untuk satu pemindaian, beberapa filter dapat diatur — perangkat harus cocok dengan semua (logika AND). Untuk logika OR, jalankan beberapa pemindaian.

kotlin
// Pembuatan ScanFilter untuk berbagai skenario
class ScanFilterFactory {

    // 1. Filter berdasarkan UUID layanan (Heart Rate Monitor)
    fun byHeartRateService(): ScanFilter {
        return ScanFilter.Builder()
            .setServiceUuid(
                ParcelUuid.fromString("0000180D-0000-1000-8000-00805F9B34FB")
            )
            .build()
    }

    // 2. Filter berdasarkan nama perangkat (“iBeacon*")
    fun byDeviceName(): ScanFilter {
        return ScanFilter.Builder()
            .setDeviceName("Sensor")
            .build()
    }

    // 3.   MAC- (perangkat)
    fun byMacAddress(mac: String): ScanFilter {
        return ScanFilter.Builder()
            .setDeviceAddress(mac)
            .build()
    }

    // 4. Filter gabungan (UUID + )
    fun combinedFilter(): List<ScanFilter> {
        return listOf(
            ScanFilter.Builder()
                .setServiceUuid(
                    ParcelUuid.fromString("0000A001-0000-1000-8000-00805F9B34FB")
                )
                .setDeviceName("MyDevice")
                .build()
        )
    }

    // 5.   data pabrikan
    fun byManufacturer(companyId: Int, data: ByteArray, mask: ByteArray): ScanFilter {
        return ScanFilter.Builder()
            .setManufacturerData(companyId, data, mask)
            .build()
    }
}

Kelas ScanFilterFactory menunjukkan semua jenis filter. byHeartRateService menyaring perangkat dengan layanan denyut 0x180D. byDeviceName menemukan perangkat yang mengandung ‘Sensor’ dalam nama (Apple merekomendasikan nama unik untuk penyaringan). byMacAddress — pencarian tepat perangkat tertentu. combinedFilter — filter AND berdasarkan UUID dan nama. byManufacturer — filter berdasarkan data pabrikan (misalnya, untuk iBeacon digunakan company ID Apple 0x004C).

ScanCallback: memproses hasil dan kesalahan pemindaian

ScanCallback — kelas abstrak untuk menerima hasil pemindaian BLE. Berisi tiga metode: onScanResult — hasil tunggal (tipe callback, ScanResult), onBatchScanResults — kumpulan hasil untuk reportDelay > 0, onScanFailed — kode kesalahan. Semua metode dipanggil di thread utama Android (main thread). Untuk pemrosesan panjang di onScanResult, gunakan coroutine atau HandlerThread.

ScanResult berisi: BluetoothDevice device (perangkat), int rssi (tingkat sinyal dalam dBm), ScanRecord scanRecord (data iklan), long timestampNanos (waktu deteksi sejak boot sistem). ScanRecord menyediakan: getServiceData() — UUID + data khusus, getManufacturerSpecificData() — data pabrikan, getAdvertiseFlags() — flag BLE. Tipe callback (callbackType) menunjukkan: CALLBACK_TYPE_ALL_MATCHES — kecocokan dengan filter, CALLBACK_TYPE_FIRST_MATCH — deteksi pertama, CALLBACK_TYPE_MATCH_LOST — kehilangan perangkat.

Kode kesalahan onScanFailed: SCAN_FAILED_ALREADY_STARTED (1) — pemindaian sudah dimulai, SCAN_FAILED_APPLICATION_REGISTRATION_FAILED (2) — pendaftaran aplikasi di tumpukan Bluetooth gagal, SCAN_FAILED_INTERNAL_ERROR (3) — kesalahan internal tumpukan, SCAN_FAILED_FEATURE_UNSUPPORTED (4) — pemindaian BLE tidak didukung pada perangkat.

kotlin
// Hasil pemindaian lengkap dan penanganan kesalahan
class ScanResultHandler {

    private val results = mutableListOf<ScanResult>()

    val scanCallback = object : ScanCallback() {

        // 1. Hasil tunggal
        override fun onScanResult(callbackType: Int, result: ScanResult) {
            // callbackType: 1 = ALL_MATCHES, 2 = FIRST_MATCH, 4 = MATCH_LOST
            if (callbackType == ScanSettings.CALLBACK_TYPE_MATCH_LOST) {
                onDeviceLost(result)
                return
            }

            // Tambahkan ke daftar (deduplikasi berdasarkan alamat)
            val existingIndex = results.indexOfFirst {
                it.device.address == result.device.address
            }
            if (existingIndex >= 0) {
                results[existingIndex] = result  // perbarui RSSI
            } else {
                results.add(result)
            }

            // Ekstrak data dari paket iklan
            val record = result.scanRecord
            val serviceData = record?.serviceData
            val manufacturerData = record?.manufacturerSpecificData

            print("Found: ${result.device.name ?: "N/A"}, RSSI: ${result.rssi}")
        }

        // 2. Hasil batch (reportDelay > 0)
        override fun onBatchScanResults(results: MutableList<ScanResult>?) {
            results?.let { batch ->
                print("Batch: ${batch.size} devices")
            }
        }

        // 3. Kesalahan pemindaian
        override fun onScanFailed(errorCode: Int) {
            val error = when (errorCode) {
                ScanCallback.SCAN_FAILED_ALREADY_STARTED -> "Already scanning"
                ScanCallback.SCAN_FAILED_APPLICATION_REGISTRATION_FAILED -> "Registration failed"
                ScanCallback.SCAN_FAILED_INTERNAL_ERROR -> "Internal error"
                ScanCallback.SCAN_FAILED_FEATURE_UNSUPPORTED -> "BLE not supported"
                else -> "Unknown error: $errorCode"
            }
            print("Error: $error")
        }
    }

    private fun onDeviceLost(result: ScanResult) {
        results.removeAll { it.device.address == result.device.address }
        print("Device lost: ${result.device.address}")
    }
}

Kelas ScanResultHandler memproses semua jenis callback BluetoothLeScanner. onScanResult memperbarui daftar perangkat dengan deduplikasi berdasarkan alamat MAC — RSSI diperbarui untuk perangkat yang sudah ditemukan. CALLBACK_TYPE_MATCH_LOST menandakan kehilangan perangkat (penghapusan dari daftar). onBatchScanResults memproses hasil batch untuk reportDelay > 0. onScanFailed memetakan kode kesalahan ke pesan yang dapat dibaca — penting untuk debugging pemindaian BLE.

PendingIntent: pemindaian BLE latar melalui BroadcastReceiver

Pemindaian PendingIntent — mekanisme BluetoothLeScanner untuk pemindaian BLE yang berfungsi bahkan saat aplikasi di latar belakang (dengan batasan Android 8+). Alih-alih ScanCallback, digunakan PendingIntent yang mengirim Broadcast ke BroadcastReceiver sistem saat perangkat BLE terdeteksi. Ini memungkinkan aplikasi menerima notifikasi tentang perangkat BLE tanpa berada di memori (sistem membuat proses saat menerima broadcast).

Batasan pemindaian latar: Di Android 8+ (API 26) layanan latar dibatasi — pemindaian PendingIntent menghindari batasan ini melalui BroadcastReceiver yang dapat dijalankan sistem saat menerima peristiwa BLE. Di Android 10+ (API 29) pemindaian BLE latar selanjutnya dibatasi oleh kebijakan penghematan daya pabrikan (Xiaomi, Huawei, Samsung memblokir operasi BLE latar). Untuk skenario BLE kritis, diperlukan notifikasi dengan foreground service.

kotlin
// Pemindaian BLE latar melalui PendingIntent
class BackgroundBLEScanner(private val context: Context) {

    private val scanner: BluetoothLeScanner? by lazy {
        val adapter = BluetoothAdapter.getDefaultAdapter()
        adapter?.bluetoothLeScanner
    }

    fun startBackgroundScan() {
        // Buat PendingIntent untuk BroadcastReceiver
        val intent = Intent(context, BLEBroadcastReceiver::class.java)
        val pendingIntent = PendingIntent.getBroadcast(
            context,
            0,
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
        )

        // Pengaturan pemindaian latar
        val settings = ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)
            .setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH)
            .setMatchMode(ScanSettings.MATCH_MODE_STICKY)
            .build()

        // Mulai pemindaian latar
        scanner?.startScan(
            null,  // filter
            settings,
            pendingIntent
        )
    }

    fun stopBackgroundScan() {
        val intent = Intent(context, BLEBroadcastReceiver::class.java)
        val pendingIntent = PendingIntent.getBroadcast(
            context, 0, intent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
        )
        scanner?.stopScan(pendingIntent)
    }
}

// BroadcastReceiver   BLE-
class BLEBroadcastReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        // Dapatkan hasil pemindaian
        val results = BluetoothLeScanner.getPendingIntentScanResults(intent)
        results?.let { scanResults ->
            for (result in scanResults) {
                // Kirim notifikasi ke pengguna
                showNotification(context, result.device.name ?: " ")
            }
        }
    }

    private fun showNotification(context: Context, name: String) {
        val notification = Notification.Builder(context, "ble_channel")
            .setSmallIcon(android.R.drawable.ic_dialog_info)
            .setContentTitle("BLE devices")
            .setContentText("Found: $name")
            .setAutoCancel(true)
            .build()
        val manager = context.getSystemService(Context.NOTIFICATION_SERVICE)
                as NotificationManager
        manager.notify(System.currentTimeMillis().toInt(), notification)
    }
}

Kelas BackgroundBLEScanner memulai pemindaian BLE latar melalui PendingIntent. startBackgroundScan membuat PendingIntent yang saat mendeteksi perangkat BLE mengirim Broadcast ke BLEBroadcastReceiver. BroadcastReceiver mengekstrak ScanResult melalui getPendingIntentScanResults() dan dapat menampilkan notifikasi atau mengirim data ke server. Pendekatan ini berfungsi bahkan jika aplikasi dihentikan oleh sistem — Android menjalankan BroadcastReceiver saat menerima broadcast.

Contoh pemindai BLE di Kotlin dengan BluetoothLeScanner

Contoh lengkap pemindai BLE di Kotlin, yang menggunakan BluetoothLeScanner dengan ScanSettings, ScanFilter, dan ScanCallback untuk menemukan perangkat Heart Rate Monitor. Pemindai menampilkan daftar perangkat yang ditemukan dengan RSSI dan UUID layanan, dengan kemampuan koneksi melalui BluetoothGatt.

kotlin
// Pemindai BLE lengkap dengan coroutine di Kotlin
class DeviceScanner(private val context: Context) {

    private val adapter: BluetoothAdapter? by lazy {
        val manager = context.getSystemService(Context.BLUETOOTH_SERVICE)
                as BluetoothManager
        manager.adapter
    }

    private val scanner: BluetoothLeScanner? by lazy {
        adapter?.bluetoothLeScanner
    }

    fun startScan(duration: Long = 10000): Flow<ScanResult> = callbackFlow {
        // Periksa status Bluetooth
        if (adapter?.isEnabled != true) {
            close(IllegalStateException("Bluetooth disabled"))
            return@callbackFlow
        }

        // Konfigurasi pemindaian
        val settings = ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
            .build()

        val filters = listOf(
            ScanFilter.Builder()
                .setServiceUuid(ParcelUuid.fromString("0000180D-0000-1000-8000-00805F9B34FB"))
                .build()
        )

        val callback = object : ScanCallback() {
            override fun onScanResult(callbackType: Int, result: ScanResult) {
                trySend(result)
            }

            override fun onScanFailed(errorCode: Int) {
                close(BLEException("Scan failed: $errorCode"))
            }
        }

        // Mulai pemindaian
        scanner?.startScan(filters, settings, callback)

        // Berhenti otomatis setelah durasi
        delay(duration)
        scanner?.stopScan(callback)
        close()
    }.flowOn(Dispatchers.IO)

    fun stop() {
        scanner?.stopScan(object : ScanCallback() {})
    }
}

class BLEException(message: String) : Exception(message)

Kelas DeviceScanner menggunakan Kotlin Flow (callbackFlow) untuk pemindaian BLE reaktif. Pemindaian dimulai dengan pengaturan LOW_LATENCY dan filter UUID Heart Rate Service. Hasil dikeluarkan melalui onScanResult ke Flow. Penghentian otomatis setelah durasi yang ditentukan (10 detik default). FlowOn(Dispatchers.IO) memindahkan operasi BLE ke thread latar. Pendekatan ini memungkinkan penggunaan pemindaian BLE dalam arsitektur MVVM melalui viewModelScope.launch dan collect.

Pertanyaan Umum

Apa itu BluetoothLeScanner di Android?

BluetoothLeScanner — kelas Android (API 21+) untuk pemindaian BLE. Diperoleh melalui BluetoothAdapter.getBluetoothLeScanner(). Mendukung tiga mode pemindaian (LOW_POWER, BALANCED, LOW_LATENCY), penyaringan berdasarkan UUID, nama dan alamat MAC, hasil batch, dan PendingIntent untuk pemindaian latar. Menggantikan metode usang BluetoothAdapter.startLeScan().

Apa perbedaan LOW_POWER dan LOW_LATENCY?

SCAN_MODE_LOW_POWER — mode latar dengan keterlambatan deteksi 5–10 detik, konsumsi daya minimal. SCAN_MODE_LOW_LATENCY — mode aktif dengan keterlambatan sekitar 100 ms, konsumsi daya maksimal. SCAN_MODE_BALANCED — kompromi (~2 detik keterlambatan). Untuk pemindaian UI gunakan LOW_LATENCY, untuk pemantauan latar — LOW_POWER dengan PendingIntent.

Mengapa BluetoothLeScanner tidak menemukan perangkat?

Penyebab: Bluetooth dinonaktifkan (periksa adapter.isEnabled), izin tidak diberikan (BLUETOOTH_SCAN pada API 31+, ACCESS_FINE_LOCATION pada API 23–30), scanner = null (adaptor tidak tersedia), perangkat di luar jangkauan, atau filter yang salah digunakan. Periksa juga onScanFailed — kode kesalahan akan menunjukkan penyebab: SCAN_FAILED_ALREADY_STARTED (1) atau SCAN_FAILED_APPLICATION_REGISTRATION_FAILED (2).

Bagaimana cara memindai BLE di latar pada Android?

Gunakan versi PendingIntent dari startScan() — berikan PendingIntent alih-alih ScanCallback. Saat perangkat BLE terdeteksi, Android mengirim Broadcast ke BroadcastReceiver yang dapat dijalankan oleh sistem bahkan jika aplikasi di latar belakang. Untuk Android 8+, tambahkan BroadcastReceiver ke manifes. Di Android 10+, pertimbangkan batasan penghematan daya pabrikan.

Berapa banyak perangkat BLE yang dapat dideteksi dalam satu pemindaian?

BluetoothLeScanner tidak memiliki batasan jumlah perangkat yang dapat dideteksi — batasan tergantung pada kepadatan BLE lingkungan. Di kantor bisa ada 20–50 perangkat BLE aktif, di pusat perbelanjaan — ratusan. Untuk penyaringan, gunakan ScanFilter (berdasarkan UUID, nama). Tanpa penyaringan, proses hasil secara asinkron — onScanResult dapat dipanggil puluhan kali per detik.

Ringkasan

  • BluetoothLeScanner — kelas Android modern (API 21+) untuk pemindaian BLE dengan pengaturan dan penyaringan
  • ScanSettings — tiga mode: LOW_POWER (latar), BALANCED (seimbang), LOW_LATENCY (aktif)
  • ScanFilter — penyaringan berdasarkan UUID layanan, nama perangkat, alamat MAC, data pabrikan dengan logika AND
  • ScanCallback — onScanResult (tunggal), onBatchScanResults (batch), onScanFailed (kode kesalahan)
  • PendingIntent — pemindaian latar melalui BroadcastReceiver, berfungsi dengan aplikasi dihentikan
  • ScanRecord — data iklan BLE: serviceData, manufacturerSpecificData, advertiseFlags, TX power level
  • Kotlin Flow — callbackFlow memungkinkan penggunaan BluetoothLeScanner dalam arsitektur reaktif dengan penghentian otomatis

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga