| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 | using Android.Bluetooth;using Android.Bluetooth.LE;using Android.Content;using Android.OS;using System;using System.Collections.Generic;namespace MyLibrary.Bluetooth{    public class BLEScanner    {        private BluetoothManager _bluetoothManager;        private BluetoothAdapter _bluetoothAdapter;        private BluetoothLeScanner _bluetoothLeScanner;        private ScanCallback _scanCallback;        public BLEScanner(Context context)        {            _bluetoothManager = (BluetoothManager)context.GetSystemService(Context.BluetoothService);            _bluetoothAdapter = _bluetoothManager.Adapter;            _bluetoothLeScanner = _bluetoothAdapter?.BluetoothLeScanner;            if (_bluetoothLeScanner == null)            {                throw new Exception("Bluetooth LE Scanner is not available.");            }        }                /*         var bleScanner = new BLEScanner(Android.App.Application.Context);bleScanner.StartScan(    );// Stop the scan after 10 secondsTask.Delay(10000).ContinueWith(_ => bleScanner.StopScan());         */        public void StartScan(Action<ScanResult> onDeviceFound, Action onScanStopped = null)        {            _scanCallback = new CustomScanCallback(onDeviceFound, onScanStopped);            _bluetoothLeScanner.StartScan(_scanCallback);        }        public void StopScan()        {            _bluetoothLeScanner?.StopScan(_scanCallback);        }        private class CustomScanCallback : ScanCallback        {            private readonly Action<ScanResult> _onDeviceFound;            private readonly Action _onScanStopped;            public CustomScanCallback(Action<ScanResult> onDeviceFound, Action onScanStopped)            {                _onDeviceFound = onDeviceFound;                _onScanStopped = onScanStopped;            }            public override void OnScanResult(ScanCallbackType callbackType, ScanResult result)            {                base.OnScanResult(callbackType, result);                _onDeviceFound?.Invoke(result);            }            public override void OnScanFailed(ScanFailure errorCode)            {                base.OnScanFailed(errorCode);                _onScanStopped?.Invoke();                throw new Exception($"Scan failed with error code: {errorCode}");            }        }    }}
 |