You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Android Service中广播接收器的蓝牙设备数据传递给AIDL Stub实现类

实现方案

你可以按照以下步骤完成数据传递:

  1. 首先在MyService中提前声明binder成员变量,你当前的代码只在onCreate中赋值,没有提前定义变量
  2. 在MyServiceImpl中新增公开方法,用于接收配对完成的蓝牙设备,你可以在该方法中实现自己的业务逻辑,比如更新内部的btConnection信息、触发AIDL回调等
  3. 广播接收器是MyService的内部类,可以直接访问binder实例,在配对完成的分支调用上述新增方法传入设备即可

修改后的完整代码示例

class MyService : Service() {
    // 提前声明binder成员变量
    private lateinit var binder: MyServiceImpl

    override fun onBind(intent: Intent): IBinder {
        return binder
    }

    override fun onUnbind(intent: Intent?): Boolean {
        return super.onUnbind(intent)
    }

    override fun onCreate() {
       binder = MyServiceImpl()
       filterNewDevices()
    }

    override fun onDestroy() {
        super.onDestroy()
        // 注销广播避免内存泄露
        unregisterReceiver(mBroadcastReceiverBond)
    }

    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) {
                    // 直接调用binder的方法传入设备
                    binder.onDeviceBonded(device)
                }

                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)
            }
        
        // 新增接收配对设备的公开方法
        fun onDeviceBonded(device: BluetoothDevice) {
            // 在这里处理你的业务逻辑,比如更新btConnection的设备信息、触发AIDL回调等
            // 示例:如果已经初始化过btConnection,可以直接调用它的方法更新设备
            if (::btConnection.isInitialized) {
                btConnection.updateBondedDevice(device)
            }
        }
    }
}

注意事项

  • 安卓12及以上系统需要主动申请BLUETOOTH_CONNECT权限,否则无法正常获取蓝牙设备信息
  • 如果需要通过AIDL回调通知客户端配对完成,注意AIDL方法默认在服务端的Binder线程池运行,涉及UI操作需要切换到主线程处理
  • 如果有多个设备配对的场景,你可以在MyServiceImpl中维护一个已配对设备的集合,按需存储

内容的提问来源于stack exchange,提问作者RKVM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:54:00