UWP 应用获取各类系统、用户信息 (1) - 设备和系统的基本信息、应用包信息、用户数据账户信息和用户账户信息

应用开发中,开发者时常需要获取一些系统、用户信息用于数据统计遥测、问题反馈、用户识别等功能。本文旨在介绍在 Windows UWP 应用中获取一些常用系统、用户信息的方法。示例项目代码可参见 Github:

https://github.com/validvoid/UWP-SystemInfoCollector

由于涉及内容较多,故本文会分为多篇展开。本篇介绍获取设备和系统的基本信息、应用包信息、用户数据账户信息和用户账户信息。

原博客阅读地址:http://validvoid.net/uwp-system-info-collect-1/

AnalyticsInfo

Windows.System.Profile 命名空间下的 AnalyticsInfo 类负责提供用于设备分析的相关信息。通过此类,我们能够获得系统的具体版本号以及设备类型等信息。

通过 AnalyticsInfo 类中的 VersionInfo 属性我们可以获取当前应用运行设备的设备类型和操作系统具体版本。AnalyticsVersionInfo 类型的 VersionInfo 属性包含两个成员:

DeviceFamily属性的返回值类型为字符串。其提供的设备类型信息极为重要,几乎在所有 UWP 开发中均会用到。通常我们都会根据此属性返回的设备类型信息配合实现应用的响应式设计。例如,返回 "Windows.Desktop" 时表示应用运行在桌面端 Windows 10 上,则应用呈现适合于鼠标键盘操作的 PC 端界面;返回 "Windows.Mobile" 时表示应用运行在移动端的 Windows 10 上,则应用应当呈现适合于触屏操作的移动端小屏界面。

DeviceFamilyVersion 属性的返回值类型也是字符串。其返回值指示了当前设备运行的 Windows 的具体版本号。不过直接获取此属性拿到的返回值是一个形如 "2814750460870692" 的 long 型数字。如果想要获取可读的 "major.minor.revision.build" 形式的版本号,需要先将此数值转化为十六进制,然后进一步转化为可读的版本号。

格式化版本号的 C# 代码:

string sv = AnalyticsInfo.VersionInfo.DeviceFamilyVersion;
ulong v = ulong.Parse(sv);
ulong v1 = (v & 0xFFFF000000000000L) >> 48;
ulong v2 = (v & 0x0000FFFF00000000L) >> 32;
ulong v3 = (v & 0x00000000FFFF0000L) >> 16;
ulong v4 = (v & 0x000000000000FFFFL);
string version = $"{v1}.{v2}.{v3}.{v4}";  

运行示例代码会得以类似以下内容的输出:

Device Analytics Info

DeviceForm: Unknown
DeviceFamily: Windows.Desktop
DeviceFamilyVersion: 2814750460870692
Reconstructed OS Version: 10.0.10586.36

需要指出的是,如果你打算通过 DeviceFamilyVersion 进行数据统计、分析工作,那么在应用的客户端代码中不要将原始的 DeviceFamilyVersion 返回值格式化为可读形式。据微软官方人员在 MSDN 的解释,AnalyticsInfo.VersionInfo 旨在为遥测和日志记录提供一个不透明的版本号字符串值,最佳做法是将该原始值传回服务器,如果有必要,在服务器端进行格式化解析的工作。

另外,AnalyticsInfo 类中的 DeviceForm 属性具体作用不明,在 PC 和 Windows Mobile 设备中均返回 "Unknown"。MSDN 文档中仅将此属性描述为 "Gets the device form."

资源限定符

Windows.ApplicationModel.Resources.Core.ResourceContext 类封装了可能影响资源选定的资源限定符(qualifiers)。这些资源限定符影响了应用运行时所需资源的选定。查询资源限定符并做出适当匹配优化对于增进用户体验也有帮助。

要获得当前应用的资源限定符,我们需要调用 ResourceContext.GetForCurrentView() 方法获得当前应用视图的资源上下文,再访问其中的 QualifierValues 属性。QualifierValues 属性的类型为 IObservableMap<string,string>,可通过键名获得对应的限定符值。

以下为 MSDN 文档中列举的可能的资源限定符名称以及对应取值:

