我正在尝试开发一个用于使用蓝牙连接设备的应用程序,我正在使用 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”
我也添加了特定的依赖项,但我仍然收到此异常。
帮助表示赞赏!
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"/>