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 asyncTask 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