Я пытаюсь обернуть голову вокруг android bluetooth API, адаптировав этот неполный пример проекта , чтобы заставить его работать на периферийном пульсе BLE (стандартный HR-пример от Espressif, работает на плате разработчиков ESP32).
Моя проблема в том, что я не могу связать Service
, который управляет соединением BLE; вызов bindService
всегда возвращает false
(см. закомментированную строку в initBLEService
во фрагменте кода ниже). Я не могу понять, почему и как правильно запустить службу. Помогите?
Вот как я управляю подключением BLE:
object BLEConnectionManager {
private val TAG = "BLEConnectionManager"
private var mBLEService: BLEService? = null
private var isBind = false
private val mServiceConnection = object : ServiceConnection {
override fun onServiceConnected(componentName: ComponentName, service: IBinder) {
mBLEService = (service as BLEService.LocalBinder).getService()
Log.i(TAG, "BLEConnectionManager.onServiceConnected mBLEService = $mBLEService")
if (!mBLEService?.initialize()!!) {
Log.e(TAG, "Unable to initialize")
}
}
override fun onServiceDisconnected(componentName: ComponentName) {
mBLEService = null
}
}
fun initBLEService(context: Context) {
try {
if (mBLEService == null) {
val gattServiceIntent = Intent(context, BLEService::class.java)
if (context != null) {
// BELOW LINE ALWAYS RETURNS false. WHY?
isBind = context.bindService(gattServiceIntent, mServiceConnection,
Context.BIND_AUTO_CREATE)
Log.i(TAG, "BLEConnectionManager.initBLEService isBind = $isBind")
}
}
} catch (e: Exception) {
Log.e(TAG, e.message)
}
}
fun connect(deviceAddress: String): Boolean {
var result = false
Log.i(TAG, "BLEConnectionManager.connect (to $deviceAddress) and mBLEService is $mBLEService")
if (mBLEService != null) result = mBLEService!!.connect(deviceAddress)
return result
}
// ...etc
А вот что происходит в основной активности onCreate:
if (!BLEDeviceManager.isEnabled()) {
val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT)
}
BLEConnectionManager.initBLEService(this@MainActivity)
И я пытаюсь для подключения с помощью кнопки в основном задании:
private fun connectDevice() {
Handler().postDelayed({
BLEConnectionManager.initBLEService(this@MainActivity)
if (BLEConnectionManager.connect(mDeviceAddress)) {
Toast.makeText(this@MainActivity, "DEVICE CONNECTED", Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this@MainActivity, "DEVICE CONNECTION FAILED", Toast.LENGTH_SHORT).show()
}
}, 1000)
}
Класс BLEService не отличается от исходного кода .