资源限定符 可能的取值 说明
Language 如 "en-us" 此限定符名称可以映射到表示语言的字符串值,例如,"en-us" 表示美国英语。
Contrast standard 此限定符名称可以映射到当前对比度设置值。
high
black
white
Scale 80 此限定符名称可以映射到以百分比形式表示显示比例的值。
100
120
140
150
160
180
225
HomeRegion 如 "021" 此限定符名称可以映射到表示区域的字符串值,例如,"021" 表示北美。
TargetSize 如 "256" 此限定符名称可以映射到表示目标大小的字符串值,例如,"256"。
LayoutDirection LTR 此限定符名称可以映射到当前布局方向的值。
RTL
TTBLTR
TTBRTL
Configuration   此限定符名称可以映射到表示配置的字符串值。
AlternateForm   此限定符名称可以映射到表示替换窗体的字符串值。
DXFeatureLevel DX9 此限定符名称可以映射到表示 DirectX 功能级别。
DX10
DX11

有关 ResourceContext 类的更多用法,可以参阅 MSDN 文档 ResourceContext 类型

获取当前应用包信息

Windows.ApplicationModel.Package 类型负责提供应用包的信息。要获取当前应用的 Package 对象实例,可以通过 ‘Package.Current‘ 属性获取。获取当前应用的包对象之后,我们就可以进一步获得以下信息:

  • DisplayName 获取包的显示名称。
  • InstalledDate 获取包安装或最近一次更新的时间。
  • InstalledLocation 获取包的安装位置。返回值为 StorageFolder 类型。
  • IsBundle 指示该包是否为 Bundle 集合包。
  • IsDevelopmentMode 指示该包是否以开发模式安装。
  • IsFramework 指示是否有其它包将该包声明为依赖项。
  • IsResourcePackage 指示该包是否为资源包。
  • Logo 获取该包 Logo 文件的位置。返回值为 Uri 类型。
  • PublisherDisplayName 获取包发布者显示名称。
  • InstallDate 获取应用包初次安装的时间。该属性在 Windows 10 上并未实现。过去也仅对 Windows Phone 8 有效。

除以上属性外,Package 类还提供了三个重要的属性:Id 、 Status 以及Dependencies

Id 属性为 PackageId 类型。该属性提供了当前包 Id 的各种信息,包括:

  • Architecture 获取当前包的对应处理器架构。
  • FamilyName 获取包的 Family Name。如 "32b04fa8-6b7b-4ed9-8a9b-eade01a24207_hpzxbeh1zj56g "
  • FullName 获取包的完整名称。如 "32b04fa8-6b7b-4ed9-8a9b-eade01a242071.0.0.0x86__hpzxbeh1zj56g"
  • Name 获取包名。如 "32b04fa8-6b7b-4ed9-8a9b-eade01a24207"
  • Publisher 获取包发布者。如 "CN=validvoid"
  • PublisherId 获取包发布者 ID。
  • ResourceId 获取包的资源 ID。
  • Version 获取包版本。返回值为 PackageVersion 类型,可进一步格式化输出字符串。
  • Author 获取包作者。仅限 Windows Phone,在 Windows 10 上无效。
  • ProductId 获取包的 ProductID 属性值。仅限 Windows Phone,在 Windows 10 上无效。

