简体   繁体   English

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

[英]How to detect Windows Phone 8.1 OS version programmatically?

The question in title is not the real problem.标题中的问题不是真正的问题。 I went through many sites and blogs and go to know that Environment.OSVersion gives you the current OS version of the phone using our app.我浏览了许多网站和博客,了解到 Environment.OSVersion 使用我们的应用程序为您提供手机的当前操作系统版本。 But the problem is, There is no OSVersion under the class Environment.但问题是,Environment 类下没有 OSVersion。 Please refer the screenshot for better understanding.请参阅屏幕截图以更好地理解。

My question why I am not able to see the OSVersion property under Environment class?我的问题为什么我看不到 Environment 类下的 OSVersion 属性? Am I missing something?我错过了什么吗?在此处输入图片说明

Universal/WinRT apps only work in wp 8.1, so the OS version can only be 8.1.通用/WinRT 应用程序仅适用于 wp 8.1,因此操作系统版本只能为 8.1。 When they make wp8.2 or wp9, they'll probably add a way to check what OS version is installed...当他们制作 wp8.2 或 wp9 时,他们可能会添加一种方法来检查安装的操作系统版本......

If you're looking for the firmware version, you can get it with:如果您正在寻找固件版本,您可以通过以下方式获取:

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

Copied from duped question:从被骗的问题复制:

Windows Phone 8.1 Silverlight apps can use the .NET version APIs. Windows Phone 8.1 Silverlight 应用程序可以使用 .NET 版本的 API。 There is no supported mechanism to get a version number in Universal 8.1 apps, but you can try using reflection to get the Windows 10 AnalyticsInfo class, which will at least tell you the version number if you are running on Windows 10.在 Universal 8.1 应用程序中不支持获取版本号的机制,但您可以尝试使用反射来获取 Windows 10 AnalyticsInfo类,如果您在 Windows 10 上运行,它至少会告诉您版本号。

Note : Checking the OS version is almost always the wrong thing to do, unless you're simply displaying it to the user (eg, in an "About" box) or sending it to your back-end analytics server for number crunching.注意:检查操作系统版本几乎总是错误的做法,除非您只是将其显示给用户(例如,在“关于”框中)或将其发送到您的后端分析服务器以进行数字运算。 It should not be used to make any run-time decisions, because in general it's a poor proxy for whatever-you're-actually-trying-to-do .它不应该用于做出任何运行时决策,因为一般来说,它不能很好地代表您实际尝试做的任何事情

Here is a sample:这是一个示例:

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);

Obviously you can update this to return the version etc. rather than print it to the debug console.显然,您可以更新它以返回版本等,而不是将其打印到调试控制台。

I found a tricky way to detect if a device is running a Windows Phone 8.1 or Windows Phone 10. I compared 3 different devices, a Nokia Lumia 925 ( wp 8.1 ) a Nokia Lumia 735 ( wp 10 ) and a Nokia Lumia 930 ( wp 10 ).我找到了一种检测设备运行的是 Windows Phone 8.1 还是 Windows Phone 10 的棘手方法。我比较了 3 种不同的设备,诺基亚 Lumia 925 ( wp 8.1 ) 诺基亚 Lumia 735 ( wp 10 ) 和诺基亚 Lumia 930 ( wp 10)。 I noticed that on wp8.1 there is no device info id ( it causes a not implemented exception ) but it exists on windows phone 10 on both tested devices.我注意到在 wp8.1 上没有设备信息 ID(它会导致未实现的异常),但它存在于 Windows Phone 10 上的两个测试设备上。 Morover the system firmware version format seems different between wp 8.1 and wp 10 ( the first is xxxx.xxxxx.xxxx.xxxx while the second is xxxxx.xxxxx.xxxxx.xxxxx ).此外,wp 8.1 和 wp 10 之间的系统固件版本格式似乎不同(第一个是 xxxx.xxxxx.xxxx.xxxx 而第二个是 xxxxx.xxxxx.xxxxx.xxxxx )。 Below my function:在我的功能下方:

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

在此处输入图片说明

I haven't had the opportunity to test this on further devices, but so far seems to work.我还没有机会在其他设备上对此进行测试,但到目前为止似乎可行。 I use it to distinguish the code for the app rating function between Windows Phone 8.1 and Windows Phone 10, that in my specific case are not UWP我用它来区分 Windows Phone 8.1 和 Windows Phone 10 之间应用评级功能的代码,在我的特定情况下不是 UWP

Hope this helps希望这可以帮助

If your app is Silverlight based, you can use System.Environment.OSVersion.Version across Windows Phone 8.0 and 8.1 as well as Windows Mobile 10.如果您的应用基于 Silverlight,则可以在 Windows Phone 8.0 和 8.1 以及 Windows Mobile 10 中使用 System.Environment.OSVersion.Version。

Here is an example of a method we utilize when determining whether to display our own opt-in dialog for geo-tracking or let the Windows Mobile 10 present its own opt-in dialog.这是我们在确定是显示我们自己的选择加入对话框以进行地理跟踪还是让 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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM