【问题标题】:Xamarin Forms BLE Plugin Scan Issue Android 12Xamarin Forms BLE 插件扫描问题 Android 12
【发布时间】:2022-03-04 15:30:38
【问题描述】:

我编写了一个 xamarin 表单应用程序,它使用 Plugin.BLE NuGet 包扫描并连接到 ble 设备。它在我的手机上正常工作/调试,直到它(我的手机)更新到 Android 12.0 - API 31。我正在使用插件中的基本 vanilla 实现:

adapter.DeviceDiscovered += (s,a) => deviceList.Add(a.Device);
await adapter.StartScanningForDevicesAsync();

我发现 Android 12 需要不同的运行时权限 ([https://developer.android.com/guide/topics/connectivity/bluetooth/permissions#declare-android11-or-lower][1]) 我有试图在清单文件中容纳它们:

    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
    <application android:label="Rep_001.Android" android:theme="@style/MainTheme"></application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <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_PRIVILEGED" />
    <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-feature android:name="android.hardware.bluetooth_le" android:required="true" />https://developer.android.com/guide/topics/connectivity/bluetooth/permissions#declare-android11-or-lower

但可惜我没有运气。我在想我需要在运行时询问用户扫描和连接权限,但我不知道该怎么做,因为 Xamarin.Essentials 没有蓝牙权限请求。

【问题讨论】:

    标签: xamarin bluetooth bluetooth-lowenergy android-12


    【解决方案1】:

    好吧,我想通了。在 Android 项目中,我创建了一个继承自 Xamarin.Essentials.Permissions.BasePlatformPermission 的类:

     public class BLEPermission : Xamarin.Essentials.Permissions.BasePlatformPermission
    {
        public override (string androidPermission, bool isRuntime)[] RequiredPermissions => new List<(string androidPermission, bool isRuntime)>
    {
        (Android.Manifest.Permission.BluetoothScan, true),
        (Android.Manifest.Permission.BluetoothConnect, true)
    }.ToArray();
    }
    

    然后在 MainActivity.cs -> OnCreate() 中,我在应用程序加载后立即插入了 RequestAsync:

            protected override async void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
    
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
    
            await Permissions.RequestAsync<BLEPermission>();
        }
    

    现在,当应用首次加载时,它会询问用户蓝牙扫描连接权限。所有后续启动都不会重新提示权限。 在此过程中提供帮助的网站/文档

    https://developer.android.com/guide/topics/connectivity/bluetooth/permissions#declare-android11-or-lower

    https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/permissions?tabs=windows

    【讨论】:

      【解决方案2】:

      BLUETOOTH_ADVERTISEBLUETOOTH_CONNECTBLUETOOTH_SCAN 权限是运行时权限。

      因此,您必须先在您的应用中明确请求用户批准,然后才能查找蓝牙设备、使设备可被其他设备发现或与已配对的蓝牙设备通信。

      当您的应用至少请求其中一个permissions 时,系统会提示用户允许您的应用访问附近的设备。

      【讨论】: