BluetoothLeScanner — nedir, yöntemler ve Android'de BLE taraması

Yazar: IT Sectr Yayınlanma: 2026-07-16 Okuma süresi: 10 dk

BluetoothLeScanner, Bluetooth Low Energy cihazlarını taramak için API 21'den (Android 5.0) itibaren kullanılabilen bir Android sınıfıdır. BluetoothLeScanner, BluetoothAdapter üzerindeki eski startLeScan yöntemini değiştirerek esnek bir API sağlar: tarama yapılandırması (ScanSettings), filtreleme (ScanFilter) ve arka plan modu desteği (PendingIntent). Örnek, BluetoothAdapter.getBluetoothLeScanner() aracılığıyla alınır. Android Developers, 2026'ya göre BluetoothLeScanner üç güç modunu destekler ve hizmet UUID'si, cihaz adı veya MAC adresine göre filtreleme ile BLE reklam paketlerini taramaya izin verir.

Önemli Noktalar

  • BluetoothLeScanner — BLE taraması için modern Android API'si (API 21+), eski startLeScan'in yerini alır
  • ScanSettings — tarama modu yapılandırması: LOW_POWER, BALANCED, LOW_LATENCY ve geri arama türü
  • ScanFilter — hizmet UUID'si, cihaz adı, MAC adresi, üretici verilerine göre sonuç filtreleme
  • ScanCallback — hata kodlarıyla birlikte onScanResult, onBatchScanResults ve onScanFailed sonuç geri çağırmaları
  • PendingIntent — BroadcastReceiver aracılığıyla arka plan taraması, uygulama arka planda olsa bile

BluetoothLeScanner Nedir: özü ve örnek alma

BluetoothLeScanner, Android'de BLE taramasını yönetmek için bir sistem sınıfıdır. Basit bir LeScanCallback kabul eden BluetoothAdapter.startLeScan()'ın aksine, BluetoothLeScanner ayarlar, filtreler ve gelişmiş hata işleme ile nesne yönelimli bir API sağlar. Bu sınıf, BLE 4.2 desteğiyle birlikte API 21'de (Android 5.0) tanıtılmış ve tüm modern Android sürümlerinde birincil BLE tarama yöntemi olarak kalmıştır.

BluetoothLeScanner örneği, BluetoothAdapter.getBluetoothLeScanner() aracılığıyla alınır. Bluetooth adaptörü kullanılamıyorsa (Bluetooth devre dışı veya cihaz BLE'yi desteklemiyor) yöntem null döndürür. Almadan önce, PackageManager aracılığıyla BluetoothAdapter.isEnabled() ve FEATURE_BLUETOOTH_LE'nin varlığını kontrol edin. Tarayıcı alındıktan sonra, herhangi bir iş parçacığında tarama başlatılabilir — Android, BLE işlemlerini dahili bir Bluetooth yığını iş parçacığında planlar.

kotlin
// BluetoothLeScanner Alınıyor
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 {
        // BLE kullanılabilirliğini kontrol et
        if (!context.packageManager.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
            return false
        }

        // Bluetooth etkin mi kontrol et
        if (adapter?.isEnabled != true) {
            return false
        }

        // Tarayıcıyı al
        scanner = adapter?.bluetoothLeScanner
        return scanner != null
    }

    // Tarayıcı kullanılabilirliğini kontrol et
    val isAvailable: Boolean
        get() = scanner != null

    // Filtresiz temel taramayı başlat
    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}")
    }
}

BLEScannerManager sınıfı, BluetoothLeScanner'ın güvenli bir şekilde alınmasını ve başlatılmasını gösterir. initScanner, hasSystemFeature aracılığıyla BLE kullanılabilirliğini, Bluetooth'un etkinleştirildiğini ve tarayıcının başarıyla alındığını kontrol eder. startBasicScan, ayarlar veya filtreler olmadan taramayı başlatır — menzildeki tüm BLE cihazlarını keşfeder. handleResult, ScanResult'u ayrıştırır: BluetoothDevice (ad, adres), RSSI (sinyal gücü), scanRecord (reklam verileri).

