2020年的UWP——通过Radio类控制Cellular(1)
最近在做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)的更多相关文章
- jQuery根据radio来控制texteara
最近遇到一个问题:需要通过点击radio来控制texteara的属性变化. 这里主要有两个知识点:1,给texteara设置属性:2,给texteara设置背景颜色. 在这里,假设texteara的i ...
- Day 5-8 自定义元类控制类的实例化行为
__call__方法: 对象后面加括号,触发执行. 注:构造方法的执行是由创建对象触发的,即:对象 = 类名() :而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类( ...
- 2020年的UWP(3)——UWP和desktop extension的简单交互
上一篇<2020年的UWP(2)--In Process App Service>中我们了解了UWP和Desktop Extension可以通过AppService进行数据交互.本篇我们就 ...
- 2020年的UWP(4)——UWP和等待Request的Desktop Extension
上一篇我们讨论了UWP和Desktop Extension交互中,Desktop Extension执行后立即退出的场景.下图是提到的四种场景分类: 执行后立即退出 等待request,处理完后退出 ...
- 【笔记】css hover 伪类控制其他元素
最近在模仿一个网站的项目 当中有一个效果需要利用到hover效果因为不太想写jq脚本所以百度了一下css hover的运用发现原来hover也可以控制其他元素的变化的 但是这有一个要求 就是添加hov ...
- python 通过元类控制类的创建
一.python中如何创建类? 1. 直接定义类 class A: a = 'a' 2. 通过type对象创建 在python中一切都是对象 在上面这张图中,A是我们平常在python中写的类,它可以 ...
- java 利用同步工具类控制线程
前言 参考来源:<java并发编程实战> 同步工具类:根据工具类的自身状态来协调线程的控制流.通过同步工具类,来协调线程之间的行为. 可见性:在多线程环境下,当某个属性被其他线程修改后,其 ...
- 2020年的UWP(2)——In Process App Service
最早的时候App Service被定义为一种后台服务,类似于极简版的Windows Service.App Service作为Background Task在宿主UWP APP中运行,向其他UWP A ...
- 2020年的UWP(5)——UWP和Desktop Extension的双向交互
上一篇我们提到了怎么在Desktop Extension中等待并处理UWP端发出的request.在本篇中将描述UWP和Desktop Extension双向交互的场景,即存在从两端各自发出reque ...
随机推荐
- Java语言程序设计2019.9.16
1.Java的基本运行单位是类. 2.类是由方法和变量组成. 3.变量类型分为byte,int,double,long,short,boolean,char,float.java中整数类型默认的int ...
- 100行Python代码实现一款高精度免费OCR工具
近期Github开源了一款基于Python开发.名为 Textshot 的截图工具,刚开源不到半个月已经500+Star. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语 ...
- PB级大规模Elasticsearch集群运维与调优实践
导语 | 腾讯云Elasticsearch 被广泛应用于日志实时分析.结构化数据分析.全文检索等场景中,本文将以情景植入的方式,向大家介绍与腾讯云客户合作过程中遇到的各种典型问题,以及相应的解决思路与 ...
- Linux下gcc/g++中-I(i的大写)、-L和-l
-I(i的大写)include头文件非标准库中存在的也不是在当前文件夹下的,需要将地址用-i(大写)包含例:-I /home/src/-L用到的函数或操作非标准库下的,需要将库存在的地址用-L包含,库 ...
- 设计模式:单例模式介绍及8种写法(饿汉式、懒汉式、Double-Check、静态内部类、枚举)
一.饿汉式(静态常量) 这种饿汉式的单例模式构造的步骤如下: 构造器私有化:(防止用new来得到对象实例) 类的内部创建对象:(因为1,所以2) 向外暴露一个静态的公共方法:(getInstance) ...
- golang 中的struct理解
golang实验代码 package main import("fmt") type Stu struct{ name string age int } func (stu *St ...
- 详解POW工作量证明原理
原文地址 来自 微信公众号 区块链大师 POW工作量证明(英文全称为Proof of Work)早在比特币出现之前就已经有人探索,常见的是利用HASH运算的复杂度进行CPU运算实现工作量确定,当然你 ...
- 关于python中Enum的个人总结
关于python中Enum的个人总结 初识 可以通过enum模块导入 语法 初始化: 可以通过enum_ = Enum('class_name', names,start = 1)来创建,其中name ...
- day8 文件
添加中文 需要编码 f = open("123.txt",'w',encoding='utf-8') 字符串转化二进制编码 encode() 1.文件: 计算机 ...
- Spring Security报异常 Encoded password does not look like BCrypt
控制台报错: Encoded password does not look like BCrypt 意思是前端传回去的密码格式与数据库里的密码格式不匹配,这样即使密码正确也无法校验.自然也就无法登录. ...