Как создать библиотеку классов UWP с разрешениями Bluetooth? - PullRequest
0 голосов
/ 28 апреля 2018

Я задал похожий вопрос вчера, но думаю, что это был не тот вопрос. У меня есть 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 ]

0 голосов
/ 28 апреля 2018

Поскольку вы используете PCL, помните об этом:

Portable Class Libraries (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, чтобы проверить, можно ли найти ваше устройство, но это всего лишь снимок, поэтому вы не можете отслеживать изменения.

0 голосов
/ 28 апреля 2018

Если библиотека классов находится в пакете приложения UWP, она наследует разрешения приложения UWP.

...