locked
Радио для Windows Phone RRS feed

  • Вопрос

  • Здравствуйте! Задался целью написать приложение для прослушивание ФМ радио.

    1. Подскажите как мне выводить частоту на экран? в какой блок?

    2. Как устанавливать частотный диапазон? Как это сделано в  официальном приложении свйпом вправо или влево!

    Материалов по этой теме практически нет кроме этого http://msdn.microsoft.com/en-us/library/windowsphone/develop/ff769541(v=vs.105).aspx#BKMK_DevelopmentConsiderations

    Но там совсем мало описания.

    17 июня 2014 г. 20:50

Ответы

  • Живой пример.. гуглите, не знаю.

    Почитайте про анимации, там всё очень просто. Лучше положите текстблок в грид и у грида подписываетесь на ManipulationDelta и ManipulationCompleted. 

    Дельта нужна для того, если Вы хотите чучуть двигать (в буквальном смысле) свой контрол, что бы красиво он за пальцем тянулся. Это делается с помощью TranslateTransform. Если Вам такое не нужно, то юзаете только ManipulationCompleted

    В ManipulationCompleted уже отслеживаете только в какую сторону пользователь двигал пальцем.

    Что-то типа такого:

    private void OnControlManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
            {
                var horizontalVelocity = e.FinalVelocities.LinearVelocity.X;
                var verticalVelocity = e.FinalVelocities.LinearVelocity.Y;
    
                var direction = this.GetDirection(horizontalVelocity, verticalVelocity);
    
    
    
    private ManipulationDirection GetDirection(double x, double y)
            {
                ManipulationDirection result;
                var orientation = Math.Abs(x) >= Math.Abs(y) ? System.Windows.Controls.Orientation.Horizontal : System.Windows.Controls.Orientation.Vertical;
                if (orientation == System.Windows.Controls.Orientation.Horizontal)
                {
                    result = x >= 0 ? ManipulationDirection.HorizontalToLeft : ManipulationDirection.HorizontalToRight;
                }
    }
    
    
    [Flags]
        public enum ManipulationDirection
        {
            HorizontalToLeft = 1 << 0,
            HorizontalToRight = 1 << 1,
            VerticalToTop = 1 << 2,
            VerticalToBottom = 1 << 3,
            Horizontal = HorizontalToLeft | HorizontalToRight,
            Vertical = VerticalToBottom | VerticalToTop
        }


    2 июля 2014 г. 12:16
  • Задавайте вопросы в отдельных темах, сложно отслеживать уже отвеченные темы.

    Для нужной цели Вам необходимо использовать механим прерывания тасков.

    Суть в том, что Вы передадите объект CancellationToken, которому Вы по запуску второго метода Вы у этого объекта вызовите метод Cancel и в цикле будете проверять, нужно ли завершать метод.

    В общем - из почитайте код по ссылке, а потом снова прочтите то, что я сказал выше. Так будет понятней.

    11 августа 2014 г. 13:35
  • Насчет поиска  не знаю, я с этим просто не работал. Ищите инфу в интернете, наши с Вами поисковые возможности одинаковы.

    Почему не получилось? Код покажите.

    Пардон, все получилось, задержка помогла. Спасибо!!! Был не много не внимателен!

    Поиск по силе сигнала тоже получился! Изменяем значения от 0.1 до 1! 

     
     FMRadio.Instance.SignalStrength > 0.2

    http://social.msdn.microsoft.com/Forums/en-US/2258bc53-0b00-4fac-b36e-1a64be3c0520/fmradio-tune-delay-powermode?forum=wpdevelop&prof=required
    22 июля 2014 г. 19:31

Все ответы

  • Частоту можете вывести в контрол TextBlock в свойство Text.

    Для свайпа есть 2 варианта - использовать контрол Pivot или отслеживать жесты руками. Вот статья про жесты

    18 июня 2014 г. 7:24
  • Частоту можете вывести в контрол TextBlock в свойство Text.

    Для свайпа есть 2 варианта - использовать контрол Pivot или отслеживать жесты руками. Вот статья про жесты

    А как контрол Pivot использовать, разве он не пролистывает страницу? Или его можно использовать для блока Textblock!?
    Есть ли нормальный живой пример по использованию жестов в ручную!?
    20 июня 2014 г. 17:31
  • Живой пример.. гуглите, не знаю.

    Почитайте про анимации, там всё очень просто. Лучше положите текстблок в грид и у грида подписываетесь на ManipulationDelta и ManipulationCompleted. 

    Дельта нужна для того, если Вы хотите чучуть двигать (в буквальном смысле) свой контрол, что бы красиво он за пальцем тянулся. Это делается с помощью TranslateTransform. Если Вам такое не нужно, то юзаете только ManipulationCompleted

    В ManipulationCompleted уже отслеживаете только в какую сторону пользователь двигал пальцем.

    Что-то типа такого:

    private void OnControlManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
            {
                var horizontalVelocity = e.FinalVelocities.LinearVelocity.X;
                var verticalVelocity = e.FinalVelocities.LinearVelocity.Y;
    
                var direction = this.GetDirection(horizontalVelocity, verticalVelocity);
    
    
    
    private ManipulationDirection GetDirection(double x, double y)
            {
                ManipulationDirection result;
                var orientation = Math.Abs(x) >= Math.Abs(y) ? System.Windows.Controls.Orientation.Horizontal : System.Windows.Controls.Orientation.Vertical;
                if (orientation == System.Windows.Controls.Orientation.Horizontal)
                {
                    result = x >= 0 ? ManipulationDirection.HorizontalToLeft : ManipulationDirection.HorizontalToRight;
                }
    }
    
    
    [Flags]
        public enum ManipulationDirection
        {
            HorizontalToLeft = 1 << 0,
            HorizontalToRight = 1 << 1,
            VerticalToTop = 1 << 2,
            VerticalToBottom = 1 << 3,
            Horizontal = HorizontalToLeft | HorizontalToRight,
            Vertical = VerticalToBottom | VerticalToTop
        }


    2 июля 2014 г. 12:16
  • Подскажите еще такой момент! 

    Нужно пройтись по частотам в поиске рабочей ФМ частоты! Планирую я это сделать с помощью цикла увеличивая шаг частоты на 0.1 и присваивая таким образом

    for (fmCicl = 100.1; fmCicl < 105.3; fmCicl += 0.1)
                {
                    fin = Math.Round(fmCicl, 1);
                    FMRadio.Instance.Frequency = fin;
                    radio.Text = Convert.ToString(fin);
                }

    На этом этапе возникает два вопроса:

    1. С помощью какого метода реализуется контроль интенсивности сигнала?Если найден сигнал то поиск останавливается!

    2. Как выводить в Texblock каждую итерацию цикла!? Потому что в написанном мной методе выводиться сразу конечное значение!

    20 июля 2014 г. 7:32
  • 1. Понятия не имею, никогда не работал с радио в ВП и эту тему не изучал.

    2. Цикл прогоняется очень быстро, поэтому Вы видите только конечное значение Мжно сюда впихнуть задержку:

    for (fmCicl = 100.1; fmCicl < 105.3; fmCicl += 0.1)
                {
                    fin = Math.Round(fmCicl, 1);
                    FMRadio.Instance.Frequency = fin;
                    radio.Text = Convert.ToString(fin);
                    await Task.Delay(800);//миллисекунд
                }

     Так же, с использованием оператора await необходимо метод пометить как async void или async Task.

    20 июля 2014 г. 15:00
  • Спасибо за совет!

    По первому вопросу нашел метод.

    FMRadio.Instance.SignalStrength

    Не срабатывает условие соответствия мощности сигнала! Т.е. частота найдена и поиск должен остановиться. 

    double fmCicl;
                double fin;
                for (fmCicl = 100.7; fmCicl < 106.7; fmCicl += 0.1)
                {
                    //fin = 103.888;
                    //radio.Text = Convert.ToString(fmCicl);
                    fin = Math.Round(fmCicl, 1);
                    FMRadio.Instance.Frequency = fin;
                    if (FMRadio.Instance.SignalStrength == fin)
                    {
                        radio.Text = Convert.ToString(fin);
                        break;
                    }
                }

    20 июля 2014 г. 17:48
  • (FMRadio.Instance.SignalStrength

    Какие у Вас здесь значения бывают?

    Из 2х ссылок, что я нагуглил, это свойство проверяют на "0.0" и выводят сообщение "вставьте наушники", если сила == 0.0

    21 июля 2014 г. 6:48
  • (FMRadio.Instance.SignalStrength

    Какие у Вас здесь значения бывают?

    Из 2х ссылок, что я нагуглил, это свойство проверяют на "0.0" и выводят сообщение "вставьте наушники", если сила == 0.0

    Получается в стандартном API нет метода для FMRadio реализации поиска сигнала радиостанции как в стандартной программе? Я подумал что FMRadio.Instance.SignalStrength и есть то средство по сколько было Retrieves the received signal strength indicator (RSSI), а с его помощью можно только проверить на наличие или отсутствия сигнала!

    Как же тогда реализовать метод поиска сигнала радиостанции???

    Кстати, с помощью await не получилось вывести итерации цикла  в TexBlock! 

    21 июля 2014 г. 18:36
  • Насчет поиска  не знаю, я с этим просто не работал. Ищите инфу в интернете, наши с Вами поисковые возможности одинаковы.

    Почему не получилось? Код покажите.

    21 июля 2014 г. 19:14
  • Насчет поиска  не знаю, я с этим просто не работал. Ищите инфу в интернете, наши с Вами поисковые возможности одинаковы.

    Почему не получилось? Код покажите.

    Пардон, все получилось, задержка помогла. Спасибо!!! Был не много не внимателен!

    Поиск по силе сигнала тоже получился! Изменяем значения от 0.1 до 1! 

     
     FMRadio.Instance.SignalStrength > 0.2

    http://social.msdn.microsoft.com/Forums/en-US/2258bc53-0b00-4fac-b36e-1a64be3c0520/fmradio-tune-delay-powermode?forum=wpdevelop&prof=required
    22 июля 2014 г. 19:31
  • Подскажите такой момент.

    Сейчас пытаюсь реализовать управление подбора частотой! 

    Срабатывания события ClickUpp идет поиск частоты верхнего диапазона, ClickDawn нижнего диапазона!

    Как только запускается метод ClickUpp  идет поиск верхнего диапазона, но когда запускается метод ClickDawn то частота скачет вверх - вниз. Как завершить один из методов при запуске другого!?

     private void Dawn(object sender, RoutedEventArgs e)
            {
                ClickDawn();
            }
    
            private void Upp(object sender, RoutedEventArgs e)
            {
                ClickUp();
            }
            public async void ClickDawn()
            {
                {
                    double Condition = 87.5;
                    double fin;
                    for (double Cicl = Frenq; Cicl > Condition; Cicl -= 0.1)
                    {
                        if (Cicl == Condition)
                        {
                            Frenq = 108.0;
                        }
                        fin = Math.Round(Cicl, 1);
                        FMRadio.Instance.Frequency = fin;
                        await Task.Delay(100);
                        //DelaySearch();
                        if (FMRadio.Instance.SignalStrength > 0.3)
                        {
                            Visible_Frenq.Text = Convert.ToString(fin);
                            Cicl = fin;
                            Frenq = Math.Round(fin - 0.2, 1);
                            Contakt.Text = "Ниже";
                            return;
                        }
                        Visible_Frenq.Text = Convert.ToString(fin);
                    }
                }
            }
            public async void ClickUp()
            {
                double Condition = 108.1;
                double fin;
                for (double Cicl = Frenq; Cicl < Condition; Cicl += 0.1)
                {
                    if (Cicl == 108.0)
                    {
                        Frenq = 87.5;
                    }
                    fin = Math.Round(Cicl, 1);
                    FMRadio.Instance.Frequency = fin;
                    await Task.Delay(100);
                    //DelaySearch(200);
                    if (FMRadio.Instance.SignalStrength > 0.4)
                    {
                        Visible_Frenq.Text = Convert.ToString(fin);
                        Cicl = fin;
                        Frenq = Math.Round(fin + 0.2, 1);
                        Contakt.Text = "Вверх";
                        return;
                    }
                    Visible_Frenq.Text = Convert.ToString(fin);
                    //await Task.Delay(400);
                }
            }


    6 августа 2014 г. 18:41
  • Задавайте вопросы в отдельных темах, сложно отслеживать уже отвеченные темы.

    Для нужной цели Вам необходимо использовать механим прерывания тасков.

    Суть в том, что Вы передадите объект CancellationToken, которому Вы по запуску второго метода Вы у этого объекта вызовите метод Cancel и в цикле будете проверять, нужно ли завершать метод.

    В общем - из почитайте код по ссылке, а потом снова прочтите то, что я сказал выше. Так будет понятней.

    11 августа 2014 г. 13:35
  • Спасибо Олег за помощь! Буду иметь ввиду!!!
    4 сентября 2014 г. 15:32