ScanSettings: tarama modları ve geri arama türü

ScanSettings, BLE tarama yapılandırması için bir sınıftır. Ana parametre, güç tüketimi ile keşif gecikmesi arasındaki dengeyi belirleyen tarama modudur (scanMode). ScanSettings.Builder, şunları yapılandırmanıza olanak tanır: scanMode, callbackType (CALLBACK_TYPE_ALL_MATCHES, CALLBACK_TYPE_FIRST_MATCH, CALLBACK_TYPE_MATCH_LOST), matchMode (MATCH_MODE_AGGRESSIVE, MATCH_MODE_STICKY), reportDelay (toplu teslim gecikmesi) ve phy (PHY_LE_1M, PHY_LE_2M, PHY_LE_CODED).

Üç tarama modu: SCAN_MODE_LOW_POWER (0) — düşük güç tüketimiyle arka plan taraması, birkaç saniyelik keşif gecikmesi. SCAN_MODE_BALANCED (1) — çoğu senaryo için dengeli mod. SCAN_MODE_LOW_LATENCY (2) — minimum keşif gecikmesi (yaklaşık 100 ms), maksimum güç tüketimi. Aktif cihaz araması için LOW_LATENCY, arka plan izleme için LOW_POWER kullanın.

reportDelay — sonuçların toplu tesliminden önceki milisaniye cinsinden gecikme. reportDelay = 0 ise sonuçlar keşifte hemen gönderilir. > 0 ise Android sonuçları biriktirir ve onBatchScanResults aracılığıyla bir toplu gönderir. Toplu teslim, geri arama çağrılarını ve güç tüketimini azaltır, düşük öncelikli arka plan taraması için uygundur.

kotlin
// Farklı senaryolar için ScanSettings yapılandırması
class ScanSettingsProvider {

    // 1. Hızlı tarama (aktif arama)
    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. Güç verimli tarama (arka plan izleme)
    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)  // her 2 saniyede bir toplu
            .build()
    }

    // 3. BLE Uzun Menzil taraması (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. Yalnızca 2M PHY'de tara (BLE 5.0+)
    fun highSpeedScan(): ScanSettings {
        return ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
            .setPhy(ScanSettings.PHY_LE_2M)
            .build()
    }
}

