The best resources for those new to Bluetooth Low Energy on the Android platform.
- 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!
- iDevicesInc/SweetBlue - A proprietary library that abstracts away many of Android BLE challenges. May be useful if you have more dollars than time, or if you are developing stability-critical applications.
- Polidea/RxAndroidBle - A reactive BLE wrapper, useful for one-shot connections and operations (is not set up to support persistent connections).
- douglasjunior/AndroidBluetoothLibrary - MIT-licensed Android BLE wrapper. I haven't personally used this, but it looks good.
- 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.
- Erik Hellman's in-progress blog post series (part 1) (part 2) - Comprehensive introductory articles.
- 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 Serviceand 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 his 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.closeuntil 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.
- 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 clientIfvalue 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.disconnectandBluetoothGatt.closeshould 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.