【问题标题】:How to get the device platform on Windows 10如何在 Windows 10 上获取设备平台
【发布时间】:2015-05-30 03:37:09
【问题描述】:

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

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

【问题讨论】:

  • 您到底想对“设备类型”信息做什么?

标签: windows-phone xbox windows-10


【解决方案1】:

这只是重复先前建议使用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 - 一个由单一制造商负责操作系统的设备。所以至少在我看来,这似乎很安全。另外,如果你这样包装,如果出现更好的情况,换成不同的支票非常容易。

【讨论】:

    【解决方案2】:

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

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

    例如here

    【讨论】:

    • 您能否将链接中的更多文档放入您的答案中以使其更完整?这样做的原因是,到 SO 的外部链接可能会在一段时间后断开或脱机,当有人从搜索中找到这个问题时,如果该来源消失,它就不会那么相关了。谢谢!
    【解决方案3】:

    似乎有一个新的 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

    【讨论】:

    • 值得注意的是链接已损坏:(
    • Windows.System.Profile AnalyticsInfo 属性的用途是用于诊断日志记录。您应该将它们视为在客户端运行时不解析的不透明字符串。依靠这一点,因为您的平台检测很脆弱。
    【解决方案4】:

    [编辑 7 月 3 日以用当前信息替换 //build-era 信息]

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

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

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

    【讨论】:

    • 这似乎对我不起作用。 :( 我有一个名为 Sketch1.DeviceFamily-Desktop.scale-125.png 的文件和一个名为 Sketch1.s​​cale-100.png 的文件,在桌面上,加载不合格的文件。
    • 设备是否 100% 缩放?这可能比设备系列具有更高的优先级。
    • 是的 - 100% 比例。所以我只能有1个预选赛?这是否意味着如果我想为桌面和手机上的图像设置多个比例因子,我不能使用自动分辨率而是手动执行?
    • 不,你可以有很多限定词,只是有些比其他的优先级更高(例如语言比规模更重要)。不过,这似乎是错误的优先级......
    • 哦!抱歉 -> 我复制了错误的文件名。我还有一个名为sketch1.DeviceFamily-Desktop.scale-100 的文件——这也不起作用。我不得不将文件重命名为sketch1.DeviceFamily-Desktop.png,这是唯一有效的方法(当然,现在我在选择图像时没有考虑缩放)
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      此外,为了支持 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 级别检查可用性。

      【讨论】:

        【解决方案7】:

        目前(使用 2015 年 3 月 23 日发布的预览工具)除了(正如您提到的)使用 ApiInformation 方法来检测仅存在于您所追求的特定平台。

        如果有一些帮助者来做这件事会很好,如果最终工具中没有帮助者,我相信社区中乐于助人的人会创建一些帮助者。

        但是,有一个很好的理由不这样做,因为它鼓励对设备进行广泛的假设。

        如果可以说“我在打电话吗?”那么如果您得到“是”的响应,那么很容易就该设备的可能性做出假设,但并非所有手机都具有相同的功能。
        看起来将有适用于手机和小型平板电脑的“移动”版 Windows 10。如果你能说“我是‘移动’版本吗?”话又说回来,这可能无法回答您的所有问题,并且您仍必须检查各个 API 的可用性,因为廉价平板电脑和高端手机的功能可能大不相同。 (设备上包含物理按钮和拨打电话的能力就是两个明显的例子。) 进一步扩展这一点,在许多场景中,您会将不同平台视为所有平台上存在的功能相同。在这种情况下,您的代码最好说“这样那样的 API 可用吗?”,而不是说“我在桌面、Xbox 或 SurfaceHub 上运行吗?”。
        由于不同的物联网设备可用的功能和能力的范围,物联网平台可能会进一步复杂化。

        在极少数情况下,您想知道自己运行的平台而不是特定 API 是否可用。希望通过仅公开 API 可用性,Microsoft 鼓励开发人员考虑检查他们实际需要什么,而不是依赖于广泛的、可能不完整的设备分类。

        就像您不知道您在哪个平台或浏览器上运行的 Web 开发一样,您不应该检测平台并假设该设备将因此具有哪些功能,您应该检测您的特定功能是否在使用设备或在您的应用中公开相关 UI 之前,设备上支持/启用 require。

        【讨论】:

        • 一个简单的现实场景,您可能需要这个:您已经制作了多个应用程序(一些在所有设备上运行,一些只在特定类型的设备上运行)并且您为所有您的所有应用程序创建了一个通用的“关于”对话框有一部分推广您的其他应用程序的应用程序。但是,当当前应用在手机上运行时,您不想宣传仅在桌面上运行的应用,反之亦然。
        • 另外 - 我猜你会为平板手机(比如大屏幕手机)创建与小型平板电脑不同的布局。不知道是什么情况,但直觉告诉我,你可能想在某些情况下将它们分开
        • 一般指导很好(您通常不想知道自己是否在打电话),但如果您确实需要知道,还有比使用 ApiInformation 更好的方法,因为我请注意以下 - 改用 MRT。
        猜你喜欢
        • 1970-01-01
        • 2013-09-07
        • 2015-11-28
        • 2017-03-16
        • 1970-01-01
        • 1970-01-01
        • 2023-01-05
        • 2019-01-02
        • 1970-01-01
        相关资源
        最近更新 更多