ScanSettingsProvider sınıfı tipik yapılandırmalar içerir. lowLatencyScan — UI taraması için (“şimdi ve burada” arama). lowPowerScan — her 2 saniyede bir toplu ve callbackType FIRST_MATCH (yalnızca ilk keşifte tetiklenir) ile arka plan izleme için. longRangeScan, PHY_LE_CODED (BLE Uzun Menzil, 1 km'ye kadar) kullanır. highSpeedScan — PHY_LE_2M (2 Mbit/s, yalnızca BLE 5.0+ cihazlar).

ScanFilter: BLE cihazlarını UUID ve ada göre filtreleme

ScanFilter, BLE tarama sonuçlarını filtrelemek için bir sınıftır. Filtre olmadan, BluetoothLeScanner menzildeki tüm BLE cihazlarını döndürür — yoğun bir BLE ortamında bu dakikada yüzlerce paket olabilir. ScanFilter, sonuçları istenen cihazlara daraltarak güç tüketimini ve uygulama yükünü azaltır. Filtreler Bluetooth yığını seviyesinde uygulanır — uygun olmayan paketler uygulamaya ulaşmadan atılır.

Filtre türleri: setServiceUuid — hizmet UUID'si (tam 128 bit biçimi gerekli). setDeviceName — cihaz adının alt dizesi (büyük/küçük harf duyarlı, tam alt dize eşleşmesi). setDeviceAddress — tam MAC adresi. setManufacturerData — üretici verileri (şirket kimliği + maske). Tek bir tarama için birden çok filtre ayarlanabilir — cihaz tümüyle eşleşmelidir (VE mantığı). VEYA mantığı için birden çok tarama başlatın.

kotlin
// Farklı senaryolar için ScanFilter oluşturma
class ScanFilterFactory {

    // 1. Hizmet UUID'sine göre filtrele (Kalp Atış Hızı Monitörü)
    fun byHeartRateService(): ScanFilter {
        return ScanFilter.Builder()
            .setServiceUuid(
                ParcelUuid.fromString("0000180D-0000-1000-8000-00805F9B34FB")
            )
            .build()
    }

    // 2. Cihaz adına göre filtrele ( "iBeacon*")
    fun byDeviceName(): ScanFilter {
        return ScanFilter.Builder()
            .setDeviceName("Sensor")
            .build()
    }

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

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

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

ScanFilterFactory sınıfı tüm filtre türlerini gösterir. byHeartRateService, kalp atış hızı hizmeti 0x180D'ye sahip cihazları filtreler. byDeviceName, adında “Sensor” bulunan cihazları bulur (Apple filtreleme için benzersiz adlar önerir). byMacAddress — belirli bir cihazın tam araması. combinedFilter — UUID ve ada göre VE filtresi. byManufacturer — üretici verilerine göre filtre (örneğin, iBeacon için Apple şirket kimliği 0x004C kullanılır).

ScanCallback: tarama sonuçlarını ve hatalarını işleme

ScanCallback, BLE tarama sonuçlarını almak için soyut bir sınıftır. Üç yöntem içerir: onScanResult — tek sonuç (geri arama türü, ScanResult), onBatchScanResults — reportDelay > 0 için toplu sonuçlar, onScanFailed — hata kodu. Tüm yöntemler Android ana iş parçacığında çağrılır. onScanResult'ta uzun işlemler için coroutines veya HandlerThread kullanın.

ScanResult şunları içerir: BluetoothDevice device, int rssi (dBm cinsinden sinyal seviyesi), ScanRecord scanRecord (reklam verileri), long timestampNanos (sistem başlangıcından itibaren keşif zamanı). ScanRecord şunları sağlar: getServiceData() — UUID + özel veriler, getManufacturerSpecificData() — üretici verileri, getAdvertiseFlags() — BLE bayrakları. Geri arama türü şunları belirtir: CALLBACK_TYPE_ALL_MATCHES — filtreyle eşleşme, CALLBACK_TYPE_FIRST_MATCH — ilk keşif, CALLBACK_TYPE_MATCH_LOST — cihaz kayboldu.

onScanFailed hata kodları: SCAN_FAILED_ALREADY_STARTED (1) — tarama zaten başlatılmış, SCAN_FAILED_APPLICATION_REGISTRATION_FAILED (2) — Bluetooth yığınında uygulama kaydı başarısız, SCAN_FAILED_INTERNAL_ERROR (3) — dahili yığın hatası, SCAN_FAILED_FEATURE_UNSUPPORTED (4) — cihazda BLE taraması desteklenmiyor.

kotlin
// Tam tarama sonuçları ve hata işleme
class ScanResultHandler {

    private val results = mutableListOf<ScanResult>()

    val scanCallback = object : ScanCallback() {

        // 1. Tek sonuç
        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
            }

            // Listeye ekle (adrese göre yineleme kaldır)
            val existingIndex = results.indexOfFirst {
                it.device.address == result.device.address
            }
            if (existingIndex >= 0) {
                results[existingIndex] = result  // RSSI'yi güncelle
            } else {
                results.add(result)
            }

            // Reklam paketinden veri çıkar
            val record = result.scanRecord
            val serviceData = record?.serviceData
            val manufacturerData = record?.manufacturerSpecificData

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

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

        // 3. Tarama hatası
        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}")
    }
}

ScanResultHandler sınıfı tüm BluetoothLeScanner geri arama türlerini işler. onScanResult, MAC adresine göre yineleme kaldırma ile cihaz listesini günceller — daha önce bulunan cihazlar için RSSI güncellenir. CALLBACK_TYPE_MATCH_LOST, cihaz kaybını bildirir (listeden kaldırma). onBatchScanResults, reportDelay > 0 için toplu sonuçları işler. onScanFailed, hata kodlarını insan tarafından okunabilir mesajlara eşler — BLE tarama hata ayıklaması için kritiktir.

PendingIntent: BroadcastReceiver aracılığıyla arka plan BLE taraması

