在Android应用程序中可以找到蓝牙设备,但在Flatter的平台特定代码中找不到

在Android应用程序中可以找到蓝牙设备,但在Flatter的平台特定代码中找不到,android,flutter,dart,bluetooth,platform-specific,Android,Flutter,Dart,Bluetooth,Platform Specific,我正在尝试从蓝牙模块扫描、连接和接收数据。如果我只使用android应用程序,一切正常。我可以扫描并找到附近的所有设备,连接到任何人(我只对我的蓝牙模块感兴趣),并且我能够读取从蓝牙模块发送的测试数据 问题是应用程序正在使用颤振进行开发。我在Android应用程序中使用了相同的代码,并通过EventsChannel将其与Dart链接,但现在我在Flatter应用程序中只能看到较少的蓝牙设备,而且没有一个是我感兴趣的蓝牙模块。我对flatter和特定平台的编码还不熟悉,我不明白为什么相同的代码在同

我正在尝试从蓝牙模块扫描、连接和接收数据。如果我只使用android应用程序,一切正常。我可以扫描并找到附近的所有设备,连接到任何人(我只对我的蓝牙模块感兴趣),并且我能够读取从蓝牙模块发送的测试数据

问题是应用程序正在使用颤振进行开发。我在Android应用程序中使用了相同的代码,并通过EventsChannel将其与Dart链接,但现在我在Flatter应用程序中只能看到较少的蓝牙设备,而且没有一个是我感兴趣的蓝牙模块。我对flatter和特定平台的编码还不熟悉,我不明白为什么相同的代码在同一硬件上的不同应用程序中表现不同

我已经在三星S4和S8手机上测试了我的代码,结果是一样的

这是查找部件的EventChannel的代码:

new EventChannel(flutterEngine.getDartExecutor(), DISCOVER_CHANNEL).setStreamHandler(
        new EventChannel.StreamHandler() {
          @Override
          public void onListen(Object args, EventChannel.EventSink events) {
            Log.w(TAG, "Registering receiver");
            discoverReceiver = DiscoverReceiver(events);
            IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
            registerReceiver(discoverReceiver, filter);
          }

          @Override
          public void onCancel(Object args) {
            Log.w(TAG, "Unregistering receiver");
            unregisterReceiver(discoverReceiver);
            discoverReceiver = null;
          }
        }
);
目前,我的DiscoveryReceiver是一个全球广播接收器。 以下是Broadcastreceiver的代码:

private BroadcastReceiver DiscoverReceiver(final EventSink events) {
  return new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();
      if (BluetoothDevice.ACTION_FOUND.equals(action)) {
        // Discovery has found a device. Get the BluetoothDevice
        // object and its info from the Intent.
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        String deviceName = device.getName();

        if (deviceName == null){
          deviceName = "No Device Name";
        }

        events.success(deviceName);
        Log.w(TAG, "Sending " + deviceName);
      } 
    }
  };
}
**我使用(Log.w(TAG,“Sending”+deviceName);)语句查看事件是否丢失/丢弃。 下面是我如何在Dart中接收它:

@override
  void initState() {
    super.initState();
    devices.add(selectDevice);
    discoverChannel.receiveBroadcastStream().listen(onEvent);
  }

  void onEvent(Object event) {
    setState(() {
      devices.add(event);
    });
  }
以下是我的Android应用程序中的代码,可以扫描并查找所有设备,以备您与上述设备进行比较:

private BroadcastReceiver DiscoverReceiver() {
    return new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // Discovery has found a device. Get the BluetoothDevice
            // object and its info from the Intent.
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            String deviceName = device.getName();

            if (deviceName == null){
                deviceName = "No Device Name";
            }
            devicelist.add(device);
            devNames.add(deviceName);
            arrayAdapter.add(deviceName);
            arrayAdapter.notifyDataSetChanged();
            Log.w(TAG, "Sending " + deviceName);
            }
        }
    };
}
我不关心最后一个片段,但我只是想展示一下完整的流程。Snippet 2是我在一个独立的Android应用程序中拥有的内容的副本,它扫描并查找所有设备,但一旦我将其作为Android的本机代码在Flatter应用程序中使用,它将停止查找相同数量的设备,但仍会找到一些设备,这是非常不可靠的

我已经尝试了大多数FlatterBluetooth软件包,但没有一个是我想要的,因此我最终使用了特定于平台的代码,在将其插入到Flatter之前,该代码运行良好。我已经阅读了Android开发文档,上面的代码大部分是来自Android示例的修改代码。我只是不明白为什么相同的代码作为一个独立的应用程序可以找到更多的设备,而不是作为一个颤振应用程序的本机代码使用,如果最后它在相同的硬件上进行测试


任何意见都将不胜感激

好了,我终于找到了解决办法。这与Bluetooth的startDiscovery()的运行和正常工作有关,但事件会在稍后捕获,这是调试器无法显示的

因此,在我的例子中,所有设备都被“发现”,但颤振应用程序稍后开始捕获事件,因此它只显示发现期间发现的最后1或2个设备

我动议:

discoverChannel.receiveBroadcastStream().listen(onEvent);
从initState()进入一个在按下按钮后调用的函数,该函数确保在本机端注册广播接收器和Dart端注册广播流接收器之前加载了所有内容

我仍然不确定如何准确地表达这一点,但这是关于在本机端注册BroadcastReceiver和在Dart端注册receiveBroadcastStream的时间

现在,它启动发现并正确捕获事件,显示了在Android单机应用程序中找到的相同数量的设备


希望这能帮助将来可能面临这个奇怪问题的人。

好的,我终于找到了解决办法。这与Bluetooth的startDiscovery()的运行和正常工作有关,但事件会在稍后捕获,这是调试器无法显示的

因此,在我的例子中,所有设备都被“发现”,但颤振应用程序稍后开始捕获事件,因此它只显示发现期间发现的最后1或2个设备

我动议:

discoverChannel.receiveBroadcastStream().listen(onEvent);
从initState()进入一个在按下按钮后调用的函数,该函数确保在本机端注册广播接收器和Dart端注册广播流接收器之前加载了所有内容

我仍然不确定如何准确地表达这一点,但这是关于在本机端注册BroadcastReceiver和在Dart端注册receiveBroadcastStream的时间

现在,它启动发现并正确捕获事件,显示了在Android单机应用程序中找到的相同数量的设备


希望这能帮助将来可能会遇到这种奇怪问题的人。

请我需要此功能的帮助我可以获取此功能的完整代码吗请我需要此功能的帮助我可以获取此功能的完整代码吗