Xamarin.Forms的Plugin.BLE无法检测设备

Joh*_*ari 5 c# bluetooth nuget bluetooth-lowenergy xamarin.forms

我最近开始使用Xamarin.Forms在Android和iOS应用程序上进行开发。我需要使用BLE检测并连接到自定义嵌入式设备,但是直到现在我还是没有成功。我尝试使用Plugin.BLE NuGet程序包,但该应用程序似乎未检测到任何设备。但是,它确实会响应手机蓝牙连接状态的更改(开/关)。我尝试过预先配对设备,但没关系。我还尝试通过Play商店检查是否有其他应用带有其他设备,并且可以在其中看到相应的设备。该代码是从MainPage.xaml.cs共享项目的之后运行的InitializeComponent()。我正在测试该应用程序的设备是运行Android 8.1的Google Pixel XL。当我尝试在Android 7上使用Samsung Galaxy S7时,一切都没有改变。

这是我直接从官方文档中使用的代码。

代码示例:

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();
}
Run Code Online (Sandbox Code Playgroud)

权限:

<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" />
Run Code Online (Sandbox Code Playgroud)

bol*_*t19 7

几天前我遇到了这个问题,对我来说这是一个权限问题,因为蓝牙需要位置权限(正如您在代码中已经拥有的那样),但用户从未请求过位置权限。

为了解决这个问题,我将它添加到 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);
    }
}
Run Code Online (Sandbox Code Playgroud)