UWP开发入门(25)——通过Radio控制Bluetooth, WiFi
回顾写了许久的UWP开发入门,竟然没有讲过通过Windows.Devices.Radios.Radio来控制Bluetooth和WiFi等功能的开关。也许是因为相关的API设计的简单好用,以至于被我给忽略了。最近工作中有涉及这块的内容,不妨一起来回顾下,顺便看看一些新的发现。
在Windows 10以前,想要控制Bluetooth,WiFi等功能,那麻烦大了。得操作ManagementBaseObject,ManagementEventWatcher 等一系列WMI提供的API,写出来的代码又臭又长。其间还夹着复杂的WMI query字符串,十分难用。
升级到Windows 10后,我们通过Windows.Devices.Radios.Radio可以方便的获取控制Bluetooth和WiFi的对象。
var radios = await Radio.GetRadiosAsync();
Bluetooth = radios.FirstOrDefault(r => r.Kind == RadioKind.Bluetooth);
WiFi = radios.FirstOrDefault(r => r.Kind == RadioKind.Bluetooth);
在拿到上面的Bluetooth和WiFi的Radio实例后,就可以通过
Public event TypedEventHandler<Radio, object> StateChanged;
来监听Radio实例的状态改变,可以说通过寥寥几行代码,就可以替代以往大量繁琐的操作。
而设置Bluetooth和WiFi设备On/Off的状态,也非常简单。
public IAsyncOperation<RadioAccessStatus> SetStateAsync(RadioState value);
RadioState枚举如同字面的意思:
public enum RadioState
{
//
// Summary:
// The radio state is unknown, or the radio is in a bad or uncontrollable state.
Unknown = ,
//
// Summary:
// The radio is powered on.
On = ,
//
// Summary:
// The radio is powered off.
Off = ,
//
// Summary:
// The radio is powered off and disabled by the device firmware or a hardware switch
// on the device.
Disabled =
}
这里需要提一下的是,在第一次更改状态前,UWP APP需要向用户申请权限。

慢着慢着,貌似忘记给UWP APP向Windows要权限了,我们要编辑Package.aaxmanifest文件,在Capabilities节点加上DeviceCapability这一行才行。
<Capabilities>
<Capability Name="internetClient" />
<DeviceCapability Name="radios"></DeviceCapability>
</Capabilities>

这回运行起来,才真的可以操作Bluetooth和WiFi了。
是不是觉得用不了几行代码就能写出一个控制Bluetooth和WiFi的APP了?事实也确实如此。
如果人生只如初见那般美好,UWP的处境就不会如此难堪了。对于某软提供了完善UWP API的功能,开发起来那是一个爽快。但要是没有或是没来得及提供,UWP就显得颇为尴尬了。
我们不妨看下RadioKind的枚举,很显然如果想操作FM radio就得另寻他法。而MobileBoardband即Cellular也是从1703版本才开始得到支持。

