Flutter插件:如何从Android BroadcastReceiver将数据发送到Flutter代码

9

我正在开发一个Flutter插件(仅适用于Android),当设备连接到特定的蓝牙设备时,该插件会自动执行Flutter任务。

以下是插件在Android端的操作:

  1. 在清单文件中,注册一个监听蓝牙事件的BroadcastReceiver
<receiver android:name=".BluetoothBroadcastReceiver">
    <intent-filter>
        <action android:name="android.bluetooth.device.action.ACL_CONNECTED" />
        <action android:name="android.bluetooth.device.action.ACL_DISCONNECTED" />
        <action android:name="android.bluetooth.adapter.action.STATE_CHANGED" />
    </intent-filter>
</receiver>

在我的“FlutterPlugin”类中,我初始化了一个EventChannel并设置了一个StreamHandler。然后,我保留了在StreamHandleronListen函数中提供的EventSink的引用。这允许我将来自插件Android端的数据发送到插件Flutter端。
class BluetoothPlugin : FlutterPlugin {

    override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
        EventChannel(flutterPluginBinding.binaryMessenger, "event_channel_bluetooth_event")
            .setStreamHandler(object : StreamHandler {

                override fun onListen(arguments: Any?, eventSink: EventChannel.EventSink) {
                    BluetoothPlugin.eventSink = eventSink
                }

                override fun onCancel(arguments: Any?) {}

        })
    }

    companion object {
        var eventSink: EventChannel.EventSink? = null
    }

}
  1. 在我的BroadCastReceiveronReceive函数中,我使用EventSink通知Flutter插件的一次蓝牙事件发生了。
class BluetoothReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == BluetoothDevice.ACTION_ACL_CONNECTED) {
            BluetoothPlugin.eventSink?.success("Bluetooth device is connected")
        }
    }

}

以下是我在 Flutter 插件的部分所做的事情:

  1. 我设置了一个 EventChannel,用于监听传递给 EventSink 的任何信息。
EventChannel('event_channel_bluetooth_event').receiveBroadcastStream().listen(
  (data) {
    // A bluetooth event happened
  },
);

当应用在前台和后台运行时,一切都可以完美工作。但是,如果应用被杀掉,Android端插件中的BluetoothBroadcastReceiver无法向Flutter端插件传递任何数据,因为EventChannel未初始化。
我找不到任何方法在触发BroadcastReceiver时“唤醒”Flutter端插件(从而初始化EventChannel)。
有谁能帮我解决这个问题吗?
非常感谢您的帮助。

你成功地“唤醒”了插件的Flutter端吗?你解决了从BroadcastReceiver调用Dart/Flutter代码的问题吗? - mspnr
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接