Xamarin.Forms应用Android端蓝牙权限实现及按钮状态查询方案
Android端蓝牙权限处理实现
首先需在Android项目的AndroidManifest.xml中添加对应权限(适配不同Android版本):
<!-- Android 11及以下版本所需权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- Android 12+版本所需权限 --> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" android:usesPermissionFlags="neverForLocation" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
然后实现Android平台的BluetoothService类,需确保与共享项目中的IBluetoothService接口匹配:
using Android.Content; using Android.Content.PM; using Android.OS; using Xamarin.Essentials; public class BluetoothService : IBluetoothService { private readonly Context _context; public BluetoothService(Context context) { _context = context; } public Task<PermissionStatus> CheckPermissionAsync() { var status = PermissionStatus.Unknown; if (Build.VERSION.SdkInt >= BuildVersionCodes.S) { // Android 12+ 检查蓝牙扫描与连接权限 var scanPermission = _context.CheckSelfPermission(Manifest.Permission.BluetoothScan); var connectPermission = _context.CheckSelfPermission(Manifest.Permission.BluetoothConnect); if (scanPermission == Permission.Granted && connectPermission == Permission.Granted) status = PermissionStatus.Granted; else if (scanPermission == Permission.Denied || connectPermission == Permission.Denied) status = PermissionStatus.Denied; } else { // Android 11及以下 检查位置与蓝牙基础权限 var locationPermission = _context.CheckSelfPermission(Manifest.Permission.AccessFineLocation); var bluetoothPermission = _context.CheckSelfPermission(Manifest.Permission.Bluetooth); if (locationPermission == Permission.Granted && bluetoothPermission == Permission.Granted) status = PermissionStatus.Granted; else if (locationPermission == Permission.Denied || bluetoothPermission == Permission.Denied) status = PermissionStatus.Denied; } return Task.FromResult(status); } public async Task<PermissionStatus> RequestPermissionAsync() { Permission[] permissions; if (Build.VERSION.SdkInt >= BuildVersionCodes.S) permissions = new[] { Manifest.Permission.BluetoothScan, Manifest.Permission.BluetoothConnect }; else permissions = new[] { Manifest.Permission.AccessFineLocation, Manifest.Permission.Bluetooth }; var requestResult = await Permissions.RequestAsync(permissions); bool allGranted = true; foreach (var permission in permissions) { if (requestResult[permission] != PermissionStatus.Granted) { allGranted = false; break; } } return allGranted ? PermissionStatus.Granted : PermissionStatus.Denied; } }
按钮查询权限状态实现
1. 注册与获取服务实例
在共享项目中先定义统一接口(与iOS端保持一致):
using System.Threading.Tasks; using Xamarin.Essentials; public interface IBluetoothService { Task<PermissionStatus> CheckPermissionAsync(); Task<PermissionStatus> RequestPermissionAsync(); }
在App.xaml.cs中注册依赖服务:
DependencyService.Register<IBluetoothService, BluetoothService>();
在页面中获取服务实例:
var bluetoothService = DependencyService.Get<IBluetoothService>();
2. 按钮点击事件处理
private async void CheckPermissionBtn_Clicked(object sender, EventArgs e) { var status = await bluetoothService.CheckPermissionAsync(); string statusMsg = status switch { PermissionStatus.Granted => "蓝牙权限已授予", PermissionStatus.Denied => "蓝牙权限已拒绝", PermissionStatus.Restricted => "蓝牙权限受系统限制", PermissionStatus.Unknown => "蓝牙权限状态未确定", _ => "未知状态" }; await DisplayAlert("权限查询结果", statusMsg, "确定"); }
3. XAML按钮定义
<Button Text="查询蓝牙权限状态" Clicked="CheckPermissionBtn_Clicked" Margin="20"/>
内容的提问来源于stack exchange,提问作者edu
相关产品推荐
相关产品推荐