那是不是意味这MobileBroadband就可以像Bluetooth和WiFi一样通过
public static IAsyncOperation<IReadOnlyList<Radio>> GetRadiosAsync();
来获取实例对象了,还真不是,欲知如何操作,且听下回《UWP开发入门(26)——通过Radio控制Cellular》。
实际是我Sample code还没整理好。所以分成了两篇来写。
有感前日MS Store里的网易云音乐UWP也被替换成Win32版本,可叹国产的UWP APP越来越少。某软画了个好饼,可惜不能让人在Windows生态上通过UWP挣到钱。好技术生不逢时出不了头,真是可惜。
同时也能感觉到某软的妥协和进步,现如今的UWP,结合desktop extension以及desktop bridge技术。只要公司的APP能通过某软的审核,功能方面已经无限接近传统desktop APP了。可惜一个Windows平台做Win32和UWP两个产品,烧的钱可不是小数目。总不能用爱发电吧。
希望Win7早日被淘汰,WinUI 3.0能进一步融合UWP和Win32。距离上一次某软说要重振desktop开发已经过去蛮久了。
本篇提到的相关Sample code在GitHub:
https://github.com/manupstairs/UWPSamples/tree/master/UWPSamples/RadioDevice
UWP开发入门(25)——通过Radio控制Bluetooth, WiFi的更多相关文章
- UWP开发入门(十六)——常见的内存泄漏的原因
本篇借鉴了同事翔哥的劳动成果,在巨人的肩膀上把稿子又念了一遍. 内存泄漏的概念我这里就不说了,之前<UWP开发入门(十三)——用Diagnostic Tool检查内存泄漏>中提到过,即使有 ...
- UWP开发入门系列笔记之(一):UWP初览
标签: 随着微软Build2015带来的好消息,Win10正式版发布的日子已经离我们越来越近了,我们也终于欣喜地看到:一个统一的Windows平台对于开发人员来说充满了吸引力,这局棋下的好大的说--于 ...
- UWP开发入门(十)——通过继承来扩展ListView
本篇之所以起这样一个名字,是因为重点并非如何自定义控件,不涉及创建CustomControl和UserControl使用的Template和XAML概念.而是通过继承的方法来扩展一个现有的类,在继承的 ...
- UWP开发入门(四)——自定义CommandBar
各位好,再次回到UWP开发入门系列,刚回归可能有些不适应,所以今天我们讲个简单的,自定义CommandBar,说通俗点就是自定义类似AppBarButton的东西,然后扔到CommandBar中使用. ...
- UWP开发入门(七)——下拉刷新
本篇意在给这几天Win10 Mobile负面新闻不断的某软洗地,想要证明实现一个简单的下拉刷新并不困难.UWP开发更大的困难在于懒惰,缺乏学习的意愿.而不是“某软连下拉刷新控件都没有”这样的想法. 之 ...
- UWP开发入门(一)——SplitView
接下来会写一个UWP(Universal Windows Platform)开发入门的系列,自己学习到哪里,有什么心得总结,就会写到哪里.本篇对适用于顶层导航的SplitView控件展开讨论. 首先S ...
- UWP开发入门(十一)——Attached Property的简单应用
UWP中的Attached Property即附加属性,在实际开发中是很常见的,比如Grid.Row: <Grid Background="{ThemeResource Applica ...
- UWP开发入门(二十三)——WebView
本篇讨论在UWP开发中使用WebView控件时常见的问题,以及一些小技巧. WebView是实际开发中常用的控件,很多大家抱怨的套网页的应用都是通过WebView来实现的.这里要澄清一个问题,套网页的 ...
- UWP开发入门(二十一)——保持Ui线程处于响应状态
GUI的程序有时候会因为等待一个耗时操作完成,导致界面卡死.本篇我们就UWP开发中可能遇到的情况,来讨论如何优化处理. 假设当前存在点击按钮跳转页面的操作,通过按钮打开的新页面,在初始化过程中存在一些 ...
随机推荐
- Xenia and Colorful Gems(二分--思维)
给定三个数组a,b,c. 要求从每个数字取一个数,使得两两之差和最小. 求出这个数. \(我又懵逼了.我是会O(n^3)的暴力啊,怎么办.\) \(\color{Red}{从结果看,选出来的三个数必定 ...
- P1750 出栈序列
这好像是普及难度的吧~ 感觉再次被小学生吊打了........ \(\color{Red}{----------------------=|(●'◡'●)|=我是手动的分割线------------- ...
- SpringBoot:整合Druid、MyBatis
目录 简介 JDBC 导入依赖 连接数据库 CRUD操作 自定义数据源 DruidDataSource Druid 简介 配置数据源 配置 Druid 数据源监控 配置 Druid web 监控 fi ...
- webpack-常用配置知识点
webpack配置多页面 webpcak配置多页面需要在entry中配置多个,在plugins中配置多个htmlWebpackPlugin,具体如下 entry:{ "index" ...
- properties文件导出
功能要求根据数据库记录的key-value-remark 数据,导出保存properties文件 1. pro.load() pro.list() 处理不能解决备注.排序问题 2. 最后考虑下什么是 ...
- vue-cli中浏览器图标的配置
在VUE全家桶项目里面,这里给大家提供了2种方案,进行浏览器图标的配置. a):先把图片准备好,放在static文件夹下,再找到根目录下的index.html文件,并打开,在HTML文档的<he ...
- elasticsearch kibana的安装部署与简单使用(二)
介绍一下elasticsearch和kibana的简单使用 es其实我理解为一个数据库,一个数据库无非就是增删改查, Delete PUT GET POST 这些接口关键字完美对应 比如,我想查一张 ...
- 从卷积拆分和分组的角度看CNN模型的演化
博客:博客园 | CSDN | blog 写在前面 如题,这篇文章将尝试从卷积拆分的角度看一看各种经典CNN backbone网络module是如何演进的,为了视角的统一,仅分析单条路径上的卷积形式. ...
- MySQL索引知识介绍
前言: 索引是MySQL数据库中的重要对象之一,索引的目的在于提高查询效率.可以类比字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可.索引是表的目录,在查找内容之前可以先 ...
- 2018-06-17 js数组
数组的定义:① var arr=new Array(xx,xx,xx); ②var arr=[yy,yy,,yy]; 数组的查看:arr[x]; 数组的修改:arr[x]=xx; 数组的遍历:①for ...