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

Posted

技术标签:

【中文标题】Flutter 插件:将数据从 Android BroadcastReceiver 发送到 Flutter 代码【英文标题】:Flutter plugin: Send data from Android BroadcastReceiver to Flutter code 【发布时间】:2021-11-08 19:54:47 【问题描述】:

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

这是我在插件的 Android 端所做的:

    在清单中,我注册了一个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
    


    在我的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 方面所做的:

    我设置了一个EventChannel,它将侦听传递给EventSink 的任何消息。
EventChannel('event_channel_bluetooth_event').receiveBroadcastStream().listen(
  (data) 
    // A bluetooth event happened
  ,
);

当应用程序运行时(在前台和后台),一切都运行良好。 但是,如果应用程序被杀死,BluetoothBroadcastReceiver(在插件的 Android 端)无法将任何数据传递到插件的 Flutter 端,因为 EventChannel 未初始化。

BroadcastReceiver 被触发时,我找不到任何方法来“唤醒”插件的 Flutter 端(从而初始化EventChannel)。

谁能帮我解决这个问题?

非常感谢您

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于Flutter 插件:将数据从 Android BroadcastReceiver 发送到 Flutter 代码的主要内容,如果未能解决你的问题,请参考以下文章

Map in Flutter for Web - 将数据从 JS 发送到 Flutter for Web

如何从 Flutter 中的平台特定模块(Android)登录

Flutter Doctor(不正确?)报告未安装 Android Studio Flutter 插件

更新到 Android Studio 4.1,flutter 插件和 dart 插件未安装

Flutter之Pigeon插件与Android通信使用指南

Flutter之Pigeon插件与Android通信使用指南