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

时间:2014-07-24 06:45:57

标签: c# .net-4.5 windows-phone-8.1 win-universal-app

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

我的问题为什么我无法在Environment类下看到OSVersion属性?我错过了什么吗?enter image description here

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

6 个答案:

答案 0 :(得分:13)

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

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

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

答案 1 :(得分:12)

从欺骗性问题复制:

Windows Phone 8.1 Silverlight应用程序可以使用.NET版API。在Universal 8.1应用程序中没有支持的机制来获取版本号,但您可以尝试使用反射来获取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);

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

答案 2 :(得分:1)

答案 3 :(得分:0)

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

        /// <summary>
        /// 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
        /// </summary>
        /// <returns></returns>
        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;
        }

enter image description here

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

希望这有帮助

答案 4 :(得分:0)

如果您的应用是基于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;
        }
    }

答案 5 :(得分:-2)

只需使用此行即可获取应用程序名称和ID,发布商名称等...

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