Status 属性为 PackageStatus 类型。该类型提供了一个 VerifyisOK() 方法用于判断当前包的状态是否良好,可以使用。该方法会验证 PackageStatus 中的一系列属性以判断包是否可用。PackageStatus 包含的属性如下:

  • DataOffline 指示当前包所用数据是否离线。例如,当应用的数据安装在了 SD 卡等可移动介质上,而该媒体弹出时,数据即为离线状态,则该属性返回 true。
  • DependencyIssue 指示包的依赖项状态。当当前包的依赖项之一遭遇异常时,该属性即返回 true。在当前包的全部依赖项解决问题前,当前包将无法使用。
  • DeploymentInProgress 指示当前包是否正在被部署过程占用。例如,当包正在更新时,该属性返回 true。
  • Disabled 指示当前包是否被禁用。包可以通过PackageManager.SetPackageStatus 进行禁用,或通过PackageManager.ClearPackageStatus 启用。
  • LicenseIssue 指示当前包是否有授权问题。例如当授权丢失或过期时,该属性返回 true。所有授权问题解决前,当前包将不可用。
  • Modified 指示当前包是否存在内容修改问题。例如,当包丢失了某些文件时,该属性返回 true。
  • NeedsRemediation 指示当前包是否需要进行修正。例如,当 NotAvailableLicenseIssueModifiedTampered 中的一个或多个属性指示出当前包存在异常情况时,该属性即为 true。
  • NotAvailable 指示当前包是否不可用。例如,当 DataOfflineDisabledPackageOffline 中的一个或多个属性指示出当前包存在异常情况时,该属性即为 true。
  • PackageOffline 指示当前包是否离线或不能访问。例如,当包文件安装在 SD 卡等可移动介质上,且该介质处于被移除,则该属性为 true。
  • Servicing 指示当前包是否处于被占用状态。
  • Tampered 指示当前包是否处于感染状态。改属性返回 true 的一种可能原因是第三方反病毒软件将当前包标记为了恶意程序。

Dependencies 属性为 IReadOnlyList<Package> 类型,可用于获取当前包的所有依赖项。注意该属性仅用于获取 Windows Store 应用包的依赖项。要获取一个桌面应用包的依赖项,需使用 Win32 函数 GetPackageInfo

有关 Package 的具体用法可参见 Github 上的示例代码。

列举 Windows Mobile 设备上已部署的应用包

Windows.Phone.Management.Deployment 命名空间下提供了一系列用于控制应用部署功能的类型,其中 InstallationManager 类型负责应用包的安装管理。我们可以通过其中的 FindPackagesForCurrentPublisher 方法获得当前 Windows Mobile 设备上安装的同一发布者的应用包部署情况。该方法的返回类型为 IEnumerable<Package>,我们可以进一步检索返回值获取具体某个应用包的详细信息甚至启动这些应用。

值得说明的是,Windows.Phone.Management.Deployment 仅在 Windows Mobile 设备上有效,故在 UWP 应用中使用时,需要配合 AnalyticsInfo.VersionInfo.DeviceFamily 检测当前设备类型,选择是否调用该命名空间下的方法。另外,‘InstallationManager‘ 类中提供的其它方法需要 ID_CAP_OEM_DEPLOYMENT 特别权限才能够正常使用,故一般开发者无法使用。

获取用户数据账户信息

用户数据账户是什么呢?举例说明,如果你用过 Android 系统,那么你在 Android 的系统设置中会看到一项名为“账户”(Accounts)的设置栏目,其中列出了当前系统登录的 Gmail、Outlook、Office、Exchange、微博等各种应用注册的账户。这些账户就是用户数据账户。Windows.ApplicationModel.UserDataAccounts 命名空间定义了用于控制邮件、预约、日历等用户数据账户信息的相关类型和枚举。其中,UserDataAccount 类型表示一个用于存取邮件、联系人、日历等数据的用户数据账户。UserDataAccountManager类型提供了与用户数据账户交互的 API。UserDataAccountStore 代表用户数据账户的储存区。本文主要讲述如何通过 Windows Store App API 获取一些常用的信息,故在此不涉及操作用户数据账户的内容。仅关注如何获得一些数据。

要使用 UserDataAccounts 相关 API,要求应用在清单文件中声明联系人(contacts)、预约(appointments)、邮件(email)等功能中的一个或多个。

假设我们想要列举出当前系统上登录的所有用户数据账户,并输出这些账户的相关信息,首先我们需要通过 UserDataAccountManager.RequestStoreAsync 方法向系统请求用户数据账户的储存区。该方法接受一个 UserDataAccountStoreAccessType 枚举类型的参数。该参数用于指定要求的用户数据账户存储区的访问类型。UserDataAccountStoreAccessType枚举包含两个成员:

  • AllAccountsReadOnly 对应用以及系统的用户数据账户进行只读访问
  • AppAccountsReadWrite 对当前应用的用户数据储存区进行读/写访问

由枚举可知,我们虽然可以检索当前应用自身以外的用户数据账户,但对于自身以外的用户数据账户并没有写权限。