PendingIntent taraması, uygulama arka plondayken bile çalışan (Android 8+ kısıtlamalarıyla) BLE taraması için bir BluetoothLeScanner mekanizmasıdır. ScanCallback yerine, bir BLE cihazı keşfedildiğinde sistem BroadcastReceiver'ına Broadcast gönderen bir PendingIntent kullanılır. Bu, uygulamanın bellekte kalmadan BLE cihaz bildirimleri almasını sağlar (sistem, yayını aldığında işlemi oluşturur).

Arka plan tarama sınırlamaları: Android 8+'da (API 26), arka plan hizmetleri kısıtlanmıştır — PendingIntent taraması, sistemin BLE olayı aldığında başlatabileceği BroadcastReceiver aracılığıyla bu sınırlamayı aşar. Android 10+'da (API 29), arka plan BLE taraması, üreticilerin güç tasarrufu politikalarıyla (Xiaomi, Huawei, Samsung arka plan BLE işlemlerini engeller) daha da kısıtlanır. Kritik BLE senaryoları için bir ön plan hizmet bildirimi gereklidir.

kotlin
// PendingIntent aracılığıyla arka plan BLE taraması
class BackgroundBLEScanner(private val context: Context) {

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

    fun startBackgroundScan() {
        // BroadcastReceiver için PendingIntent oluştur
        val intent = Intent(context, BLEBroadcastReceiver::class.java)
        val pendingIntent = PendingIntent.getBroadcast(
            context,
            0,
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
        )

        // Arka plan tarama ayarları
        val settings = ScanSettings.Builder()
            .setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)
            .setCallbackType(ScanSettings.CALLBACK_TYPE_FIRST_MATCH)
            .setMatchMode(ScanSettings.MATCH_MODE_STICKY)
            .build()

        // Arka plan taramasını başlat
        scanner?.startScan(
            null,  // filtreler
            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) {
        // Tarama sonuçlarını al
        val results = BluetoothLeScanner.getPendingIntentScanResults(intent)
        results?.let { scanResults ->
            for (result in scanResults) {
                // Kullanıcıya bildirim gönder
                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)
    }
}

BackgroundBLEScanner sınıfı, PendingIntent aracılığıyla arka plan BLE taramasını başlatır. startBackgroundScan, BLE cihazı keşfinde BLEBroadcastReceiver'a Broadcast gönderen bir PendingIntent oluşturur. BroadcastReceiver, getPendingIntentScanResults() aracılığıyla ScanResult'u çıkarır ve bir bildirim gösterebilir veya sunucuya veri gönderebilir. Bu yaklaşım, uygulama sistem tarafından sonlandırılmış olsa bile çalışır — Android, yayını aldığında BroadcastReceiver'ı yeniden başlatır.

Kotlin'de BluetoothLeScanner ile BLE tarayıcı örneği

Tam örnek: Heart Rate Monitor cihazlarını bulmak için BluetoothLeScanner'ı ScanSettings, ScanFilter ve ScanCallback ile kullanan Kotlin'de bir BLE tarayıcısı. Tarayıcı, BluetoothGatt aracılığıyla bağlanma yeteneğiyle birlikte, bulunan cihazların RSSI ve hizmet UUID'leriyle bir listesini gösterir.

kotlin
// Kotlin'de coroutines ile tam BLE tarayıcı
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 {
        // Bluetooth durumunu kontrol et
        if (adapter?.isEnabled != true) {
            close(IllegalStateException("Bluetooth disabled"))
            return@callbackFlow
        }

        // Tarama yapılandırması
        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"))
            }
        }

        // Taramayı başlat
        scanner?.startScan(filters, settings, callback)

        // Süre sonunda otomatik dur
        delay(duration)
        scanner?.stopScan(callback)
        close()
    }.flowOn(Dispatchers.IO)

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

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

