首页 > 解决方案 > Flutter 插件:将数据从 Android BroadcastReceiver 发送到 Flutter 代码

问题描述

我正在开发一个 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>
  1. 在我的“FlutterPlugin”类中,我初始化了一个EventChannel并设置了一个StreamHandler. 然后,我保留EventSinkonListen. StreamHandler这允许我将数据从插件的 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. onReceivemy 的函数中BroadCastReceiver,我使用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
  },
);

当应用程序运行时(在前台和后台),一切正常。但是,如果应用程序被终止,则BluetoothBroadcastReceiver(在插件的 Android 端)无法将任何数据传递到插件的 Flutter 端,因为EventChannel它没有被初始化。

EventChannelBroadcastReceiver触发时,我找不到任何方法来“唤醒”插件的 Flutter 端(并因此初始化)。

任何人都可以帮助我吗?

非常感谢您提前

标签: androidflutterbroadcastreceiverflutter-plugin

解决方案


我终于在 Medium 上找到了一篇非常有趣的帖子,它解释了如何在应用程序终止后将数据从原生 (Android) 代码发送到 Dart:https ://medium.com/@chetan882777/initiating-calls-to-dart-from-带有flutter-plugin-7d46aed32c47的背景中的本机侧


推荐阅读