这里我们选择第一种访问类型,使用以下代码请求用户数据账户储存区:

UserDataAccountStore userDataAccountStore = await UserDataAccountManager.RequestStoreAsync(UserDataAccountStoreAccessType.AllAccountsReadOnly);  

获取到的用户数据账户储存区实例为 UserDataAccountStore 类型,该类型包含三个方法:

这里我们调用 FindAccountsAsync 即可获得所有用户数据账户,并进行下一步操作。具体演示可参见 Github 上的示例代码。

获取系统用户信息

在 Windows 8 应用中,我们使用 Windows.System.UserProfile 命名空间中的UserInformation 访问系统登录的用户账户信息。而在 Windows 10 以及以后版本的 Windows 中,UserInformation 不再被支持。因为在 Windows 10 中,除非用户授权,应用是不能获取用户信息的。而 Windows 8 应用则是默认得到授权的。并且,旧的 Windows 8 应用运行于 Windows 10 时也无法正常获取用户信息。

在 Windows 10 上我们需要使用新的 API 提供的Windows.System.User 类型获取用户信息。注意使用该 API 需要应用在清单文件中配置“用户账户信息”(User Account Information) 功能。

User 类提供了三个静态方法及其重载:

我们可以通过 FindAllAsync 或 GetFromId 方法获取用户账户实例,获取用户后,可以通过调用 GetPropertyAsync 方法取得该用户的属性信息。GetPropertyAsync 方法接受一个 string 类型的参数,具体传入内容可以通过 KnownUserProperties 类中定义的属性获取。 KnownUserProperties 类中定义了已知可用的用户账户属性键名。例如,我们想要获取账户显示名称时,可以采用如下方法:

string displayName = await user.GetPropertyAsync(KnownUserProperties.DisplayName);  

User 类还包含以下三个属性成员:

配合使用 UserDataAccount 和 User 两个 API 可以使应用更好地实现唯一用户识别、用户账户体系、自定义授权等功能特性。



更多内容请参阅本文后续内容更新。

第二篇:UWP 应用获取各类系统、用户信息 (2) - 商店授权信息、零售演示模式信息、广告 ID、EAS 设备信息、硬件识别信息、移动网络信息

阅读地址:http://validvoid.net/uwp-system-info-collect-2/

时间: 2024-10-24 21:38:18

UWP 应用获取各类系统、用户信息 (1) - 设备和系统的基本信息、应用包信息、用户数据账户信息和用户账户信息的相关文章

MD5加密&获取用户IP、ID、系统时间

1.通常我们在数据库中保存用户信息的时候需要把密码和一些其他重要信息,用加密的方式保存,这就会用到下面的MD5加密程序段 MessageDigest md=MessageDigest.getInstance("MD5"); md.update("被加密的字符串".getBytes()); String md5sString =new BigInteger(1,md.digest()).toString(16); 2.获取用户IP,ID,系统时间语句 String u

商品信息数据分析及展现系统

基于数据挖掘技术的智能化数据分析系统设计与开发 潍坊物价信息数据分析及展现 背景: 商品价格和人们生活息息相关,比如农产品价格波动不仅会对农民收入和农民生产积极性产生直接影响,更关乎百姓的日常生活和切身利益.经常看新闻看到农民辛苦了一个季度的农作物全都烂在地里,因为价格太低廉,或者没有销路.虽然说物价波动是一种正常的经济现象,但是在一定程度上物价稳,人心才稳,社会才稳.为保持经济平稳健康发展.保障群众生活,稳定物价,信息公开显得尤为重要.价格监测和预测是维持物价稳定的一个重要环节.而对于商品价格

百万用户时尚分享网站feed系统扩展实践

Fashiolista是一个在线的时尚交流网站,用户可以在上面建立自己的档案,和他人分享自己的以及在浏览网页时看到的时尚物品.目前,Fashiolista的用户来自于全球100多个国家,用户达百万级,每日分享的时尚物品超过500万.作为一个以社交.分享的网站,feed系统占据了网站的核心架构,Fashiolista的创始人兼CTO Thierry Schellenbach撰写了一篇博客,分享了自家网站feed系统建设的经验,译文如下: Fashiolista最初是我们作为兴趣在业余时间开发的一个

