首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Xamarin形成BLE插件扫描问题Android 12

Xamarin形成BLE插件扫描问题Android 12
EN

Stack Overflow用户
提问于 2022-02-08 05:06:37
回答 3查看 2K关注 0票数 4

我编写了一个xamarin应用程序,它使用Plugin.BLE NuGet包扫描并连接到ble设备。它在我的手机上完美无缺地工作/调试,直到它(我的手机)升级到Android12.0-API 31。我使用的是插件中的基本普通实现:

代码语言:javascript
运行
复制
adapter.DeviceDiscovered += (s,a) => deviceList.Add(a.Device);
await adapter.StartScanningForDevicesAsync();

我发现Android12需要不同的运行时权限(https://developer.android.com/guide/topics/connectivity/bluetooth/permissions#declare-android11-or-lower),并且我尝试在清单文件中容纳它们:

代码语言:javascript
运行
复制
    <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没有蓝牙权限请求。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-02-10 02:59:15

嗯,我想出来了。在Android中,我创建了一个从Xamarin.Essentials.Permissions.BasePlatformPermission:继承的类

代码语言:javascript
运行
复制
 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:

代码语言:javascript
运行
复制
        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://learn.microsoft.com/en-us/xamarin/android/app-fundamentals/permissions?tabs=windows

票数 4
EN

Stack Overflow用户

发布于 2022-02-09 02:50:53

BLUETOOTH_ADVERTISEBLUETOOTH_CONNECT,和BLUETOOTH_SCAN权限是运行时权限。

因此,您必须在应用程序中显式地请求用户批准,然后才能查找蓝牙设备,使设备可以被其他设备发现,或者与已经配对的蓝牙设备进行通信。

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

票数 2
EN

Stack Overflow用户

发布于 2022-06-20 19:44:52

对于Xamarin.Android,我用以下方法解决了这个问题

代码语言:javascript
运行
复制
    int requestCode=1;
// Check for permissions
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.BluetoothScan) != (int)Permission.Granted)
{
    Android.Support.V4.App.ActivityCompat.RequestPermissions(this, new string[] { Manifest.Permission.BluetoothScan }, requestCode );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71028853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档