在编写本机插件时,如何将Broadcastreceiver变成流汉?

发布于 2025-01-17 13:28:55 字数 3202 浏览 1 评论 0原文

我以前从未写过 android 代码。现在我想写一个收集Wi-Fi数据的Flutter插件。

按照指南并在 YouTube 上找到了一个视频,但作者使用了 StreamHandler,但我找不到实现StreamHandler相关代码的方法。

到目前为止,在 kotlin 端编写了这些代码,据我了解,我必须使用 wifiScanReceiver 作为 StreamHandler,但它是一个 BroadcastReceiver。因此 dataChannel!!.setStreamHandler(wifiScanReceiver) 给出错误。

class MainActivity(wifiManager: WifiManager) : FlutterActivity() {
    private val METHOD_CHANNEL_NAME = "com.baran.collect_wifi/method"
    private val DATA_CHANNEL_NAME = "com.baran.collect_wifi/data"

    private var methodChannel : MethodChannel? = null
    private lateinit var wifiManager: WifiManager
    private var dataChannel : EventChannel? = null
    private var eventSink: EventChannel.EventSink? = null


    @RequiresApi(Build.VERSION_CODES.M)
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        //Setup channels
        setupChannels(this, flutterEngine.dartExecutor.binaryMessenger)
    }

    override fun onDestroy() {
        teardownChannels()
        super.onDestroy()
    }

    private val wifiScanReceiver = object : BroadcastReceiver() {

        @RequiresApi(Build.VERSION_CODES.M)
        override fun onReceive(context: Context, intent: Intent) {
            val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)
            if (success) {
                scanSuccess()
            } else {
                scanFailure()
            }
        }
    }

    private fun scanSuccess() {
    }

    private fun scanFailure() {
        // handle failure: new scan did NOT succeed
        // consider using old scan results: these are the OLD results!
        val results = wifiManager.scanResults
    }

    @RequiresApi(Build.VERSION_CODES.M)
    private fun setupChannels(context: Context, messenger: BinaryMessenger){
        val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
        val intentFilter = IntentFilter()
        intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)

        context.registerReceiver(wifiScanReceiver, intentFilter)

        methodChannel = MethodChannel(messenger, METHOD_CHANNEL_NAME)

        methodChannel!!.setMethodCallHandler{
                call, _ ->
            if(call.method == "startScan"){
                val success = wifiManager.startScan()
                if (!success) {
                    // scan failure handling
                    scanFailure()
                }
            }

        }

        dataChannel = EventChannel(messenger, DATA_CHANNEL_NAME)
        dataChannel!!.setStreamHandler(wifiScanReceiver)
    }

    private fun teardownChannels() {
        methodChannel!!.setMethodCallHandler(null)
    }
}

这是到目前为止的颤振代码,

import 'dart:async';

import 'package:flutter/services.dart';

class CollectWifi {
  static const _channel = MethodChannel('com.baran.collect_wifi/method');
  static const _dataChannel = EventChannel('com.baran.collect_wifi/data');
}

我不知道我是否正确

I've never written android code before. Now I want to write a Flutter plugin that collects Wi-Fi data.

Following this guide and found a video on YouTube but author uses StreamHandler, but I couldn't find a way to implement StreamHandler related code.

Wrote these code so far in the kotlin side, as my understanding I have to use wifiScanReceiver as StreamHandler but it is a BroadcastReceiver. Therefore the dataChannel!!.setStreamHandler(wifiScanReceiver) gives error.

class MainActivity(wifiManager: WifiManager) : FlutterActivity() {
    private val METHOD_CHANNEL_NAME = "com.baran.collect_wifi/method"
    private val DATA_CHANNEL_NAME = "com.baran.collect_wifi/data"

    private var methodChannel : MethodChannel? = null
    private lateinit var wifiManager: WifiManager
    private var dataChannel : EventChannel? = null
    private var eventSink: EventChannel.EventSink? = null


    @RequiresApi(Build.VERSION_CODES.M)
    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)

        //Setup channels
        setupChannels(this, flutterEngine.dartExecutor.binaryMessenger)
    }

    override fun onDestroy() {
        teardownChannels()
        super.onDestroy()
    }

    private val wifiScanReceiver = object : BroadcastReceiver() {

        @RequiresApi(Build.VERSION_CODES.M)
        override fun onReceive(context: Context, intent: Intent) {
            val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)
            if (success) {
                scanSuccess()
            } else {
                scanFailure()
            }
        }
    }

    private fun scanSuccess() {
    }

    private fun scanFailure() {
        // handle failure: new scan did NOT succeed
        // consider using old scan results: these are the OLD results!
        val results = wifiManager.scanResults
    }

    @RequiresApi(Build.VERSION_CODES.M)
    private fun setupChannels(context: Context, messenger: BinaryMessenger){
        val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
        val intentFilter = IntentFilter()
        intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)

        context.registerReceiver(wifiScanReceiver, intentFilter)

        methodChannel = MethodChannel(messenger, METHOD_CHANNEL_NAME)

        methodChannel!!.setMethodCallHandler{
                call, _ ->
            if(call.method == "startScan"){
                val success = wifiManager.startScan()
                if (!success) {
                    // scan failure handling
                    scanFailure()
                }
            }

        }

        dataChannel = EventChannel(messenger, DATA_CHANNEL_NAME)
        dataChannel!!.setStreamHandler(wifiScanReceiver)
    }

    private fun teardownChannels() {
        methodChannel!!.setMethodCallHandler(null)
    }
}

And this is the flutter code so far

import 'dart:async';

import 'package:flutter/services.dart';

class CollectWifi {
  static const _channel = MethodChannel('com.baran.collect_wifi/method');
  static const _dataChannel = EventChannel('com.baran.collect_wifi/data');
}

I don't know if I'm going correctly

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

凌乱心跳 2025-01-24 13:28:55
  1. 您无法将 WifiManager 传递给 setStreamHandler
  2. Activity 不将 WifiManager 作为输入参数

我更新了源代码中的一些点,如下所示

class MainActivity : FlutterActivity()  {
    private val METHOD_CHANNEL_NAME = "com.baran.collect_wifi/method"
    private val DATA_CHANNEL_NAME = "com.baran.collect_wifi/data"

    private var methodChannel: MethodChannel? = null
    private var dataChannel: EventChannel? = null
    private var eventSink: EventChannel.EventSink? = null // using send data to flutter layer
    val wifiManager = application.getSystemService(Context.WIFI_SERVICE) as WifiManager
    val wifiScanReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)
            if (success) {
                scanSuccess()
            } else {
                scanFailure()
            }
        }
    }
    private fun scanSuccess() {
        val results = wifiManager.scanResults
        eventSink?.success("Wifi Connected")// send event to flutter layer
    }

    private fun scanFailure() {
        // handle failure: new scan did NOT succeed
        // consider using old scan results: these are the OLD results!
        val results = wifiManager.scanResults
        eventSink?.error("404","Wifi Not connected",null) // send event to flutter layer
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val intentFilter = IntentFilter()
        intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
        context.registerReceiver(wifiScanReceiver, intentFilter)
        val success = wifiManager.startScan()
        if (!success) {
            // scan failure handling
            scanFailure()
        }
    }

    override fun onDestroy() {
        unregisterReceiver(wifiScanReceiver) // remember unRegister to prevent memory leak
        super.onDestroy()
    }
    @RequiresApi(Build.VERSION_CODES.M)
    private fun setupChannels(context: Context, messenger: BinaryMessenger){
        val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
        val intentFilter = IntentFilter()
        intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)

        context.registerReceiver(wifiScanReceiver, intentFilter)

        methodChannel = MethodChannel(messenger, METHOD_CHANNEL_NAME)

        methodChannel!!.setMethodCallHandler{
                call, _ ->
            if(call.method == "startScan"){
                val success = wifiManager.startScan()
                if (!success) {
                    // scan failure handling
                    scanFailure()
                }
            }

        }

        dataChannel = EventChannel(messenger, DATA_CHANNEL_NAME)
        //dataChannel.setStreamHandler(setStreamHandler(wifiScanReceiver)
        dataChannel?.setStreamHandler(object :EventChannel.StreamHandler{
            override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
                eventSink = events // object using send data to flutter layer
            }

            override fun onCancel(arguments: Any?) {

            }

        })

    }

    private fun teardownChannels() {
        methodChannel!!.setMethodCallHandler(null)
    }
}
  1. you can not pass WifiManager in to setStreamHandler
  2. Activity does not take WifiManager as input parameter

I updated some point in your source code as below

class MainActivity : FlutterActivity()  {
    private val METHOD_CHANNEL_NAME = "com.baran.collect_wifi/method"
    private val DATA_CHANNEL_NAME = "com.baran.collect_wifi/data"

    private var methodChannel: MethodChannel? = null
    private var dataChannel: EventChannel? = null
    private var eventSink: EventChannel.EventSink? = null // using send data to flutter layer
    val wifiManager = application.getSystemService(Context.WIFI_SERVICE) as WifiManager
    val wifiScanReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context, intent: Intent) {
            val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)
            if (success) {
                scanSuccess()
            } else {
                scanFailure()
            }
        }
    }
    private fun scanSuccess() {
        val results = wifiManager.scanResults
        eventSink?.success("Wifi Connected")// send event to flutter layer
    }

    private fun scanFailure() {
        // handle failure: new scan did NOT succeed
        // consider using old scan results: these are the OLD results!
        val results = wifiManager.scanResults
        eventSink?.error("404","Wifi Not connected",null) // send event to flutter layer
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val intentFilter = IntentFilter()
        intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
        context.registerReceiver(wifiScanReceiver, intentFilter)
        val success = wifiManager.startScan()
        if (!success) {
            // scan failure handling
            scanFailure()
        }
    }

    override fun onDestroy() {
        unregisterReceiver(wifiScanReceiver) // remember unRegister to prevent memory leak
        super.onDestroy()
    }
    @RequiresApi(Build.VERSION_CODES.M)
    private fun setupChannels(context: Context, messenger: BinaryMessenger){
        val wifiManager = applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
        val intentFilter = IntentFilter()
        intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)

        context.registerReceiver(wifiScanReceiver, intentFilter)

        methodChannel = MethodChannel(messenger, METHOD_CHANNEL_NAME)

        methodChannel!!.setMethodCallHandler{
                call, _ ->
            if(call.method == "startScan"){
                val success = wifiManager.startScan()
                if (!success) {
                    // scan failure handling
                    scanFailure()
                }
            }

        }

        dataChannel = EventChannel(messenger, DATA_CHANNEL_NAME)
        //dataChannel.setStreamHandler(setStreamHandler(wifiScanReceiver)
        dataChannel?.setStreamHandler(object :EventChannel.StreamHandler{
            override fun onListen(arguments: Any?, events: EventChannel.EventSink?) {
                eventSink = events // object using send data to flutter layer
            }

            override fun onCancel(arguments: Any?) {

            }

        })

    }

    private fun teardownChannels() {
        methodChannel!!.setMethodCallHandler(null)
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文