Apoorva
Apoorva

Reputation: 1047

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. But the problem is, There is no OSVersion under the class Environment. Please refer the screenshot for better understanding.

My question why I am not able to see the OSVersion property under Environment class? Am I missing something?enter image description here

Upvotes: 10

Views: 7878

Answers (6)

Gyle Iverson
Gyle Iverson

Reputation: 681

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.

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.

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

Upvotes: 0

Peter Torr
Peter Torr

Reputation: 12019

Copied from duped question:

Windows Phone 8.1 Silverlight apps can use the .NET version APIs. 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.

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.

Upvotes: 12

Luca Iaco
Luca Iaco

Reputation: 3457

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

enter image description here

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

Hope this helps

Upvotes: 0

Zia Ur Rahman
Zia Ur Rahman

Reputation: 1880

Simply use this line to get the Application Name and Id, publisher name etc...

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

Upvotes: -2

user2220762
user2220762

Reputation: 565

You cannot get the OS Version in Windows 8.1 .Check the following link for the same - https://social.msdn.microsoft.com/Forums/windowsapps/en-US/2b455331-3bad-4d26-b615-a59d0e05d0dd/how-to-get-os-version-on-window-phone?forum=wpdevelop

Upvotes: 1

the_nuts
the_nuts

Reputation: 6054

Universal/WinRT apps only work in wp 8.1, so the OS version can only be 8.1. When they make wp8.2 or wp9, they'll probably add a way to check what OS version is installed...

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;

Upvotes: 13

Related Questions