Блог Сергея Байдачного

Мой блог о технологиях

Сохранение рингтонов из приложения в WP 7.5

leave a comment »

 

Один из популярных способов заработать деньги на пользователях устройств, это продавать уникальные мелодии звонков для их телефонов. Этот бизнес настолько развит в Украине, что реклама соответствующих служб присутствует и на центральных каналах телевидения. Правда, чтобы заниматься подобным бизнесом, необходимо договориться с мобильным оператором, получить короткий номер и решить много других вопросов.

Но если мы говорим о Windows Phone 7.5, то реализовать подобный бизнес тут значительно проще, так как в обновлении платформы появилась возможность устанавливать мелодию звонка из приложения. Это делается с помощью класса SaveRingtoneTask, который инициирует вызов стандартного Windows Phone приложения, позволяющего как сохранить мелодию в общем списке, так и установить мелодию конкретному контакту.

Прежде чем переходить к реализации примера, следует отметить, что в Windows Phone 7.5 присутствуют следующие ограничения на мелодии звонка:

· Мелодия должна быть сохранена в виде mp3 или wma формата;

· Размер файла должен быть менее 1 Мб;

· Продолжительность аудио должна быть менее 40 секунд;

· Файл не должен быть защищен DRM.

Если все эти условия выполнены, то мелодия может быть установлена.

Посмотрим на то, что должен обычный пользователь сделать, чтобы сохранить мелодию звонка на свой телефон. Итак, если Вы обычный пользователь и у Вас есть mp3 (кстати, его нужно еще найти), который Вы хотите загрузить в телефон, то нужно выполнить следующие действия:

1). Преобразовать mp3 файл таким образом, чтобы он удовлетворял критериям выше. Это можно сделать с помощью Expression Encoder или другого аналогичного приложения. Естественно, пользователь ничего о подобных приложениях не знает (как и об ограничениях);

2). Как только у пользователя есть готовый mp3 или wma, то его необходимо синхронизировать с телефоном. Для этого файл добавляется в коллекцию с музыкой, доступной через Zune, после чего необходимо перейти к редактированию файла и установить свойство Genre в значение ringtone (если файл не удовлетворяет критериям, то его тип поменять нельзя).

image

3). Подключить телефон к компьютеру и синхронизировать созданную мелодию с телефоном.

Как видите, задача не тривиальная и вряд ли под силу простому пользователю. Но это означает, что приложения по установке мелодий будут не только популярны, но и позволят заработатьJ

А вот теперь приведем код примера. Начнем с интерфейса:

 

<Grid x:Name="LayoutRoot" Background="Transparent">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
        <TextBlock x:Name="ApplicationTitle" Text="Ringtone Sample" 
             Style="{StaticResource PhoneTextNormalStyle}"/>
        <TextBlock x:Name="PageTitle" Text="Ringtones" Margin="9,-7,0,0" 
             Style="{StaticResource PhoneTextTitle1Style}"/>
        <MediaElement Name="mp"></MediaElement>
    </StackPanel>

    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <ListBox Name="ringList">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock FontSize="32" Text="{Binding RingtoneName}"></TextBlock>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>
</Grid>

<phone:PhoneApplicationPage.ApplicationBar>
    <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
        <shell:ApplicationBarIconButton IconUri="/Images/appbar.check.rest.png" 
             Text="Ringtone" Click="ApplicationBarIconButton_SetRing_Click"/>
        <shell:ApplicationBarIconButton IconUri="/Images/appbar.transport.play.rest.png" 
             Text="Play" Click="ApplicationBarIconButton_Ringtone_Click"/>
    </shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>

 

Тут мы добавили список, который будет отображать доступные мелодии. Тут можно ввести такие поля, как описание, автор категория и др., но это Вы сделаете сами. Далее в приложении присутствует ApplicationBar, который содержит две кнопки. Первая кнопка позволяет установить выделенную мелодию в качестве звонка телефона, а вторая – проиграть мелодию прямо в приложении. Чтобы иметь возможность проиграть мелодию, мы также разместили MediaElement. В нашем случае он не имеет визуального отображения.

Определим класс, который будет хранить информацию о мелодиях:

 

public class RingtoneItem
{
    public string RingtoneName { get; set; }
    public string RingtonePath { get; set; }
}

 

А теперь перейдем к коду.

В первой части мы загрузим все доступные мелодии, которые поставляются прямо с приложением. В полноценной версии приложения, Вы наверняка будете выбирать список мелодий из какой-то службы, а потом предлагать загрузить ту или другой мелодию в изолированное хранилище и только после этого давать прослушать мелодию. В нашем случае все гораздо примитивнее.

Во второй части приложения мы обрабатываем событие нажатия на кнопки в Application Bar и проигрываем мелодию, либо вызываем метод Show объекта типа SaveRingtoneTask. Обратите внимание, что при передаче параметра этому объекту, правило формирования Uri отличается от принятого внутри приложения. Чтобы Uri смог быть разобран внешним приложением, его необходимо формировать с помощью приставки appdata: или isostore:, в зависимости от того, где находится Ваш файл с мелодией (внутри приложения или загружен в IsolatedStorage).

Вот полный код основной страницы:

SaveRingtoneTask saveRing;
List<RingtoneItem> list = new List<RingtoneItem>();

public MainPage()
{
    InitializeComponent();

    saveRing = new SaveRingtoneTask();
    saveRing.Completed += 
         new EventHandler<TaskEventArgs>(saveRing_Completed);

    list.Add(new RingtoneItem() { 
         RingtoneName="Mission Impossible",
         RingtonePath="/Ringtones/mission.wma"});
    list.Add(new RingtoneItem() { 
         RingtoneName = "Va Bank", 
         RingtonePath ="/Ringtones/vabank.wma" });

    ringList.ItemsSource = list;

}

void saveRing_Completed(object sender, TaskEventArgs e)
{
    string statusText="";
    if (e.TaskResult == TaskResult.OK)
    {
        statusText = "Save completed.";
    }
    else if (e.TaskResult == TaskResult.Cancel)
    {
        statusText = "Save cancelled.";
    }
    MessageBox.Show(statusText);
}

private void ApplicationBarIconButton_Ringtone_Click(object sender, EventArgs e)
{
    if (ringList.SelectedIndex >= 0)
    {
        mp.Source = 
           new Uri(((RingtoneItem)ringList.SelectedItem).RingtonePath, 
                     UriKind.Relative);
        mp.Play();
    }
}


private void ApplicationBarIconButton_SetRing_Click(object sender, EventArgs e)
{
    if (ringList.SelectedIndex >= 0)
    {
        saveRing.Source = new Uri(
             "appdata:"+((RingtoneItem)ringList.SelectedItem).RingtonePath);
        saveRing.Show();
    }
}
Реклама

Written by Sergiy Baydachnyy

05.01.2012 в 15:10

Опубликовано в Windows Phone

Tagged with

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: