Если вы ранее использовали какой-либо из проигрывателей Microsoft Zune, вы, вероятно, знаете, что в них есть встроенное FM-радио. Zune, установленный на каждом устройстве Windows Phone 7, также имеет функцию FM-радио, а также есть общедоступная конечная точка API, которая позволяет разработчикам, использующим средства разработки Windows Phone 7, получать доступ к радио из своих собственных приложений.
ВАЖНОЕ ПРИМЕЧАНИЕ. Для выполнения шагов, описанных в этой статье, вам необходимо фактическое разблокированное устройство разработчика Windows Phone 7. Вы не можете проверить возможности радио внутри эмулятора.
Прежде всего, я предполагаю, что у вас уже есть готовый простой «скелет» приложения для Windows Phone 7. Если нет, убедитесь, что вы создали его — в нем не нужно ничего сложного, только базовая страница.
Функциональность FM-радио раскрывается через класс FMRadio , который фактически является одиночным. И это не удивительно — вероятно, было бы неплохо иметь возможность запускать несколько экземпляров радио на одном устройстве. Этот класс является членом Microsoft.Devices.Radio, поэтому убедитесь, что вы добавляете ссылку на него в заголовок класса.
Функциональность радио может быть доступна через:
FMRadio.Instance
Перед тем, как начать с самого радио, вам необходимо включить его:
FMRadio.Instance.PowerMode = RadioPowerMode.On;
Установка свойства PowerMode является стандартным способом сделать это. Это в значительной степени запускает механизм Play / Pause, с точки зрения пользователя.
Когда радио включено, вы можете установить частоту. Это десятичное значение, поэтому вы должны использовать специфическое для культуры десятичное представление для передачи десятичного значения (в зависимости от вашей системы вам может потребоваться заменить точку запятой):
FMRadio.Instance.Frequency = 105.5;
Один любопытный факт — если вы передадите частоту напрямую, не меняя PowerMode, радио начнет воспроизводиться автоматически.
ВАЖНОЕ ПРИМЕЧАНИЕ: Вам необходимо подключить наушники к физическому устройству при тестировании функциональности радио. Те служат антенной.
Если у вас есть этот набор, вы сможете получать радиопередачи, если только вы не получите исключение «Отказано в доступе»:
Это происходит по очень простой причине. Для отладки на устройстве необходимо запустить программное обеспечение Zune, а телефон должен быть зарегистрирован в режиме полной синхронизации. Справедливо, но в то же время Zune монополизирует медиа на устройстве, поэтому блокирует доступ к нему с любого внешнего ресурса. Радио является частью набора мультимедиа, поэтому вы не можете запустить его и с Zune.
Так что вы должны сделать — в конце концов, вы не можете просто закрыть Zune? Существует инструмент WPConnect, доступный как часть октябрьского обновления Windows Phone 7 SDK . После загрузки и установки перейдите к (для 64-битных машин):
C: \ Program Files (x86) \ Microsoft SDK \ Windows Phone \ v7.0 \ Tools \ WPConnect
Для 32-битных машин:
C: \ Program Files \ Microsoft SDK \ Windows Phone \ v7.0 \ Tools \ WPConnect
Запустите WPConnect.exe , который находится в указанной выше папке. Вы должны увидеть что-то похожее на это:
Конечно, программное обеспечение Zune должно быть закрыто во время выполнения этой операции. Если это не так, вы получите сообщение об ошибке, уведомляющее вас о том, что это нужно сделать.
Теперь вы можете начать слушать FM-радио прямо из своего приложения.
Дополнительные вещи
Еще одна ошибка, которую вы можете получить, это RadioDisabledException — она вызвана блокировкой радио на самом телефоне или специально для вашего приложения:
Первое, что вы можете и должны сделать, это проверить заявленные возможности приложения в WMAppManifest.xml . Ваше приложение должно иметь ID_CAP_MEDIALIB:
<Capabilities>
<Capability Name="ID_CAP_MEDIALIB"/>
</Capabilities>
Если это не работает, то на самом устройстве есть другие принудительные политики.
В качестве последнего примечания я хотел сообщить читателю, что, подключившись к радиостанции, вы можете отслеживать уровень сигнала:
Вы можете сделать это с помощью этого кода:
while (true)
{
Debug.WriteLine(FMRadio.Instance.SignalStrength);
}
Убедитесь, что вы запускаете эту часть в фоновом потоке. В противном случае поток пользовательского интерфейса будет заблокирован.