1. 程式人生 > >2020年的UWP(1)——通過Radio類控制Cellular

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/RadioDe