DeviceScanner sınıfı, reaktif BLE taraması için Kotlin Flow (callbackFlow) kullanır. Tarama, LOW_LATENCY ayarları ve Heart Rate Service UUID filtresiyle başlatılır. Sonuçlar, onScanResult aracılığıyla bir Flow'a gönderilir. Belirli bir süre sonra otomatik durma (varsayılan 10 saniye). FlowOn(Dispatchers.IO), BLE işlemlerini bir arka plan iş parçacığına taşır. Bu yaklaşım, viewModelScope.launch ve collect aracılığıyla MVVM mimarisinde BLE taramasını sağlar.

Sıkça Sorulan Sorular

Android'de BluetoothLeScanner nedir?

BluetoothLeScanner, BLE taraması için bir Android sınıfıdır (API 21+). BluetoothAdapter.getBluetoothLeScanner() aracılığıyla alınır. Üç tarama modunu (LOW_POWER, BALANCED, LOW_LATENCY), UUID, ad ve MAC adresine göre filtrelemeyi, toplu sonuçları ve arka plan taraması için PendingIntent'i destekler. Eski BluetoothAdapter.startLeScan() yönteminin yerini alır.

LOW_POWER, LOW_LATENCY'den nasıl farklıdır?

SCAN_MODE_LOW_POWER — 5–10 saniye keşif gecikmesiyle arka plan modu, minimum güç tüketimi. SCAN_MODE_LOW_LATENCY — yaklaşık 100 ms gecikmeyle aktif mod, maksimum güç tüketimi. SCAN_MODE_BALANCED — uzlaşma (~2 saniye gecikme). UI taraması için LOW_LATENCY, arka plan izleme için PendingIntent ile LOW_POWER kullanın.

BluetoothLeScanner neden cihaz bulamıyor?

Nedenler: Bluetooth devre dışı (adapter.isEnabled'i kontrol edin), eksik izinler (API 31+'da BLUETOOTH_SCAN, API 23–30'da ACCESS_FINE_LOCATION), scanner = null (adaptör kullanılamıyor), cihaz menzil dışında veya yanlış filtre. Ayrıca onScanFailed'ı kontrol edin — hata kodu nedeni belirtir: SCAN_FAILED_ALREADY_STARTED (1) veya SCAN_FAILED_APPLICATION_REGISTRATION_FAILED (2).

Android'de arka planda BLE nasıl taranır?

startScan()'in PendingIntent sürümünü kullanın — ScanCallback yerine PendingIntent iletin. Bir BLE cihazı keşfedildiğinde, Android BroadcastReceiver'a bir Broadcast gönderir; BroadcastReceiver, uygulama arka planda olsa bile sistem tarafından başlatılabilir. Android 8+ için BroadcastReceiver'i bildirime ekleyin. Android 10+'da üretici güç tasarrufu kısıtlamalarını göz önünde bulundurun.

Bir taramada kaç BLE cihazı keşfedilebilir?

BluetoothLeScanner'ın keşfedilebilir cihaz sayısında sınırı yoktur — sınır, ortamın BLE doygunluğuna bağlıdır. Bir ofiste 20–50 aktif BLE cihazı, bir alışveriş merkezinde yüzlerce cihaz olabilir. Filtreleme için ScanFilter (UUID, ada göre) kullanın. Filtreleme olmadan, sonuçları eşzamansız olarak işleyin — onScanResult saniyede onlarca kez çağrılabilir.

Özet

  • BluetoothLeScanner — ayarlar ve filtreleme ile BLE taraması için modern Android sınıfı (API 21+)
  • ScanSettings — üç mod: LOW_POWER (arka plan), BALANCED, LOW_LATENCY (aktif)
  • ScanFilter — VE mantığıyla hizmet UUID'si, cihaz adı, MAC adresi, üretici verilerine göre filtreleme
  • ScanCallback — onScanResult (tek), onBatchScanResults (toplu), onScanFailed (hata kodları)
  • PendingIntent — BroadcastReceiver aracılığıyla arka plan taraması, uygulama sonlandığında çalışır
  • ScanRecord — BLE reklam verileri: serviceData, manufacturerSpecificData, advertiseFlags, TX güç seviyesi
  • Kotlin Flow — callbackFlow, otomatik durma ile reaktif mimaride BluetoothLeScanner kullanımını sağlar

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun