【发布时间】:2021-10-25 19:44:53
【问题描述】:
我正在开发一个应用程序来启动蓝牙设备应用程序。
我有一个名为MyService 的服务。
我有存根MyServiceImpl 来处理将从外部调用的 AIDL 接口。
我有广播接收器来获取“ACTION_BOND_STATE_CHANGED”。
我的要求是每当连接设备时(即device?.bondState == BluetoothDevice.BOND_BONDED,我需要将设备信息从广播接收器发送到MyServiceImpl 存根。
Reason - AIDL 接口已经在那里处理,一旦调用了aidl,就会从那里创建新的类。对于那个新类MyServiceImpl 是必需的。此外,通过回调发送的对该接口调用的响应也在此处处理。
代码如下。有人可以帮我将设备信息从 Broadcastreceiver 发送到服务存根实现吗?
class MyService : Service() {
override fun onBind(intent: Intent): IBinder {
return binder
}
override fun onUnbind(intent: Intent?): Boolean {
return super.onUnbind(intent)
}
override fun onCreate() {
binder = MyServiceImpl()
filterNewDevices()
}
private fun filterNewDevices() {
val filter = IntentFilter()
filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED)
registerReceiver(mBroadcastReceiverBond, filter)
}
private val mBroadcastReceiverBond: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent) {
if (intent.action == BluetoothDevice.ACTION_BOND_STATE_CHANGED) {
val device = intent.getParcelableExtra<BluetoothDevice>(BluetoothDevice.EXTRA_DEVICE)
if (device?.bondState == BluetoothDevice.BOND_BONDED) {
//HERE I NEED TO SEND THE device TO
}
if (device?.bondState == BluetoothDevice.BOND_BONDING) {
}
if (device?.bondState == BluetoothDevice.BOND_NONE) {
}
}
}
}
class MyServiceImpl : IBluetoothConnection.Stub(), IBinder {
private lateinit var btConnection: BTConnection
override fun registerUuid(name : String?, uuid : String?, connectionId : Int, btDevice : BluetoothDevice?) {
btConnection = BTConnection(this)
btConnection.initialize(name!!, UUID.fromString(uuid), connectionId, btDevice)
}
}
}
【问题讨论】:
-
在
MyServiceImpl中创建一个以device为参数的方法。在您的BroadcastReceiver中调用binder上的方法以将设备传递给服务实现。 -
谢谢@DavidWasser - 它有效
-
超级。我创建了一个答案。如果答案对您有用,您可以通过单击答案旁边的绿色复选标记来接受答案。这也将从开放问题列表中删除此问题。很高兴您能够解决问题。
标签: android bluetooth broadcastreceiver android-service android-broadcast