In my MAUI application, I need to scan for BLE devices. My code is working perfectly on Windows, however on Android, the scan does not discover any devices. I know I have to declare required permissions in manifest and interactively ask for them.
My minimum example for C#:
using Plugin.BLE;
using Plugin.BLE.Abstractions.Contracts;
namespace BLE2
{
public partial class MainPage : ContentPage
{
private IAdapter adapter;
private IBluetoothLE ble;
private List<IDevice> devices = [];
public MainPage()
{
InitializeComponent();
ble = CrossBluetoothLE.Current;
adapter = ble.Adapter;
adapter.ScanTimeout = 3000;
adapter.ScanMode = ScanMode.Balanced;
adapter.DeviceDiscovered += (sender, eventArgs) =>
{
devices.Add(eventArgs.Device);
};
}
private void OnScanBtnClicked(object sender, EventArgs e)
{
adapter.StartScanningForDevicesAsync();
}
protected override async void OnAppearing()
{
base.OnAppearing();
await RequestPermissionsAsync();
}
async Task RequestPermissionsAsync()
{
var locationPermitStatus = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
if (locationPermitStatus != PermissionStatus.Granted)
{
await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
}
var bluetoothPermitStatus = await Permissions.CheckStatusAsync<Permissions.Bluetooth>();
if (bluetoothPermitStatus != PermissionStatus.Granted)
{
await Permissions.RequestAsync<Permissions.Bluetooth>();
}
}
}
}
and the AnddoidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application android:allowBackup="true" android:icon="@mipmap/appicon" android:supportsRtl="true"></application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<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" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-sdk />
</manifest>
“Watching” properties while debugging shows that ale permissions are granted. However, the event adapter.deviceDiscovered is never fired (again tested with a breakpoint).
What have I missed?