Невозможно привязать службу (попытки всегда возвращают false). Почему? - PullRequest
1 голос
/ 07 марта 2020

Я пытаюсь обернуть голову вокруг 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 не отличается от исходного кода .

1 Ответ

0 голосов
/ 08 марта 2020

Тьфу. Я не осознавал, что служба должна быть объявлена ​​в файле манифеста, чтобы быть доступной компоненту для привязки. Добавить:

<service android:name=".blemodule.BLEService"></service>
...