BluetoothAdapter — Android-in sistem sinfi olub yerli Bluetooth adapterini təmsil edir. BluetoothAdapter Android-də bütün Bluetooth əməliyyatları üçün giriş nöqtəsidir: radionu yandırma (enable), cihazları skan etmə, görünməni idarəetmə (setScanMode), adapter haqqında məlumat əldə etmə (getName, getAddress, getState). Sinif BluetoothManager.getAdapter() (API 18+) və ya BluetoothAdapter.getDefaultAdapter() vasitəsilə əlçatandır. Bluetooth modulu olmayan cihazlarda getDefaultAdapter() null qaytarır. Android Developers, 2026-ya görə, BluetoothAdapter API 5-dən başlayaraq Android-də istənilən BLE tətbiqi üçün məcburi komponentdir.
Əsas məqamlar
BluetoothAdapter Android cihazının fiziki Bluetooth adapterini təmsil edir. Hər cihazın dəqiq bir adapteri var (istisna — bir neçə Bluetooth çipi olan Android Automotive, burada BluetoothManager.getAdapterList() istifadə olunur). BluetoothAdapter radionun vəziyyətini inkapsulə edir: STATE_OFF (0), STATE_TURNING_ON (1), STATE_ON (2), STATE_TURNING_OFF (3). Vəziyyət ACTION_STATE_CHANGED üzrə BroadcastReceiver vasitəsilə izlənilir.
BluetoothAdapter nümunəsinin əldə edilməsi Android-də hər hansı BLE tətbiqinin ilk addımıdır. Tövsiyə olunan metod — API 18+ ilə BluetoothManager.getAdapter(). Alternativ — API 5-dən işləyən, lakin daha az çevik olan BluetoothAdapter.getDefaultAdapter() statik metodu. Hər iki metod cihazda Bluetooth modulu yoxdursa null qaytarır (Wi-Fi-only planşetlər, emulyator). Null yoxlaması məcburidir: tətbiq düzgün şəkildə işini bitirməli və ya BLE funksiyalarını söndürməlidir.
// BluetoothAdapter-in əldə edilməsi (tövsiyə olunur)
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothManager
import android.content.Context
class BluetoothHelper(context: Context) {
private val bluetoothAdapter: BluetoothAdapter?
init {
// Metod 1: BluetoothManager vasitəsilə (API 18+)
val manager = context.getSystemService(Context.BLUETOOTH_SERVICE)
as BluetoothManager?
bluetoothAdapter = manager?.adapter
// Metod 2: statik metod vasitəsilə (API 5+)
// val adapter = BluetoothAdapter.getDefaultAdapter()
// Null yoxlaması
if (bluetoothAdapter == null) {
// Cihaz Bluetooth-u dəstəkləmir
}
}
// Bluetooth vəziyyətini yoxlayın
fun isBluetoothEnabled(): Boolean {
return bluetoothAdapter?.isEnabled == true
}
// Adapter haqqında məlumat əldə edin
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 sinfi BluetoothManager vasitəsilə BluetoothAdapter-in əldə edilməsini və sonrakı null yoxlamasını nümayiş etdirir. isBluetoothEnabled isEnabled-i yoxlayır — hər hansı BLE əməliyyatından əvvəl məcburi şərtdir. getAdapterInfo cihazın adını, MAC ünvanını, vəziyyətini və görünmə rejimini qaytarır. Vacib: Android 10+-da (API 29+) sistem xidməti, əgər tətbiqdə BLUETOOTH_ADMIN və ACCESS_FINE_LOCATION icazəsi yoxdursa, saxta MAC ünvanı (02:00:00:00:00:00) qaytarır.
BluetoothAdapter Bluetooth radiosunu idarəetmə metodlarını təqdim edir. enable() və disable() Bluetooth-u yandırır və söndürür. Hər iki metod BLUETOOTH_ADMIN icazəsi tələb edir və asinxron yerinə yetirilir: enable() çağırışından sonra sistem radionu yandırma prosesinə başlayır, vəziyyət BluetoothAdapter.ACTION_STATE_CHANGED aksiyonu ilə BroadcastReceiver vasitəsilə izlənilir. Android 10+-dan etibarən enable() və disable() əlavə sistem icazəsi tələb edir — adi tətbiqlər istifadəçi dialoqu olmadan Bluetooth-u proqramla idarə edə bilməz.
getState() adapterin cari vəziyyətini qaytarır: STATE_OFF (10), STATE_TURNING_ON (11), STATE_ON (12), STATE_TURNING_OFF (13). getAddress() Bluetooth adapterinin MAC ünvanını qaytarır. Android 6+-da MAC ünvanını sorğulamaq üçün ACCESS_FINE_LOCATION (və ya API 31+ üçün ACCESS_COARSE_LOCATION) tələb olunur. Android 10+-da getAddress() sabit 02:00:00:00:00:00 ünvanını qaytarır — real ünvan ictimai API vasitəsilə əlçatan deyil.
getScanMode() adapterin görünmə rejimini müəyyən edir: SCAN_MODE_NONE (görünməz), SCAN_MODE_CONNECTABLE (qoşulmuşlar üçün görünən), SCAN_MODE_CONNECTABLE_DISCOVERABLE (hamı üçün görünən). Görünmə rejimi təhlükəsizlik üçün vaxtla məhdudlaşdırılıb (adətən 60–300 saniyə). Rejimin setScanMode() vasitəsilə qurulması BLUETOOTH_ADMIN və Android 10+-da sistem icazəsi tələb edir.
| Metod | Təsvir | Tələb olunan icazə |
|---|---|---|
| enable() | Bluetooth radiosunun yandırılması | BLUETOOTH_ADMIN |
| disable() | Bluetooth radiosunun söndürülməsi | BLUETOOTH_ADMIN |
| getState() | Adapterin cari vəziyyəti | BLUETOOTH |
| getAddress() | Adapterin MAC ünvanı | BLUETOOTH + ACCESS_FINE_LOCATION (API 23+) |
| getScanMode() | Cihazın görünmə rejimi | BLUETOOTH |
| setScanMode() | Görünmə rejiminin qurulması | BLUETOOTH_ADMIN |
BluetoothAdapter iki skanetmə növünü dəstəkləyir. Klassik Bluetooth skanetməsi (BR/EDR) startDiscovery() vasitəsilə işə salınır — telefonlar və qulaqlıqlar da daxil olmaqla bütün növ Bluetooth cihazlarını aşkarlayır. Nəticələr BluetoothDevice.ACTION_FOUND aksiyonu ilə BroadcastReceiver vasitəsilə qaytarılır. startDiscovery() 12 saniyə işləyir və cancelDiscovery() çağırışı ilə ləğv edilə bilər. Bu metod BLE üçün köhnəlmişdir — BluetoothLeScanner istifadə edin.
BluetoothAdapter vasitəsilə BLE skanetməsi köhnəlmiş startLeScan(LeScanCallback) metodu ilə yerinə yetirilir. API 21-dən etibarən Google BluetoothAdapter.getBluetoothLeScanner() vasitəsilə əldə edilən BluetoothLeScanner-dən istifadə etməyi tövsiyə edir. BluetoothLeScanner daha çevik API təqdim edir: ScanSettings vasitəsilə skanetmə konfiqurasiyası (rejim, callback type, match mode), ScanFilter vasitəsilə filtrləmə (xidmət UUID-si, cihaz adı, MAC ünvanı üzrə) və fon skanetməsi üçün PendingIntent dəstəyi.
// Köhnəlmiş və yeni BLE skanetmə API-si
import android.bluetooth.BluetoothAdapter
import android.bluetooth.le.*
class BLEScanner(private val bluetoothAdapter: BluetoothAdapter?) {
// KÖHNƏLMİŞ: startLeScan (API 18+, API 21)
@Suppress("DEPRECATION")
fun legacyScan() {
bluetoothAdapter?.startLeScan { device, rssi, scanRecord ->
print("Found (LE Scan): $device.name, RSSI: $rssi")
}
}
// YENİ: BluetoothLeScanner (API 21+)
fun modernScan() {
val scanner = bluetoothAdapter?.bluetoothLeScanner
?: return
// Skanetmə parametrləri
val settings = ScanSettings.Builder()
.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY)
.setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES)
.setMatchMode(ScanSettings.MATCH_MODE_AGGRESSIVE)
.build()
// Xidmət üzrə filtrlə (Ürək döyüntüsü UUID)
val filters = listOf(
ScanFilter.Builder()
.setServiceUuid(ParcelUuid.fromString("0000180D-0000-1000-8000-00805F9B34FB"))
.build()
)
// Skanetməyə başla
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 sinfi köhnəlmiş startLeScan və müasir BluetoothLeScanner-i müqayisə edir. legacyScan-də LeScanCallback callback-i BluetoothDevice, RSSI və xam scanRecord alır. modernScan-də LOW_LATENCY rejimi (maksimum aşkarlama sürəti) ilə ScanSettings və nəbz xidmətinin UUID-si (Heart Rate Service 0x180D) üzrə filtrləmə üçün ScanFilter istifadə olunur. ScanCallback genişləndirilmiş məlumatları olan ScanResult obyekti ilə onScanResult təqdim edir: ad, RSSI, reklam məlumatları, qoşulma növü.
BluetoothManager — Bluetooth əməliyyatlarını idarə etmək üçün API 18-də (Android 4.3) təqdim edilmiş Android sistem xidmətidir. API 18-ə qədər BluetoothAdapter əldə etməyin yeganə yolu getDefaultAdapter() statik metodu idi. BluetoothManager təqdim edir: adapter — BluetoothAdapter nümunəsi, getConnectedDevices() — qoşulmuş cihazların siyahısı, getDevicesMatchingConnectionStates() — vəziyyət üzrə filtrləmə. BluetoothManager həmçinin köhnə API-lərdə BluetoothLeScanner əldə etmək üçün istifadə olunur.
BluetoothManager-in üstünlükləri birbaşa BluetoothAdapter.getDefaultAdapter() çağırışı ilə müqayisədə: tətbiq statik sinqletondan asılı deyil, menecer konteksti (Activity/Application) nəzərə alır, bu da Android Enterprise çoxhesablı ssenariləri üçün vacibdir. Bir neçə Bluetooth çipi olan Android Automotive-də BluetoothManager.getAdapterList() bütün mövcud adapterləri qaytarır — BluetoothAdapter.getDefaultAdapter() yalnız birincini qaytarır.
// BLE üçün BluetoothManager istifadəsi
class BLEConnection(context: Context) {
private val bluetoothManager: BluetoothManager =
context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager
private val adapter: BluetoothAdapter? = bluetoothManager.adapter
// Qoşulmuş BLE cihazlarının siyahısını əldə edin
fun getConnectedDevices(): List<BluetoothDevice> {
return bluetoothManager.getConnectedDevices(
BluetoothProfile.GATT
)
}
// Cihazları vəziyyət üzrə filtrlə
fun getDevicesByState(states: IntArray): List<BluetoothDevice> {
return bluetoothManager.getDevicesMatchingConnectionStates(
BluetoothProfile.GATT, states
)
}
// Cihazda BLE dəstəyini yoxlayın
fun isBLESupported(): Boolean {
return adapter != null && context.packageManager
.hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)
}
// Sistem dialoqu vasitəsilə Bluetooth-un yandırılmasını tələb edin
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 sinfi BluetoothAdapter-ə giriş və qoşulmuş GATT cihazlarının siyahısını əldə etmək üçün BluetoothManager-dən istifadə edir. isBLESupported BLE radiosunun mövcudluğunu PackageManager.hasSystemFeature(FEATURE_BLUETOOTH_LE) vasitəsilə yoxlayır — BLE olmadan Bluetooth Classic olan cihazlar üçün vacib yoxlamadır. requestEnableBluetooth sistem xidməti tələb etmədən Bluetooth-un yandırılması üçün sistem dialoqunu göstərir (ACTION_REQUEST_ENABLE) — bu, Android 10+-da sistem tətbiqi olmadan Bluetooth-u yandırmağın yeganə qanuni yoludur.
İcazələr BluetoothAdapter üçün Android-in hər versiyası ilə təkamül edib. Android 6–11-də (API 23–30) BLE skanetməsi üçün BLUETOOTH, BLUETOOTH_ADMIN və ACCESS_FINE_LOCATION məcburidir. Android 12+-da (API 31+) Google icazələri bölüb: ACCESS_FINE_LOCATION BLUETOOTH_SCAN (skanetmə), BLUETOOTH_CONNECT (qoşulma), BLUETOOTH_ADVERTISE (reklam) ilə əvəz olunub. BLE cihazlarını axtarmaq üçün BLUETOOTH_SCAN kifayətdir, yer tələb olunmur.
İcazə cədvəli Android versiyaları üzrə:
| Əməliyyat | API 23–30 | API 31+ |
|---|---|---|
| BLE skanetməsi | ACCESS_FINE_LOCATION | BLUETOOTH_SCAN (yer olmadan) |
| BLE-yə qoşulma | ACCESS_FINE_LOCATION | BLUETOOTH_CONNECT |
| BLE reklamı | ACCESS_FINE_LOCATION | BLUETOOTH_ADVERTISE |
| Yandırma/söndürmə | BLUETOOTH_ADMIN | BLUETOOTH_ADMIN (sistem) |
| MAC ünvanının alınması | ACCESS_FINE_LOCATION | BLUETOOTH_CONNECT (saxta ünvan) |
Android 12+-da bütün Bluetooth icazələri icra vaxtı icazələridir — onlar ActivityResultContracts.RequestMultiplePermissions vasitəsilə icra vaxtı tələb olunmalıdır. BLUETOOTH_SCAN və BLUETOOTH_ADVERTISE NEARBY_DEVICES qrupuna aiddir, BLUETOOTH_CONNECT — eyni qrupa. BLUETOOTH və BLUETOOTH_ADMIN icazələri API < 31 ilə uyğunluq üçün manifestdə qalır, lakin API 31+ üçün onlar nəzərə alınmır — Google yeni icazələrin açıq şəkildə göstərilməsini tələb edir.
// Android 12+-da Bluetooth icazələrinin tələbi
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 skanetməsi
arrayOf(
Manifest.permission.BLUETOOTH_SCAN,
Manifest.permission.BLUETOOTH_CONNECT,
Manifest.permission.BLUETOOTH_ADVERTISE
)
} else {
// Android 6-11: BLE skanetməsi
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.BLUETOOTH,
Manifest.permission.BLUETOOTH_ADMIN
)
}
}
// Bütün icazələri yoxlayın
fun hasPermissions(context: Context): Boolean {
return getRequiredPermissions().all { permission ->
ContextCompat.checkSelfPermission(context, permission)
== PackageManager.PERMISSION_GRANTED
}
}
}
PermissionHelper sinfi API səviyyəsindən asılı olaraq düzgün icazə dəstini qaytarır. Android 12+-da yer olmadan BLUETOOTH_SCAN, BLUETOOTH_CONNECT, BLUETOOTH_ADVERTISE istifadə olunur. Android 6–11-də BLE skanetməsi üçün hələ də ACCESS_FINE_LOCATION tələb olunur. Tərtibatçı ActivityResultContracts və ya RxPermissions vasitəsilə icazə tələb edərkən hər iki ssenarini nəzərə almalıdır.
Tam nümunə — BLE cihazını skan etmək, qoşulmaq və məlumat oxumaq üçün BluetoothAdapter istifadə edən Kotlin-də BLE tətbiqi. Nümunə icazələrin yoxlanılması, adapterin əldə edilməsi, BluetoothLeScanner vasitəsilə skanetmə və BluetoothDevice.connectGatt vasitəsilə qoşulmanı əhatə edir.
// Kotlin-də tam BLE meneceri
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. Xidmətlərin aşkarlanması
fun canScan(): Boolean {
return adapter?.isEnabled == true
&& scanner != null
&& PermissionHelper(context).hasPermissions(context)
}
// 2. Filtrlə skanetmə
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. Skanetməni dayandır
fun stopScanning() {
scanner?.stopScan(object : ScanCallback() {})
}
// 4. BLE cihazına qoşul
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) {
// Xidmətlər tapıldı, xarakteristikaları oxumaq olar
}
},
BluetoothDevice.TRANSPORT_LE
)
}
// 5. Resursları boşalt
fun disconnect() {
gatt?.disconnect()
gatt?.close()
gatt = null
}
}
BLEManager meneceri Android-də tam BLE dövranını birləşdirir: adapter və icazələrin yoxlanılması (canScan), ScanSettings ilə BluetoothLeScanner vasitəsilə skanetmə (startScanning), TRANSPORT_LE ilə BluetoothDevice.connectGatt vasitəsilə qoşulma (connectToDevice), resursların boşaldılması (disconnect). Bütün BLE əməliyyatları UI axınında yerinə yetirilir — Android BluetoothGattCallback callbacklərini əsas axında çağırır. Məhsuldar BLE tapşırıqları üçün GATT əməliyyatlarını fon HandlerThread-ə çıxarmaq tövsiyə olunur.
Tez-tez verilən suallar
BluetoothAdapter — Android cihazının yerli Bluetooth adapterini təmsil edən sinif. BluetoothManager.getAdapter() (API 18+) və ya BluetoothAdapter.getDefaultAdapter() vasitəsilə əldə edilir. Bluetooth-u yandırma/söndürmə, cihazları skan etmə, görünməni idarəetmə və adapter haqqında məlumat əldə etmə metodlarını təqdim edir. Bluetooth modulu olmayan cihazlarda null qaytarır.
Səbəb — cihazda Bluetooth radiosunun olmamasıdır. Wi-Fi-only planşetlər, Android emulyatoru və Bluetooth olmayan Android TV üçün xarakterikdir. Tətbiq işə düşəndə getDefaultAdapter()-i null üçün yoxlayın və adapter yoxdursa BLE funksiyalarını söndürün. Alternativ — daha dəqiq müəyyən etmək üçün PackageManager.hasSystemFeature(FEATURE_BLUETOOTH_LE) vasitəsilə yoxlama.
BluetoothLeScanner (API 21+) — ScanFilter, ScanSettings və PendingIntent dəstəyi ilə BLE skanetməsi üçün müasir API. startLeScan (API 18+) — məhdud məlumat dəsti ilə LeScanCallback qəbul edən köhnəlmiş BluetoothAdapter metodu. BluetoothLeScanner Google tərəfindən bütün yeni layihələr üçün tövsiyə olunur, UUID üzrə filtrləməyə, enerji istehlakı rejimini konfiqurasiya etməyə və PendingIntent vasitəsilə fonda işləməyə imkan verir.
Android 12+-da (API 31) BLE skanetməsi üçün BLUETOOTH_SCAN, qoşulma üçün BLUETOOTH_CONNECT, reklam üçün BLUETOOTH_ADVERTISE tələb olunur. ACCESS_FINE_LOCATION yer icazəsi artıq BLE üçün tələb olunmur. Android 6–11-də ACCESS_FINE_LOCATION lazımdır. Bütün icazələr ActivityResultContracts vasitəsilə icra vaxtı tələb olunur.
Android 10+-dan etibarən sistem dialoqu olmadan Bluetooth-u proqramla yandırmaq yalnız BLUETOOTH_PRIVILEGED icazəsi olan sistem tətbiqləri üçün mümkündür. Adi tətbiqlər Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE) və startActivityForResult istifadə etməlidir — istifadəçi sistem dialoqunda yandırmanı təsdiqləyir. Manifestdə BLUETOOTH_ADMIN Android 10+-da enable() hüququ vermir.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun