Как создать библиотеку классов UWP с разрешениями Bluetooth?
Я задал похожий вопрос вчера, но думаю, что это был не тот вопрос. У меня есть PCL, который использует Xamarin для реализации поддержки Bluetooth LE на iOS и Android, но теперь я должен реализовать поддержку Windows BT. Похоже, единственный способ сделать это - через UWP, но после создания библиотеки классов UWP для этого и обращения к ней через мой PCL DeviceWatcher переходит от Created к EnumerationComplete.
Я предполагаю, что это происходит из-за того, что программе не было предоставлено разрешение Bluetooth, поскольку это должно быть указано в манифесте, который не используется в библиотеке классов. Ребята, вы случайно не знаете, правда ли это? Как я могу предоставить разрешения моей библиотеке классов PCL и / или UWP? Ниже приведен код, написанный мною в UWP (вставленный из моего предыдущего вопроса). Заранее благодарю за любую помощь, которую вы можете предложить.
Adapter.cs
private DeviceWatcher deviceWatcher;
public override IList<IDevice> ConnectedDevices => ConnectedDeviceRegistry.Values.ToList();
/// <summary>
/// Used to store all connected devices
/// </summary>
public Dictionary<string, IDevice> ConnectedDeviceRegistry { get; }
/// <summary>
/// Registry used to store device instances for pending operations : connect
/// </summary>
public Dictionary<string, IDevice> DeviceOperationRegistry { get; }
public Adapter(DeviceWatcher deviceWatcher)
{
Platform = PLATFORM.WINDOWS;
DeviceOperationRegistry = new Dictionary<string, IDevice>();
ConnectedDeviceRegistry = new Dictionary<string, IDevice>();
this.deviceWatcher = deviceWatcher;
/*DeviceInformation.CreateWatcher(
aqsAllBluetoothLEDevices,
requestedProperties,
DeviceInformationKind.AssociationEndpoint);*/
deviceWatcher.Added += DeviceWatcher_Added;
deviceWatcher.Updated += DeviceWatcher_Updated;
deviceWatcher.Removed += DeviceWatcher_Removed;
deviceWatcher.EnumerationCompleted += DeviceWatcher_EnumerationCompleted;
deviceWatcher.Stopped += DeviceWatcher_Stopped;
}
protected override Task StartScanningForDevicesNativeAsync(Guid[] serviceUuids, bool allowDuplicatesKey, CancellationToken scanCancellationToken)
{
// clear out the list
DiscoveredDevices.Clear();
deviceWatcher.Start();
return Task.FromResult(true);
}
BleImplementation.cs
string[] requestedProperties = { "System.Devices.Aep.DeviceAddress", "System.Devices.Aep.IsConnected", "System.Devices.Aep.Bluetooth.Le.IsConnectable" };
// BT_Code: Example showing paired and non-paired in a single query.
string aqsAllBluetoothLEDevices = "(System.Devices.Aep.ProtocolId:=\"{bb7bb05e-5972-42b5-94fc-76eaa7084d49}\")";
DeviceWatcher deviceWatcher;
protected override IAdapter CreateNativeAdapter()
{
deviceWatcher = DeviceInformation.CreateWatcher(
aqsAllBluetoothLEDevices,
requestedProperties,
DeviceInformationKind.AssociationEndpoint);
return new Adapter(deviceWatcher);
}
Package.appxmanifest
<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/2010/manifest">
<Prerequisites>
<OSMinVersion></OSMinVersion>
<OSMaxVersionTested></OSMaxVersionTested>
</Prerequisites>
<Resources>
<Resource Language="" />
</Resources>
<Applications>
<Application Id="" StartPage="">
<VisualElements DisplayName="" Description=""
Logo="" SmallLogo=""
ForegroundText="" BackgroundColor="">
<SplashScreen Image="" />
</VisualElements>
</Application>
</Applications>
<Identity Name="MyCompany.MySuite.MyApp"
Version="1.0.0.0"
Publisher="CN=MyCompany, O=MyCompany, L=MyCity, S=MyState, C=MyCountry"/>
<Properties>
<DisplayName>MyApp</DisplayName>
<PublisherDisplayName>MyCompany</PublisherDisplayName>
<Logo>images\icon.png</Logo>
</Properties>
<Capabilities>
<Capability Name="internetClient" />
<!--BT_Code: Always declare the bluetooth capability when using Bluetooth-->
<DeviceCapability Name="bluetooth" />
</Capabilities>
</Package>
2 ответа
Если библиотека классов находится в пакете приложения UWP, она наследует разрешения приложения UWP.
Поскольку вы используете PCL, помните об этом:
Портативные библиотеки классов (PCL) теперь официально устарели [16 августа 2017 года]
Если вы сегодня делитесь кодом между различными реализациями.NET, вы, вероятно, знаете о переносимых библиотеках классов (PCL). С выпуском.NET Standard 2.0 мы теперь официально отказываемся от PCL, и вы должны перевести свои проекты на.NET Standard.
Источник: [ https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-net-standard-2-0/]
Это, вероятно, не будет связано с вашей проблемой с deviceWatcher. Кроме того, вы не получаете исключений, так что ваш код работает как надо
Имейте в виду, что перечисление deviceWatcher происходит от системного уровня. Устройства Bluetooth должны быть добавлены в первую очередь в настройках Windows, в отличие от USB-устройств, которые добавляются автоматически.
Чтобы найти устройство, попробуйте отфильтровать менее строгий или пропустите второй параметр из DeviceInformation.CreateWatcher.
Вы также можете сначала попробовать метод FindAllAsync, чтобы проверить, можно ли найти ваше устройство, но это всего лишь моментальный снимок, поэтому вы не можете отслеживать изменения.