- "Introduction to Bluetooth Low Energy" by Adafruit.
- "Android Lollipop: Bluetooth LE Matures" - A nice overview video by Dave Smith. Focuses on Lollipop and newer.
- Fragmented Episode 45: "Bluetooth (LE) with Dave (devunwired) Smith" - Another great Dave Smith overview if you prefer the podcast format!
- NordicSemiconductor/Android-BLE-Library
- Polidea/RxAndroidBle - For using RxJava with BLE.
- Beepiz/BleGattCoroutines - For using Kotlin's coroutines to sidestep BLE callback hell.
- iDevicesInc/SweetBlue (proprietary). May be useful if you have more dollars than time, or if you are developing stability-critical applications.
- douglasjunior/AndroidBluetoothLibrary.
Resources relevant to building Bluetooth Low Energy Android applications from scratch.
- "Bluetooth Low Energy on Android: Top Tips For The Tricky Bits" by Stuart Kent (slides, video) - My own talk!
- "Bluetooth Low Energy on Android" series by Erik Hellman (post 1) (post 2) - Comprehensive introductory articles.
- Android BLE Issues - A fairly complete list of symptoms you are likely to encounter while working with Android's BLE stack. Some apply to pre-Lollipop only, but many still exist and occur.
- NordicSemiconductor/puck-central-android - Source code for an Android app associated with Nordic Semiconductor's Puck platform. This implementation is pretty complete. In particular the serial operations logic within the operations types and operation manager implementation includes several optional but valuable refinements.
- googlesamples/android-BluetoothLeGatt - A compact
Service
and broadcast based example.
- Locations within the AOSP source code where GATT success and error codes are defined:
Useful users, questions, answers, and comments from Stack Overflow's Q&A.
- Emil - A user who consistently provides high-quality and detailed information regarding BLE on Android. Worth browsing their answers!
- "Android 4.3 Bluetooth Low Energy unstable" - In particular, this answer is a great overview and includes a hint regarding Wi-Fi/BLE interactions that I haven't seen elsewhere.
- "How to detect Bluetooth state change using a broadcast receiver?"
- "Difference between close() and disconnect() in Android Bluetooth API?"
- "Android - Could not connect to bluetooth device on Lollipop" - This answer provides some tips regarding the transport type flag passed to
BluetoothDevice.connectGatt
. - "Android Bluetooth LE: Not discovering services after connection" - This comment indicates that one should delay calls to
BluetoothGatt.close
until either (1) disconnection completes, or (2) a predefined period of time elapses. - "How to programmatically force bluetooth low energy service discovery on Android without using cache" - This answer formed the basis of my refined service cache-clearing method.
- "Android 4.3: How to connect to multiple Bluetooth Low Energy devices" - This answer discusses the serial nature of the Bluetooth APIs and indicates that things work the same for web and iOS.
- "Android BLE API: GATT Notification not received"
- "RxAndroidBle keeping a persistant connection + Write/Notification handling" - This answer confirms that RxAndroidBle was not designed to accommodate persistent connections. UPDATE: apparently this is possible; see author's tweet here.
- "Location requirement to scan for BLE devices" - This answer provides some context regarding the location permission requirement for scanning.
- "Is the native Android BLE implementation synchronous in nature?" - This answer confirms (from a Samsung perspective) that BLE operations should be performed serially.
- "clientIf field in Android BluetoothGatt class" - Some information on the
clientIf
value that's logged with almost all Android BLE calls. - "Why does setCharacteristicNotification() not actually enable notifications?"
- "Android Bluetooth Low Energy Characteristic notification count limit: does this vary by device?" - Clarification that the stack's 15 characteristic notifications limit is a limit per peripheral/server rather than per central/client/mobile device.
- "Android 4.3: Bluetooth LE pretty instable"
- "NullPointerException in BluetoothGatt.java when disconnecting and closing" - Includes discussion regarding exactly when
BluetoothGatt.disconnect
andBluetoothGatt.close
should be called. - "Emulator and Bluetooth" - Requests the addition of Bluetooth support to Android emulators (via host device Bluetooth).
- "Bluetooth permission request dialog" - Bug report related to weird window pop-up while programmatically prompting user to enable Bluetooth.
- "Get BLE scan result using 'BluetoothLeScanner.startScan' must open Location Service in Android 6.0" - Long thread related to location permissions and services requirements.
- "[BLE] Android does not discover services if device supports Service Changed" - Thread related to service caching and how to skip the cache.