用户运营中的积分系统如何设计?

对于互联网行业,可能很多人脑中没有一个成型的互联网体系,都很零散,做过的工作也不成系统.很多人会问:互联网平台做运营是做什么?其实不管是什么公司,互联网运营是最复杂的工作,因为运营覆盖的范围和内容很多,最全面的体系运营实际有12大体系,内容运营也只是12大体系运营里面的其中之一. 比如说,我们每一个人在做互联网运营的时候,首先在我们脑子里要形成一个知识体系.用户运营是属于12大体系之一,那积分运营和用户运营又是如何关系,怎么通过积分运营来达到用户运营的效果,具体的运营策略是什么,本文接下来就重点

为方便储户,某银行拟开发计算机储蓄系统。储户填写的存款单或取款单由业务员输入系统,如果是存款,系统记录存款人姓名、住址、、存款类型、存款日期、利率等信息,并印出存款单给储户;如果是存款,系统计算利息并印出利息清单给储户。写出问题定义并分析此系统的可行性。

如果是存款,储户填写存款单,然后交给业务员键入系统,同时系统还要记录存款人姓名.住址(或电话号码).身份证号码.存款类型.存款日期.利率等信息,完成后由系统打印存款单给储户. 如果是取款,储户填写取款单,然后交给业务员,业务员把取款金额输入系统并要求储户输入密码以确认身份,核对密码正确无误后系统计算利息并印出利息清单给储户. 为了满足储户的需求,该系统需要迅速的对用户的要求做出反馈,要对用户输入的信息作出最快的处理,所以就需要很大的主存容量,以及强大的数据库支持.由于是所面向的用户是广泛的储蓄用

中科燕园GIS外包案例之三-----海洋预报信息掌上发布系统

该系统采用B/S架构与M/S构架相结合,客户端包括web客户端和android移动客户端.数据由access和文本文件存储管理.web客户端借助ArcGIS API for JavaScript和开源的Dojo 1.8.0 在Visual studio 2010平台上开发,android客户端借助ArcGIS API for android,ArcGIS Runtime SDK for Android在Eclipse平台上开发.         [Web客户端] 1.常用地图操作:放大.缩小.平

航班信息查询和检索系统-数据结构课程设计

问题及代码: 设计并实现一个航班信息查询和检索系统.要求:对飞机航班信息进行排序和查找,可按照航班号.起点站.到达站.起飞时间和到达时间等信息进行查询.航班信息表的样式如下: 航班号 起点站 终点站 班期 起飞时间 到达时间 机型 票价 CA1544 合肥 北京 1.2.4.5 10:55 12:40 733 960 MU5341 上海 广州 每日 14:20 16:15 M90 1280 CZ3869 重庆 深圳 2.4.6 08:55 10:35 733 1010 其中航班号一项的格式为:前

session的官方定义是:Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。 说白了session就是一种可以维持服务器端的数据存储技术。session主要有以下的这些特点: 1. session保存的位置是在服务器端 2. session一般来说是要配合cookie使用,如果是浏览器禁用了cookie功

session的官方定义是:Session:在计算机中,尤其是在网络应用中,称为"会话控制".Session 对象存储特定用户会话所需的属性及配置信息. 说白了session就是一种可以维持服务器端的数据存储技术.session主要有以下的这些特点: 1. session保存的位置是在服务器端 2. session一般来说是要配合cookie使用,如果是浏览器禁用了cookie功能,也就只能够使用URL重写来实现session存储的功能 3. 单纯的使用session来维持用户状态的话

Oracle 用户、对象权限、系统权限

--================================ --Oracle 用户.对象权限.系统权限 --================================  一.用户与模式 用户:对数据库的访问,需要以适当用户身份通过验证,并具有相关权限来完成一系列动作 SYS用户,缺省始终创建,且未被锁定,拥有数据字典及其关联的所有对象 SYSTEM用户,缺省始终创建,且未被锁定,可以访问数据库内的所有对象 模式(schema):是某个用户拥有所有对象的集合.具有创建对象权限并创建