Plugin.BLE для Xamarin. Формы не обнаруживающие устройства - PullRequest
0 голосов
/ 24 мая 2018

Я недавно начал разработку приложения для Android и iOS с использованием Xamarin.Forms.Мне нужно обнаружить и подключиться к пользовательскому встроенному устройству с помощью BLE, однако до сих пор у меня ничего не получалось.Я пытался использовать пакет Plugin.BLE NuGet, но приложение, похоже, не обнаруживает никаких устройств.Однако он реагирует на изменения состояния Bluetooth-соединения телефона (ВКЛ / ВЫКЛ).Я пытался подключить устройство заранее, но это не имело никакого значения.Я также попытался проверить устройства с помощью другого приложения из магазина Play, и там я вижу соответствующее устройство.Код запускается из MainPage.xaml.cs общего проекта после InitializeComponent().Устройство, на котором я тестирую приложение, - это Google Pixel XL под управлением Android 8.1.Ничего не изменилось, когда я попытался использовать Samsung Galaxy S7 с Android 7.

Это код, который я использовал, прямо из официальной документации.

Пример кода:

private async void BLE()
{
   var ble = CrossBluetoothLE.Current;
   var adapter = CrossBluetoothLE.Current.Adapter;
   var state = ble.State;

   adapter.ScanMode = Plugin.BLE.Abstractions.Contracts.ScanMode.LowLatency;

   adapter.ScanTimeout = 5000;

   ble.StateChanged += (s, e) =>
   {
      i++;
      this.display.Text = "The bluetooth state changed, iteration  " + i;
      Debug.WriteLine($"The bluetooth state changed to {e.NewState}");
   };

   adapter.DeviceDiscovered += (s, a) => 
   {
      //  Debug.WriteLine(a.Device);
      eviceList.Add(a.Device.ToString());
     Debug.WriteLine("Device list: " + a.Device);
   };

   adapter.DeviceAdvertised += (s, a) =>
   {
      Debug.WriteLine("Device advertised: " + a.Device);
   };

   await adapter.StartScanningForDevicesAsync();
}

Разрешения:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

1 Ответ

0 голосов
/ 24 мая 2019

У меня была эта проблема пару дней назад, для меня это была проблема с разрешениями, так как Bluetooth требует разрешения Location (как у вас уже есть в вашем коде), но разрешение Location никогда не запрашивалось у пользователя.

Чтобы решить эту проблему, я добавил это в файл MainActivity.cs, чтобы все необходимые разрешения проверялись / запрашивались до запуска приложения.

private readonly string[] Permissions =
{
    Manifest.Permission.Bluetooth,
    Manifest.Permission.BluetoothAdmin,
    Manifest.Permission.AccessCoarseLocation,
    Manifest.Permission.AccessFineLocation
};

protected override void OnCreate(Bundle savedInstanceState)
{
    ...

    CheckPermissions();

    LoadApplication(new App());
}

private void CheckPermissions()
{
    bool minimumPermissionsGranted = true;

    foreach (string permission in Permissions)
    {
        if (CheckSelfPermission(permission) != Permission.Granted)
        {
            minimumPermissionsGranted = false;
        }
    }

    // If any of the minimum permissions aren't granted, we request them from the user
    if (!minimumPermissionsGranted)
    {
        RequestPermissions(Permissions, 0);
    }
}
...