Plugin.BLE for Xamarin.Forms not detecting devices



我最近开始使用Xamarin.Forms在Android和iOS应用程序上进行开发。我需要使用 BLE 检测并连接到自定义嵌入式设备,但是,直到现在我都没有成功。我尝试使用Plugin.BLE NuGet包,但该应用程序似乎没有检测到任何设备。但是,它确实会响应手机蓝牙连接(开/关(状态的变化。我事先尝试配对设备,但没有区别。我还尝试使用Play商店中的另一个应用程序检查设备,我可以在那里看到相应的设备。代码在InitializeComponent()之后从共享项目的MainPage.xaml.cs运行。我正在测试该应用程序的设备是运行Android 8.1的Google Pixel XL。当我尝试将三星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" />

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

为了解决这个问题,我将其添加到 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);
}
}

最新更新