如何以编程方式检测Windows Phone 8.1操作系统版本?

标题中的问题不是真正的问题。 我浏览了很多网站和博客,并了解到Environment.OSVersion使用我们的应用程序为您提供了手机的当前操作系统版本。 但问题是,类环境下没有OSVersion。 请参阅屏幕截图以便更好地理解。

我的问题为什么我无法在Environment类下看到OSVersion属性? 我错过了什么吗? 在此处输入图像描述

所有建议和答案都赞赏。 谢谢!

Universal / WinRT应用程序仅适用于wp 8.1,因此操作系统版本只能为8.1。 当他们制作wp8.2或wp9时,他们可能会添加一种方法来检查安装的操作系统版本…

如果您正在寻找固件版本,可以通过以下方式获得:

Windows.Security.ExchangeActiveSyncProvisioning.EasClientDeviceInformation deviceInfo = new Windows.Security.ExchangeActiveSyncProvisioning.EasClientDeviceInformation(); var firmwareVersion = deviceInfo.SystemFirmwareVersion; 

从骗子问题复制:

Windows Phone 8.1 Silverlight应用程序可以使用.NET版API。 在Universal 8.1应用程序中没有支持的机制来获取版本号,但您可以尝试使用reflection来获取Windows 10 AnalyticsInfo类,如果您在Windows 10上运行,它至少会告诉您版本号。

注意 :检查操作系统版本几乎总是错误的做法,除非您只是将其显示给用户(例如,在“关于”框中)或将其发送到后端分析服务器以进行数字运算。 它不应该被用来做任何运行时决策,因为一般来说它是一个糟糕的代理, 无论你实际上是在尝试做什么

这是一个示例:

 var analyticsInfoType = Type.GetType( "Windows.System.Profile.AnalyticsInfo, Windows, ContentType=WindowsRuntime"); var versionInfoType = Type.GetType( "Windows.System.Profile.AnalyticsVersionInfo, Windows, ContentType=WindowsRuntime"); if (analyticsInfoType == null || versionInfoType == null) { Debug.WriteLine("Apparently you are not on Windows 10"); return; } var versionInfoProperty = analyticsInfoType.GetRuntimeProperty("VersionInfo"); object versionInfo = versionInfoProperty.GetValue(null); var versionProperty = versionInfoType.GetRuntimeProperty("DeviceFamilyVersion"); object familyVersion = versionProperty.GetValue(versionInfo); long versionBytes; if (!long.TryParse(familyVersion.ToString(), out versionBytes)) { Debug.WriteLine("Can't parse version number"); return; } Version uapVersion = new Version((ushort)(versionBytes >> 48), (ushort)(versionBytes >> 32), (ushort)(versionBytes >> 16), (ushort)(versionBytes)); Debug.WriteLine("UAP Version is " + uapVersion); 

显然你可以更新它以返回版本等,而不是将其打印到调试控制台。

我找到了一种棘手的方法来检测设备是否运行Windows Phone 8.1或Windows Phone 10.我比较了3种不同的设备,诺基亚Lumia 925(wp 8.1),诺基亚Lumia 735(wp 10)和诺基亚Lumia 930(wp) 10)。 我注意到在wp8.1上没有设备信息ID(它导致未实现的exception)但它存在于两个测试设备上的Windows Phone 10上。 Morover系统固件版本格式在wp 8.1和wp 10之间似乎不同(第一个是xxxx.xxxxx.xxxx.xxxx,第二个是xxxxx.xxxxx.xxxxx.xxxxx)。 在我的function下面:

  ///  /// Indicates if this device is running a version of Windows Phone 8.1. It use a dirty trick for detecting the OS major version /// based on the system firmware version format (8.1 is xxxx.xxxxx.xxxx.xxxx while 10 is xxxxx.xxxxx.xxxxx.xxxxx ) /// moreover, the "deviceInfo.id" is not implemented on Windows Phone 8.1, but it is on Windows Phone 10 ///  ///  public static bool liIsWindowsPhone81(bool basedOnDeviceInfoId) { EasClientDeviceInformation deviceInfo = new Windows.Security.ExchangeActiveSyncProvisioning.EasClientDeviceInformation(); bool isWin81 = false; if (basedOnDeviceInfoId) { try { var deviceInfoId = deviceInfo.Id; } catch { isWin81 = true; } } else { string firmwareVersion = deviceInfo.SystemFirmwareVersion.Trim(); string[] parts = firmwareVersion.Split('.'); if (parts[0].Length == 4 && parts[1].Length == 5 && parts[2].Length == 4 && parts[3].Length == 4) { isWin81 = true; } } return isWin81; } 

在此处输入图像描述

我没有机会在其他设备上测试这个,但到目前为止似乎工作。 我使用它来区分Windows Phone 8.1和Windows Phone 10之间的应用程序评级function的代码,在我的特定情况下不是UWP

希望这可以帮助

如果您的应用程序是基于Silverlight的,则可以在Windows Phone 8.0和8.1以及Windows Mobile 10中使用System.Environment.OSVersion.Version。

以下是我们在确定是否显示我们自己的用于地理位置跟踪的选择对话框或让Windows Mobile 10显示其自己的选择加入对话框时使用的方法的示例。

  public static bool IsWindowsPhone8x() { try { Version version = System.Environment.OSVersion.Version; return version.Major > 8 ? false : true; } catch (Exception) { return false; } } 

只需使用此行来获取应用程序名称和ID,发布者名称等…

 string name = Windows.ApplicationModel.Package.Current.DisplayName;