最近在做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.Bluetooth);

我们会根据RadioKind枚举来判断拿到Radio对象的具体类型。

只有认真读文档的同学,才会发现MobileBroadband在1703之后获得了支持。1703大概是2017年4月发布的。
这是不是意味着MobileBroadband在1703之后,就可以像Bluetooth和WiFi一样通过

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

来获取实例对象了,还真不是。通过RadiosAsync根本拿不到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

2020年的UWP——通过Radio类控制Cellular(1)的更多相关文章

  1. jQuery根据radio来控制texteara

    最近遇到一个问题:需要通过点击radio来控制texteara的属性变化. 这里主要有两个知识点:1,给texteara设置属性:2,给texteara设置背景颜色. 在这里,假设texteara的i ...

  2. Day 5-8 自定义元类控制类的实例化行为

    __call__方法: 对象后面加括号,触发执行. 注:构造方法的执行是由创建对象触发的,即:对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类( ...

  3. 2020年的UWP(3)——UWP和desktop extension的简单交互

    上一篇<2020年的UWP(2)--In Process App Service>中我们了解了UWP和Desktop Extension可以通过AppService进行数据交互.本篇我们就 ...

  4. 2020年的UWP(4)——UWP和等待Request的Desktop Extension

    上一篇我们讨论了UWP和Desktop Extension交互中,Desktop Extension执行后立即退出的场景.下图是提到的四种场景分类: 执行后立即退出 等待request,处理完后退出 ...

  5. 【笔记】css hover 伪类控制其他元素

    最近在模仿一个网站的项目 当中有一个效果需要利用到hover效果因为不太想写jq脚本所以百度了一下css hover的运用发现原来hover也可以控制其他元素的变化的 但是这有一个要求 就是添加hov ...

  6. python 通过元类控制类的创建

    一.python中如何创建类? 1. 直接定义类 class A: a = 'a' 2. 通过type对象创建 在python中一切都是对象 在上面这张图中,A是我们平常在python中写的类,它可以 ...

  7. java 利用同步工具类控制线程

    前言 参考来源:<java并发编程实战> 同步工具类:根据工具类的自身状态来协调线程的控制流.通过同步工具类,来协调线程之间的行为. 可见性:在多线程环境下,当某个属性被其他线程修改后,其 ...

  8. 2020年的UWP(2)——In Process App Service

    最早的时候App Service被定义为一种后台服务,类似于极简版的Windows Service.App Service作为Background Task在宿主UWP APP中运行,向其他UWP A ...

  9. 2020年的UWP(5)——UWP和Desktop Extension的双向交互

    上一篇我们提到了怎么在Desktop Extension中等待并处理UWP端发出的request.在本篇中将描述UWP和Desktop Extension双向交互的场景,即存在从两端各自发出reque ...

随机推荐

  1. ios 常用的正则表达式(手机号邮箱md5加密验证空字符串等)

    可以写一个nssring的category 给nsstring 增加一些方法,而这些方法就是一些正则表达式. 比如写一个叫做Helper的类  创建完了就是 NSString+Helper 然后在进行 ...

  2. python1.3集合知识点:

    #定义集合:{},集合是只有key没有value的字典,集合内元素不能重复!a={1,2,3,4,5,6}#列表转换成集合b=set([1,2,3,4,5])print(a,b) #集合对列表进行去重 ...

  3. Linux输出缓存你知道多大吗?

    今天看到这个代码很简单,就是验证一下Linux系统的输出缓存大小.当 猜一下这个代码的输出: #include <stdio.h> #include <string.h> #i ...

  4. 041_go语言中的panic

    代码演示: package main import "os" func main() { // panic("a problem") _, err := os. ...

  5. 009_go语言中的slices分片

    代码演示 package main import "fmt" func main() { s := make([]string, 3) fmt.Println("emp: ...

  6. 利用Jsoup爬取新冠疫情数据并存至数据库

    需要用到的jar包(用来爬取的jsoup,htmlunit-2.37.0-bin以及连接数据库中的mysql.jar) 链接:https://pan.baidu.com/s/1VlylWmlhjd8K ...

  7. JS 鼠标放上去滑出内容案例

    .sliderbar { width: 200px; height: 40px; position: relative; margin: 0 auto; } .sliderbar span { dis ...

  8. 当你的系统依赖于某个bug...

    标题粗略看是有点违反常识的,bug通常是指某些代码存在问题导致系统没有按照期望方式工作,应该是需要尽可能被修复的,这样系统才会正常工作.但是,开发实践中会发现在某些情况下,本来功能没有问题,在你信心满 ...

  9. 编程与算法(一)、C语言实现二分法(方程近似解)

    一.二分法 假设有这样一个函数f(x) 函数与x轴有一个交点(也就是f(a)*f(b)<0,a<b),现在我们要求这个点的x值,也就是方程f(x)=0的一个实根 直接解显然不合适,那么接下 ...

  10. oracle中表加锁死锁的现象、原因及解决方案

    一.表加锁.死锁出现的现象 1.对数据库操作update.insert.delete时候,数据库无法更新,操作等待时长,操作结果不发生改变: 2.在程序中,底层(数据访问层)操作时候不成功,数据库连接 ...