Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows phone 如何在Windows 10上获取设备平台_Windows Phone_Xbox_Windows 10 - Fatal编程技术网

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

Windows phone 如何在Windows 10上获取设备平台,windows-phone,xbox,windows-10,Windows Phone,Xbox,Windows 10,由于一个版本的二进制文件将在pc、xbox和手机上运行,我需要一种在运行时获取设备类型的方法 通过检查当前类型、方法等的ApiInformation是可行的,但我认为应该有一种更可靠的方法。目前(使用2015年3月23日发布的预览工具),除了(如您所述)之外,没有一种简单的方法可以做到这一点使用ApiInformation方法检测只存在于您所追求的特定平台上的东西的实现 如果有一些帮助者来做这件事会很好,如果最终的工具中没有,我相信一些将由社区中有帮助的人创建 然而,有一个很好的理由不这样做,因

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

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

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

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

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

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

在很少的情况下,您想知道正在运行的平台,而不想知道特定的API是否可用。希望通过只公开API的可用性,微软鼓励开发人员考虑检查他们真正需要的,而不是依赖广泛的、可能不完整的设备分类


正如在web开发中,您不知道自己运行的是什么平台或浏览器一样,您不应该检测平台,也不应该假设设备将因此具有什么功能,在使用设备或在应用程序中公开关联的UI之前,您应该检测设备上是否支持/启用了所需的特定功能。

此外,为了支持Alan在其评论中描述的场景,您可以检查合同,而不是特定类型,因为这表示相关功能块。对于Windows Phone特定的API,有一个这样的合同——我在这里描述过 由于该合同为当前的Windows Phone应用程序提供了兼容API,因此我们可以假设,在这一点上,它不会在小型平板电脑中实现,因为它们不会有兼容API。显然,由于操作系统或API不是最终版本,这还不是一成不变的。对于Windows Phone来说,这是一件非常有用的事情,尤其是在过渡期间,如果您只想在WP设备上交叉推广传统WP应用程序。对于定制物联网设备,我将检查API级别的可用性。

[编辑7月3日,以当前信息替换//构建年代信息]

尽管您可以通过使用
apinfo
api来检测api来尝试推断您所在的设备,这是一个非常糟糕的解决方案,因为api可以随着时间的推移添加到设备中。请不要那样做;您未来的自我(或您的替代者;-)将感谢您

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


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

您可以使用特殊命名的文件夹指定设备系列专用资源和视图:()


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

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

您可以在此处找到更多信息:

更新:

我将此用于手机:


ExtSample is

这只是重复前面的一个答案,建议使用
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——一个只有一家制造商的设备,该制造商也负责操作系统。所以至少在我看来,这看起来很安全。另外,如果你像这样包装它,如果有更好的东西出现,在不同的支票中交换是非常容易的。

一个简单的现实场景,你可能需要这样做:你已经制作了多个应用程序(有些应用程序可以在任何情况下运行)
// ----------------------------------------------------------------------
// 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;
}