插件 BLE 显示未处理的异常 .NET MAUI

问题描述 投票:0回答:1

我正在尝试开发一个用于使用蓝牙连接设备的应用程序,我正在使用 Plugin.BLE 来实现此目的,但它显示了一些未处理的异常

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:allowBackup="true" android:supportsRtl="true"></application>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <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" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

</manifest>

scanPage.xaml.cs

using Plugin.BLE;
using Plugin.BLE.Abstractions;
using Plugin.BLE.Abstractions.Contracts;
using Plugin.BLE.Abstractions.EventArgs;
using Plugin.BLE.Abstractions.Extensions;
using System;
using System.Text;
using System.Threading;


namespace sampleApp;

public partial class scanPage : ContentPage
{

    private CancellationToken cancellationToken;
    public scanPage()
    {
        InitializeComponent();
   
    }


    private async void scanBtn_Clicked(object sender, EventArgs e)
    {
        var adapter = CrossBluetoothLE.Current.Adapter;
        var systemDevices = adapter.GetSystemConnectedOrPairedDevices();

        var filteredDevices = systemDevices.Where(device => device.Name != null).ToList();

        ScanFilterOptions filterOptions = new ScanFilterOptions();
        // Create a list to hold device names for display
        var deviceList = filteredDevices.Select(device => device.Name);
        var deviceNames = deviceList.ToList();

        var device = systemDevices[0];
        try
        {
           Guid service_id = filterOptions.ServiceUuids[0];
                                
           Guid serviceUUID = service_id;

            var charUUID = Guid.Parse("00002A00-0000-1000-8000-00805f9b34fb");
            await adapter.ConnectToKnownDeviceAsync(serviceUUID);

            await SendDataToDevice(device, serviceUUID, charUUID);

            await DisplayAlert("Success", $"Connected to {device}!", "Ok");
        }
        catch (Exception ex)
        {
            await DisplayAlert("Exception", $"{ex.Message}", "Ok");
        }
    }
    private async Task SendDataToDevice(IDevice device, object serviceUuid, object characteristicUuid)
    {
        try
        {
            // Get the service and characteristic
            var service = await device.GetServiceAsync((Guid)serviceUuid);
            var characteristic = await service.GetCharacteristicAsync((Guid)characteristicUuid);

            // Your message to send
            string message = "Hello World from Xamarin.Forms!";

            // Convert message to byte array (replace with your encoding if needed)
            byte[] messageBuffer = Encoding.ASCII.GetBytes(message);

            // Write data to the characteristic
            await characteristic.WriteAsync(messageBuffer);

            await DisplayAlert("Sent", "Message sent successfully!", "Ok");
        }
        catch (Exception ex)
        {
            await DisplayAlert("Error", ex.Message, "Ok");
        }
    }
    private async void ListDataItem(object sender, SelectedItemChangedEventArgs e)
    {
        if (e.SelectedItem == null)
        {
            return; // No item selected, ignore
        }
        var selectedDeviceName = e.SelectedItem.ToString();

        // Handle device selection here (e.g., display alert or perform an action)
        await DisplayAlert("Selected Device", $"You selected: {selectedDeviceName}", "Ok");
    }
}

扫描页面.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="sampleApp.scanPage"
             Title="scanPage">
    <VerticalStackLayout HorizontalOptions="Center" VerticalOptions="Center" Spacing="50">
        <Label 
            Text="Welcome to .NET MAUI!"
            VerticalOptions="Center" 
            HorizontalOptions="Center" />

        <Button x:Name="scanBtn" Text="Scan now" Clicked="scanBtn_Clicked"/>
    </VerticalStackLayout>
</ContentPage>

我遇到以下异常

Java.Lang.SecurityException:“需要 android.permission.BLUETOOTH_CONNECT 权限 android.content.AttributionSource@c82fb2a4:GattService getDevicesMatchingConnectionStates”

我也添加了特定的依赖项,但我仍然收到此异常。

帮助表示赞赏!

.net bluetooth bluetooth-lowenergy maui mobile-application
1个回答
0
投票

Java.Lang.SecurityException:'需要 android.permission.BLUETOOTH_CONNECT 权限 android.content.AttributionSource@c82fb2a4:GattService getDevicesMatchingConnectionStates'

自 Android 6.0 起,并非所有权限都仅仅因为放置在清单中而被授予。您必须使用

BLUETOOTH_CONNECT
处理运行时权限流程。

从文档Xamarin&MAUI的蓝牙LE插件中,我们可以发现:

Android 12 及更高版本可能需要以下一项或多项 额外的运行时权限取决于哪些功能 您正在使用的库(请参阅 android 蓝牙权限 文档)

<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />

如果您想声明您的应用程序仅适用于支持 BLE 的设备,请将此行添加到您的清单中:

 <uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
© www.soinside.com 2019 - 2024. All rights reserved.