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

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