You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:57:28