UWP 應用獲取各類系統、用戶信息 (1) - 設備和系統的基本信息、應用包信息、用戶數據賬戶信息和用戶賬戶信息

来源:http://www.cnblogs.com/validvoid/archive/2016/01/20/uwp-system-info-collect-1.html
-Advertisement-
Play Games

應用開發中,開發者時常需要獲取一些系統、用戶信息用於數據統計遙測、問題反饋、用戶識別等功能。本文旨在介紹在 Windows UWP 應用中獲取一些常用系統、用戶信息的方法。示例項目代碼可參見 Github:https://github.com/validvoid/UWP-SystemInfoColl...


應用開發中,開發者時常需要獲取一些系統、用戶信息用於數據統計遙測、問題反饋、用戶識別等功能。本文旨在介紹在 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/

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 觸發器現有字典表(Dict)欄位說明Id標示ItemKey鍵ItemValue值UpperId上層標示需求一:當新增一條記錄的時候,若已存在相同鍵的,拒絕插入//操作步驟:展開相關表,右擊‘觸發器’,新建即可USE [sqlffwj]GOSET ANSI_NULLS ONGOSET QUOTED_I...
  • 1、查找空節點//*[not(text())] 表示內容為空的節點//*[count(*)=0] 表示沒有子節點的節點"//*[count(*)=0 and not(text())]" 空節點,表示既沒有內容,也沒有子節點,但未排除包含屬性的節點
  • 反射可以動態獲取數據的類型,Type 類可以獲取其中的 欄位、方法、屬性等。尤其是將欄位與屬性做區分可以讓我們可以獲取,自己想獲得的。廢話不多說上代碼。先將數據導入的類,寫下: 1 using System; 2 using UnityEngine; 3 4 namespace ARPGSimpl....
  • 10-3. 返回結果是一個標量值問題想取得存儲過程返回的一個標量值.解決方案假設我們有如Figure 10-2所示的ATM機和ATM機取款記錄的模型Figure 10-2. 一個ATM機和ATM機取款記錄的模型我們想要用一個存儲過程在指定機器和日期內返回所有的取款總額Listing 10-9 是這個...
  • 【工具】-【選項】-【環境】-【區域設置】-【語言】-【獲取其他語言】 安裝後重啟即可。
  • Autofac是傳說中速度最快的一套.NET高效的依賴註入框架。Autofac的介紹與使用請去參考Autofac全面解析系列(版本:3.5)。這裡介紹的已經挺詳細的啦。 下麵我就先來說說MVC4中使用Autofac吧,至於工廠模式與依賴註入的區別的話,這個我簡單的解釋一下,也只是我的個人觀點。使.....
  • 基於Nancy.Hosting.Aspnet的Nancy小Demo
  • 10-2. 返回輸出參數問題想獲取存儲過程里的一個或多個輸出參數的值解決方案假設我們有一個像Figure 10-1所示的,計程車輛與租金收入的模型Figure 10-1.計程車輛與租金收入的模型我們想知道在指定日期里,收入了幾筆租金和金額, 以及車輛的租憑情況. 存儲過程Listing 10-7 就...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...