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 (tablet Wi-Fi-only, εξομοιωτής). Ο έλεγχος 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+ για την αίτηση διεύθυνσης MAC απαιτείται ACCESS_FINE_LOCATION (ή ACCESS_COARSE_LOCATION για API 31+). Σε 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 type, match mode), φιλτράρισμα μέσω ScanFilter (ανά UUID υπηρεσίας, όνομα συσκευής, διεύθυνση MAC) και υποστήριξη PendingIntent για σάρωση παρασκηνίου.

kotlin
// Παλιό (παρωχημένο) vs νέο 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, το callback LeScanCallback λαμβάνει BluetoothDevice, RSSI και ακατέργαστο scanRecord. Στο modernScan, χρησιμοποιείται ScanSettings με λειτουργία LOW_LATENCY (μέγιστη ταχύτητα ανίχνευσης) και ScanFilter για φιλτράρισμα ανά UUID υπηρεσίας καρδιακών παλμών (Heart Rate Service 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(): η εφαρμογή δεν εξαρτάται από στατικό singleton, ο διαχειριστής λαμβάνει υπόψη το περιβάλλον (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) για σάρωση 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+
Σάρωση 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 για σάρωση BLE εξακολουθεί να απαιτείται ACCESS_FINE_LOCATION. Ο προγραμματιστής πρέπει να λάβει υπόψη και τα δύο σενάρια κατά την αίτηση αδειών μέσω 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 στη συσκευή. Χαρακτηριστικό για tablet Wi-Fi-only, εξομοιωτή 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 με περιορισμένο σύνολο δεδομένων. Το BluetoothLeScanner συνιστάται από την Google για όλα τα νέα έργα, επιτρέπει φιλτράρισμα ανά 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. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης