2020年的UWP(1)——通過Radio類控制Cellular


最近在做UWP的項目,在2020年相信這已經是相對小眾的技術了,但是在學習的過程中,發現某軟這么幾年仍然添加了不少的API,開放了相當多的權限。所以打算總結一下最近的一些經驗和收獲,介紹一下2020年的UWP。
之前在《UWP開發入門(25)——通過Radio控制Bluetooth, WiFi》篇中我們回顧了在UWP中如何操作Bluetooth和WiFi。在相當長的一段時間里,我都認為Radio類就止步於此了。然鵝最近的實踐表明,Cellular也可以通過Radio類來控制了。

在介紹使用Windows.Devices.Radios.Radio控制Bluetooth和WiFi對象時,我們提到了GetRadiosAsync方法。

var radios = await Radio.GetRadiosAsync();
Bluetooth = radios.FirstOrDefault(r => r.Kind == RadioKind.Bluetooth);
WiFi = radios.FirstOrDefault(r => r.Kind == RadioKind.WiFi);

我們會根據RadioKind枚舉來判斷拿到Radio對象的具體類型。

只有認真讀文檔的同學,才會發現MobileBroadband在1703之后獲得了支持。1703大概是2017年4月發布的。
這是不是意味着MobileBroadband在1703之后,就可以像Bluetooth和WiFi一樣通過

public static IAsyncOperation<IReadOnlyList<Radio>> GetRadiosAsync();

來獲取實例對象了,還真不是。通過GetRadiosAsync根本拿不到MobileBroadband類型的Radio對象,也就是本文提到的Cellular。
我們只能通過更原始的方式,通過

public static IAsyncOperation<Radio> FromIdAsync(string deviceId);

方法來查找Cellular類型的Radio對象。

        public async Task InitializeAsync()
        {
            //var radios = await Radio.GetRadiosAsync();
            //RadioModel = radios.FirstOrDefault(r => r.Kind == RadioKind);
            var selectorString = Radio.GetDeviceSelector();
            var deviceInfos = await DeviceInformation.FindAllAsync(selectorString);
            foreach (var deviceInfo in deviceInfos)
            {
                var radio = await Radio.FromIdAsync(deviceInfo.Id);
                if (radio.Kind == RadioKind)
                {
                    RadioModel = radio;
                }
            }
            this.OnPropertyChanged("IsOn");
        }

首先我們通過Radio.GetDeviceSelector方法拿到了用於查找Radio設備的字符串,然后通過DeviceInfomation.FindAllAsync方法取得當前設備上所有符合selectorString的Radio對象。再通過RadioKind.MobileBroadband篩選取得Cellular類型的Radio對象。

至此,我們通過Radio控制Cellular的目的在理論上算是達成了。實際呢,千萬不要忘記打開Package.appxmanifest文件添加Capabilities。首先對所有的Radio操作而言

<DeviceCapability Name="radios"></DeviceCapability>

權限是必須的。而想要控制Cellular,那還需要申請受限的

<rescap:Capability Name="cellularDevcieControl"></rescap:Capability>

Namespace rescap的聲明如下:

<Package
  xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
  xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest"
  xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
  IgnorableNamespaces="uap mp rescap">

需要留意的是,<rescap:Capability>必須寫在<DeviceCapability>的前面才能生效。

  <Capabilities>
    <rescap:Capability Name="cellularDeviceControl"/>
    <DeviceCapability Name="radios"/>
  </Capabilities>

 

本篇算是一個序章,后續打算分享下UWP在2020年可以做到的一些有意思的feature,感覺已經無限接近傳統的desktop application了。
有趣的是,曾在知乎上看到對UWP一些討論,似乎對desktop extension的方式很不認同,認為是在背后偷偷摸摸干壞事。我想說的是,仍然還在做UWP的,很多都是用愛發電了。哪有那份心去干壞事啊……
本篇Sample Code:

https://github.com/manupstairs/UWPSamples/tree/master/UWPSamples/RadioDevice


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM