C# UWP: Checking for Platform Extensions at Runtime

Universal Windows Platform (UWP) Apps

Windows 8.1 introduced Universal Windows 8 apps, which allowed you to develop apps that target both Windows and Windows Phone from a shared codebase. Windows 10, on the other hand, introduces UWP apps and the Universal Windows Platform (UWP), which provide a guaranteed core API layer across devices.

UWP provides useful building blocks that make it easier to design apps for multiple device families. For example, UWP provides a set of universal controls that are guaranteed to work well on all Windows-powered devices. This set of universal controls includes everything from common form controls, such as radio buttons and text boxes, to grid views and list views.

Universal Input

A UWP app can run on many different kinds of devices that have different forms of input, screen resolutions, DPI density, and other unique characteristics. Windows 10 provides new universal controls, layout panels, and tooling to help you adapt your UI to the devices your app may run on.

Some aspects of your app’s UI will adapt automatically across devices. Controls such as buttons and sliders automatically adapt across device families and input modes. Your app’s user-experience design, however, may need to adapt depending on the device on which the app is running.

Dynamically Detecting Features at Runtime in a UWP App

Windows.Foundation.Metadata Namespace

The Windows.Foundation.Metadata Namespace defines all the attributes that indicate fundamental properties of Windows Runtime types.

Windows.Foundation.Metadata.ApiInformation Class

The ApiInformation class enables you to detect whether a specified member, type, or API contract is present to safely make API calls across various devices.

Windows.Foundation.Metadata.ApiInformation Methods

IsApiContractPresent

Signifies if the API contract with the specified name and major version number is present. An API contract is simply a set of APIs. Logically related types are grouped into an API contract. An API contract represents a feature—a set of related APIs—that together deliver some particular functionality.

The following example determines, with the use of IsApiContractPresent, if the device can place phone calls. If it can, it checks to see if a phone line exists and that the number to dial is more than 0 characters. If all of these conditions exist, the app dials the supplied number; otherwise, it displays a message that informs the user that the call cannot be placed.

using Windows.Foundation.Metadata;
if (ApiInformation.IsApiContractPresent("Windows.ApplicationModel
   .Calls.CallsPhoneContract", 1,0))
{
   if ((PhoneLine != null) && (PhoneNumber.Trim().Length > 0))
   {
      PhoneLine.Dial(PhoneNumber, DisplayName);
   }
   else
   {
      var dialog = new MessageDialog("Cannot make call");
      await dialog.ShowAsync();
   }
}

IsEnumNamedValuePresent

Signifies if a specified named constant is present for a specified enumeration.

In the following examples, it is easy to understand the reason this method exists. In the following examples, you will test to see if certain video formats are allowed with certain codecs.

2160p UHD format.

using Windows.Foundation.Metadata;
if (ApiInformation.IsEnumNamedValuePresent("Windows.Media
   .MediaProperties.VideoEncodingQuality", "Uhd2160p"))
{
}
try
{
   Uri path = new Uri("ms-appx:///AppVideos/Intro1.mp4");
   mediaPlayer.Source = MediaSource.CreateFromUri(path);
}
catch (Exception ex)
{
   if (ex is FormatException)
   {
      // Handle exception.
      // For example: Log error or notify user problem with file
   }
}

4320p UHD format.

using Windows.Foundation.Metadata;
if (ApiInformation.IsEnumNamedValuePresent("Windows.Media
   .MediaProperties.VideoEncodingQuality", "Uhd4320p"))
{
}
try
{
   Uri path = new Uri(path);
   mediaPlayer.Source = MediaSource.CreateFromUri(path);
}
catch (Exception ex)
{
   // Exception details
}

IsEventPresent

Signifies if a specified event is present for a specified type. An example of IsEventPresent is to determine whether or not the Back button is present on the device. Remember, you can run your apps on a desktop PC running Windows 10 as well.

using Windows.Foundation.Metadata;
if(ApiInformation.IsEventPresent("Windows.Phone.UI.Input
   .HardwareButtons", "BackPressed"))
{
   HardwareButtons.BackPressed += OnHardwareButtonsBackPressed;
}

This example checks to see if the BackPressed event is present on the device that the app is running on. Another example follows:

private bool CameraButtonExists =
   ApiInformation.IsEventPresent("Windows.Phone.UI.Input
      .HardwareButtons", "CameraPressed");

The preceding code determines if a camera is present on the device by checking if the CameraPressed event is available.

IsMethodPresent

Signifies if a specified method is present for a specified type.

The following code determines if the GetNetworkUsageAsync method inside the Windows.Networking.Connectivity.ConnectionProfile class exists. The Windows.Networking.Connectivity.ConnectionProfile class represents a network connection and it provides information about the connection status and connectivity statistics.

using Windows.Foundation.Metadata;
if (ApiInformation.IsMethodPresent("Windows.Networking
   .Connectivity.ConnectionProfile", "GetNetworkUsageAsync"))
{
   // Do work
}

IsPropertyPresent

Signifies if a specified property (writeable or read-only) is present for a specified type.

IsReadOnlyPropertyPresent

Signifies if a specified read-only property is present for a specified type.

IsTypePresent

Signifies whether a specified type is present.

using Windows.Foundation.Metadata;
if(ApiInformation.IsTypePresent("Windows.Media.Playlists
   .Playlist"))
{
   await FavoritePlaylist.SaveAsAsync( ... );
}

The previous code makes a quick runtime check for the presence of the Playlist class. If it exists, it references and calls the SaveAsAsync method on the class.

IsWriteablePropertyPresent

Signifies if a specified writeable property is present for a specified type.

Conclusion

Making use of the Extension SDK for UWP is very easy, as you can see. I have only covered a tiny bit, but you are now armed with enough knowledge to check for Platform extensions in big or small projects.

Hannes DuPreez
Hannes DuPreez
Ockert J. du Preez is a passionate coder and always willing to learn. He has written hundreds of developer articles over the years detailing his programming quests and adventures. He has written the following books: Visual Studio 2019 In-Depth (BpB Publications) JavaScript for Gurus (BpB Publications) He was the Technical Editor for Professional C++, 5th Edition (Wiley) He was a Microsoft Most Valuable Professional for .NET (2008–2017).

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read