Устройства Bluetooth, обнаруженные в приложении Android, но не в коде c платформы во Flutter - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь сканировать, подключаться и получать данные от модуля Bluetooth. Все работает нормально, если я просто использую приложение android. Я могу сканировать и находить все ближайшие устройства, подключаться к кому угодно (меня интересует только мой модуль Bluetooth), и я могу читать тестовые данные, которые отправляются с модуля Bluetooth.

Проблема в том, что приложение разрабатывается с использованием Flutter. Я использовал тот же код из моего приложения Android и связал его с Dart через EventsChannel, но теперь я вижу только меньшее количество устройств Bluetooth в приложении Flutter, и ни один из них не является тем модулем Bluetooth, который меня интересует. Я новичок в Flutter и кодировании платформы c, я не могу понять, почему один и тот же код ведет себя по-разному в разных приложениях на одном и том же оборудовании.

Я тестировал свой код на телефонах Samsung 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;
          }
        }
);

На данный момент мой discoverReceiver является глобальным BroadcastReceiver. Ниже приведен код для 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);
            }
        }
    };
}

Последний фрагмент меня не интересует, но я просто подумал, что покажу весь поток. Фрагмент 2 - это копия того, что у меня есть в автономном приложении Android, и он сканирует и находит все устройства, но как только я использую его в приложении Flutter в качестве собственного кода для Android, он перестает находить такое же количество устройств. , все еще находит некоторые из них и очень ненадежен.

Я пробовал большинство пакетов Bluetooth Flutter, но ни один из них не был тем, что я искал, и поэтому я остановился на коде платформы c, который работал нормально, пока не был подключен к Flutter. Я прочитал документацию по разработке Android, и приведенный выше код в основном представляет собой модифицированный код из образца Android. Я просто не могу понять, почему один и тот же код может найти больше устройств в качестве автономного приложения, а не использовать его как собственный код для приложения флаттера, если в конце он тестируется на том же оборудовании.

Мы будем благодарны за любой вклад!

1 Ответ

0 голосов
/ 07 мая 2020

Хорошо, я наконец нашел решение. Это как-то связано с запуском startDiscovery () Bluetooth и правильным выполнением своей работы, но события фиксируются немного позже, что отладчик не сможет показать.

Итак, в моем случае все устройства были «обнаружены», но приложение flutter начинает регистрировать события позже, поэтому оно показывает только последние 1 или 2 устройства, которые были обнаружены во время обнаружения.

I перемещено:

discoverChannel.receiveBroadcastStream().listen(onEvent);

Из initState () в функцию, которая вызывается после нажатия кнопки, что гарантирует, что все загружено, прежде чем регистрировать широковещательный приемник на собственной стороне и приемник широковещательного потока на Dart .

Я все еще не уверен, как express это сделать, но речь идет о времени регистрации BroadcastReceiver на собственной стороне и receiveBroadcastStream на стороне Dart.

Теперь он запускается обнаружение и правильно фиксирует события, что показывает то же количество устройств, что и в автономном приложении Android.

Надеюсь, это поможет любому, кто может столкнуться с этой странной проблемой в будущем.

...