我撰寫了一個 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 沒有藍牙權限請求。
uj5u.com熱心網友回復:
嗯,我想通了。在 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
uj5u.com熱心網友回復:
BLUETOOTH_ADVERTISE、BLUETOOTH_CONNECT 和 BLUETOOTH_SCAN 權限是運行時權限。因此,您必須在您的應用程式中明確請求用戶批準,然后才能查找藍牙設備、使設備可被其他設備發現或與已配對的藍牙設備通信。當您的應用請求至少其中一項權限時,系統會提示用戶允許您的應用訪問附近的設備。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/424307.html
上一篇:如何將List<class>中的資料系結到Xamarin中的Picker元素
下一篇:如何將檔案.png轉換為位圖?沒有什么對我有用。錯誤“'無法解碼影像。提供的影像必須是位圖。'”Xamarin.forms
