无法绑定服务(尝试总是 return false)。为什么?
Unable to bind service (attempts always return false). Why?
我正在尝试通过调整 this half-finished example project 来围绕 android 蓝牙 API 使其在 BLE 心率外围设备上工作(Espressif 的股票 HR 示例) , 运行 在 ESP32 开发板上)。
我的问题是我无法绑定管理 BLE 连接的 Service
;始终调用 bindService
returns 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
下面是主 activity onCreate 中发生的事情:
if (!BLEDeviceManager.isEnabled()) {
val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT)
}
BLEConnectionManager.initBLEService(this@MainActivity)
然后我尝试连接主按钮 activity:
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 class 与 original code 没有变化。
呃。我没有意识到必须在清单文件中声明该服务才能供组件使用以进行绑定。添加:
<service android:name=".blemodule.BLEService"></service>
我正在尝试通过调整 this half-finished example project 来围绕 android 蓝牙 API 使其在 BLE 心率外围设备上工作(Espressif 的股票 HR 示例) , 运行 在 ESP32 开发板上)。
我的问题是我无法绑定管理 BLE 连接的 Service
;始终调用 bindService
returns 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
下面是主 activity onCreate 中发生的事情:
if (!BLEDeviceManager.isEnabled()) {
val enableBtIntent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT)
}
BLEConnectionManager.initBLEService(this@MainActivity)
然后我尝试连接主按钮 activity:
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 class 与 original code 没有变化。
呃。我没有意识到必须在清单文件中声明该服务才能供组件使用以进行绑定。添加:
<service android:name=".blemodule.BLEService"></service>