Я пытаюсь сканировать, подключаться и получать данные от модуля 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. Я просто не могу понять, почему один и тот же код может найти больше устройств в качестве автономного приложения, а не использовать его как собственный код для приложения флаттера, если в конце он тестируется на том же оборудовании.
Мы будем благодарны за любой вклад!