如何在Windows 10上获取设备平台

时间:2015-03-26 07:31:22

标签: windows-phone xbox windows-10

由于一个发布二进制文件将在pc,xbox和phone上运行,我需要一种在运行时获取设备类型的方法。

通过ApiInformation检查当前类型,方法等是可行的,但我相信应该有更可靠的方法。

7 个答案:

答案 0 :(得分:9)

目前(使用2015年3月23日发布的预览工具)除了(如您所述)使用ApiInformation方法检测事物的实现之外,还没有一种简单的方法可以做到这一点。只存在于您之后的特定平台上。

如果有一些助手可以做到这一点并且如果没有最终工具,那将是很好的我确信有些人会被社区中有帮助的人创建。

然而,有一个很好的理由不这样做,因为它鼓励对设备做出广泛的假设。

如果可以说"我是否在手机上运行?"然后,如果你得到了回复,那就是'那么很容易对该设备的可能性做出假设,但并非所有手机都具有相同的功能 看起来会有一个"移动"适用于手机和小型平板电脑的Windows 10版本。如果你能说'我是移动'版本&#34?;然后,再也没有可能回答你所有的问题,你仍然需要检查单独的API可用性,因为便宜的平板电脑和高端手机的功能可能会大不相同。 (在设备上包含物理按钮和拨打电话的能力是两个明显的例子。) 进一步扩展这一点有很多场景,您可以将不同平台视为与所有平台上的功能相同。在这种情况下,你的代码会更好地说"这样的API是否可用?"而不是说"我是在桌面,Xbox还是SurfaceHub上运行?&#34 ;。
由于IOT设备可用的功能和功能范围广泛,IOT平台可能会进一步复杂化。

在极少数情况下,您希望了解您正在运行的平台,而不是特定API是否可用。希望通过仅暴露API可用性,Microsoft鼓励开发人员考虑检查他们实际需要的内容,而不是依赖于广泛的,可能不完整的设备分类。

就像您不知道正在运行的平台或浏览器的网络开发一样,您不应该检测平台并假设设备将具有哪些功能,您应该检测是否在使用设备或在应用程序中公开关联的UI之前,设备支持/启用您需要的特定功能。

答案 1 :(得分:7)

[编辑7月3日以使用当前信息替换//构建时代信息]

虽然您可以尝试使用ApiInformation API检测API来推断您所使用的设备,但这是一个非常糟糕的解决方案,因为API可以随着时间的推移添加到设备 。请不要这样做;你的未来(或你的替代;-))会感谢你。

如果您确实需要以编程方式检测正在运行的设备系列(并且在大多数情况下您不),则可以使用AnalyticsInfo.VersionInfo.DeviceFamliy。这将返回一个没有公布的标准值集的字符串,因为可以随时引入或退出设备系列。

如果您想为每个设备系列提供不同的资源(字符串,图像,XAML文件,HTML页面等),那么您无需在代码中检测设备系列;相反,您可以使用MRT限定符DeviceFamily(例如Logo.DeviceFamily-Mobile.png)。只需确保始终拥有后备资源(图片,字符串等),以便在应用程序在您之前从未听说过的设备系列上运行时使用。并且不要陷入假设“桌面需要比移动设备更高资产”这样的事情的陷阱,因为这通常是不正确的。

答案 2 :(得分:7)

似乎有一个新的API来检测设备系列: Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamily

您可以在此处找到更多信息: https://msdn.microsoft.com/en-us/library/windows/apps/dn705767.aspx

<强>更新

https://msdn.microsoft.com/en-us/library/windows/apps/windows.system.profile.analyticsversioninfo.aspx

答案 3 :(得分:4)

此外,为了支持Alan在其评论中描述的场景,您可以检查合同而不是特定类型,因为这表示相关功能块。有一个这样的Windows Phone特定API合同 - 我在这里描述http://inthehand.com/2015/03/26/determine-if-running-on-windows-phone-from-a-uap-application/ 由于此合同为当前的Windows Phone应用程序提供了兼容性API,因此我们可以假设它不会在小型平板电脑中实现,因为它们不具备此功能。显然,由于操作系统或API不是最终的,所以这还不是一成不变的。对于Windows Phone而言,这是一个有用的事情,尤其是在转换期间,您只想在WP设备上交叉推广传统的WP应用程序。对于自定义IoT设备,我会检查API级别的可用性。

答案 4 :(得分:2)

您可以使用特别命名的文件夹指定设备系列独占资源和视图:(http://www.sharpgis.net/post/2015/04/01/Creating-DeviceFamily-specific-layouts-in-a-Universal-App)。

对于上述“仅广告相同的家庭应用”场景,您可以在该设备系列的文件夹中放置JSON或XML文件,并使用存储API在运行时获取它。

答案 5 :(得分:2)

我将它用于手机(手机):

if (Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamily == "Windows.Mobile")
{
      // code for phone 
}
else
{
      // other code
}

extample是here

答案 6 :(得分:0)

这只是重复之前的一个答案,建议使用Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamily,但我认为我要包含完整的代码以供检查:

// ----------------------------------------------------------------------
// IsRunningOnXbox
// Determines whether or not the game is running on an xbox console
bool IsRunningOnXbox()
{
    // Skip if already checked
    static bool bChecked = false;
    static bool bRunningOnXbox = false;
    if (bChecked)
        return bRunningOnXbox;

    // Retrieve the platform device family
    Platform::String^ strVersionInfoDeviceFamily = Windows::System::Profile::AnalyticsInfo::VersionInfo->DeviceFamily;
    if (strVersionInfoDeviceFamily != nullptr)
    {
        // Check to see if the device belongs to the xbox family
        std::wstring strDeviceFamily = strVersionInfoDeviceFamily->Data();
        std::transform(strDeviceFamily.begin(), strDeviceFamily.end(), strDeviceFamily.begin(), ::tolower);
        if (strDeviceFamily.find(L"xbox") != std::wstring::npos)
            bRunningOnXbox = true;
    }

    // Check complete
    bChecked = true;

    // Return whether or not the host platform is xbox
    return bRunningOnXbox;
}

我同意Chuck的评论,这可能不是AnalyticsInfo的目的......但与此同时,我们正在讨论xbox - 一个拥有单一制造商的设备也负责操作系统。所以至少在我看来,这似乎很安全。另外,如果你像这样包装它,如果有更好的东西可以很容易地交换不同的支票。