Как получить платформу устройства в Windows 10
Поскольку один выпускной двоичный файл будет запускаться на ПК, xbox и телефонах, мне нужен способ получить тип устройства во время выполнения.
Это можно сделать, проверив ApiInformation
для существующих типов, методов и т.д., но я считаю, что должен быть более надежный способ.
Ответы
Ответ 1
Кажется, есть новый 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
Ответ 2
В настоящее время (с инструментами предварительного просмотра, выпущенными 23 марта 2015 года) нет простого способа сделать это, кроме (как вы упомянули), используя методы ApiInformation
для обнаружения реализаций вещей, которые существуют только на определенную платформу, за которой вы после.
Было бы неплохо, если бы были какие-то помощники, чтобы сделать это, и если ни один из них не находится в конечном инструменте, я уверен, что некоторые из них будут созданы полезными людьми в сообществе.
Однако, есть действительно хорошая причина не иметь этого в том, что он поощряет широкие предположения относительно устройства.
Если бы можно было сказать: "Я бегу по телефону?" то, если вы получили ответ "Да", тогда было бы легко сделать предположения о том, что возможно с этим устройством, но не все телефоны имеют одинаковые возможности.
Похоже, что будет "мобильная" версия Windows 10 для телефонов и небольших планшетов. Если бы вы могли сказать: "Я -" мобильная "версия?" то опять же, что не будет отвечать на все ваши вопросы, и вам придется по-прежнему проверять отдельные возможности API, поскольку возможности дешевого планшета и телефона с высоким номером могут значительно отличаться. (Включение физических кнопок на устройстве и возможность совершать телефонные звонки - два очевидных примера.)
Расширяя это, существует множество сценариев, где вы будете обрабатывать разные платформы так же, как и все функциональные возможности. В этом случае вам будет лучше сказать "Есть ли такой и такой API?", Вместо того, чтобы говорить "Я работаю на рабочем столе, Xbox или SurfaceHub?".
Платформа IOT, скорее всего, еще больше усложнит это из-за ряда функциональных возможностей и возможностей, которые будут доступны для разных IOT-устройств.
Существует очень мало сценариев, в которых вы хотите узнать о платформе, на которой вы работаете, а не о том, доступен ли конкретный API. Надеемся, что только разоблачение доступности API Microsoft поощряет разработчиков задуматься о том, что они действительно нуждаются, а не полагаться на широкие, потенциально неполные классификации устройств.
Как и в случае веб-разработки, где вы не знаете, на какой платформе или в браузере вы работаете, вы не должны обнаруживать платформу и делать предположения о том, какие возможности у этого устройства будут иметь, вы должны определить, требуют поддержки/активации на устройстве перед его использованием или отображения соответствующего пользовательского интерфейса в вашем приложении.
Ответ 3
[Редактировать 3 июля, чтобы заменить//информацию о эстакаде с текущей информацией]
Хотя вы можете попробовать и сделать вывод о том, что вы используете API-интерфейсы ApiInformation
для обнаружения API-интерфейсов, это очень плохое решение, поскольку API-интерфейсы могут быть добавлены к устройствам с течением времени. Пожалуйста, не делайте этого; ваше будущее (или ваша замена;-)) благодарит вас.
Если вам действительно необходимо программно определить семейство устройств, на которых вы работаете (и в большинстве случаев это не так), вы можете использовать AnalyticsInfo.VersionInfo.DeviceFamliy
. Это возвращает строку, для которой нет опубликованного стандартного набора значений, поскольку семейства устройств могут быть введены или удалены в любое время.
Если вы хотите предоставить разные ресурсы для каждого семейства устройств (строки, изображения, файлы XAML, HTML-страницы и т.д.), вам не нужно обнаруживать семейство устройств в коде; вместо этого вы можете использовать квалификатор MRT DeviceFamily
(например, Logo.DeviceFamily-Mobile.png
). Просто убедитесь, что всегда имеют резервный ресурс (изображение, строка и т.д.) Для использования, когда приложение работает в семействе устройств, о котором вы никогда не слышали. И не попадайте в ловушку принятия таких вещей, как "Настольный компьютер требует более высоких ресурсов, чем Mobile", потому что это часто неверно.
Ответ 4
Кроме того, чтобы поддержать сценарий, который Алан описывает в своем комментарии, вы можете проверить Контракт, а не конкретный тип, поскольку это указывает на блок связанных функций. Существует один такой контракт для конкретных API-интерфейсов Windows Phone - я описал здесь http://inthehand.com/2015/03/26/determine-if-running-on-windows-phone-from-a-uap-application/
Поскольку этот контракт предоставляет API совместимости для текущих приложений Windows Phone, мы можем предположить на этом этапе, что он не будет реализован в небольших планшетах, так как они не будут иметь этого. Очевидно, что поскольку OS или API не являются окончательными, это еще не задано. Это полезно знать для Windows Phone, особенно если во время перехода вы хотите перекрестно продвигать устаревшие приложения WP только на устройствах WP. Для пользовательских устройств IoT я бы проверял доступность на уровне API.
Ответ 5
Вы можете указать эксклюзивные ресурсы семейства устройств и представления, используя специально названные папки: (http://www.sharpgis.net/post/2015/04/01/Creating-DeviceFamily-specific-layouts-in-a-Universal-App).
Вы можете использовать описанный выше сценарий "только для рекламы с одним семейным приложением", поместите JSON или XML файл в эту семейство семейств устройств и извлеките его во время выполнения с использованием API хранения.
Ответ 6
Я использую это для телефона (мобильный):
if (Windows.System.Profile.AnalyticsInfo.VersionInfo.DeviceFamily == "Windows.Mobile")
{
// code for phone
}
else
{
// other code
}
extample здесь
Ответ 7
Это просто повторение одного из предыдущих ответов, в котором предлагается использовать 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;
}
Я согласен с Чаком в том, что это, вероятно, не то, для чего предназначен Google AnalyticsInfo... но в то же время мы говорим о xbox - устройстве с одним производителем, который также отвечает за ОС. Так что, по моему мнению, это кажется довольно безопасным. Кроме того, если вы завернете это так, невероятно легко поменять местами в другой проверке, если что-то лучше придет.