Я пытаюсь разработать приложение для подключения устройств с помощью Bluetooth, для этой цели я использую 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");
}
}
scanPage.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 LE для Xamarin & MAUI мы можем найти следующее:
Для Android 12 и более поздних версий может потребоваться одно или несколько из следующих действий. дополнительные
runtime permissions
в зависимости от особенностей используемую вами библиотеку (см. разрешения Android Bluetooth документация)<uses-permission android:name = "android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name = "android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name = "android.permission.BLUETOOTH_ADVERTISE" />
Примечание:
На Мауи вы можете использовать Разрешения, чтобы проверить и запросить разрешение на выполнение.
Спасибо, это сработало, но теперь показывает исключение, а именно: ссылка на объект не установлена на экземпляр объекта.
@Джулиан Не могли бы вы помочь мне с этим исключением?
@ShubhankarPande Если вы столкнулись с новой проблемой, вам, вероятно, следует задать другой, отдельный вопрос, включающий необходимые подробности. Если исключение, которое вы видите сейчас, по-прежнему напрямую связано с вашим исходным вопросом, вам следует обновить вопрос.
Привет @ShubhankarPande, Thanks, it worked but now it is showing exception namely -- Object reference not set to an instance of an object
Это должна быть еще одна проблема. Одна проблема, одна тема. Для новой проблемы вы можете создать новую тему для новой проблемы. Мы все готовы помочь вам. :)
@JessieZhang-MSFT Я создам еще одну тему для решения этой проблемы.
Простой ссылки на документ, в котором объясняется, как запросить разрешения, недостаточно для ответа, вам следует включить пример непосредственно в свой ответ.