Статьи

31 Дней Манго | День № 28: Медиатека

Эта статья является 28-м днем ​​в серии под названием « 31 день манго» и была написана приглашенным автором Джеффом Фэнслером . Джефф можно найти в Твиттере на @fanzoo .

Day28-MediaLibrary

Сегодня мы рассмотрим класс MediaLibrary, который является частью пространства имен Microsoft.Xna.Framework.Media. Как следует из названия, этот класс дает нам доступ к пользовательской библиотеке мультимедиа. В библиотеке мультимедиа на Windows Phone хранятся картинки и музыка. С помощью библиотеки мультимедиа вы можете интегрировать этот контент в свои собственные приложения. Есть несколько причин, по которым разработчик может захотеть сделать это. Вот несколько идей:

  • Чтобы показать пользователю список песен и позволить им выбрать фоновую музыку во время использования вашего приложения.
  • Чтобы позволить пользователю загружать свои изображения из службы (например, Flickr) и добавлять их в библиотеку мультимедиа.
  • Использовать данные музыкального исполнителя или жанра из библиотеки мультимедиа для внесения предложений в отношении другого подобного контента, который может заинтересовать пользователя.

Чтобы показать, как использовать библиотеку мультимедиа, я создал пример приложения. Это приложение перечислит все песни, которые находятся в библиотеке мультимедиа пользователя, воспроизведет песню, когда пользователь выберет песню, и позволит пользователю выбрать изображение из библиотеки мультимедиа для использования в качестве фона. Приложение использует библиотеку мультимедиа для получения списка песен, а также сохраняет изображение в библиотеке мультимедиа для пользователя.

clip_image002 [7]

Сохранение изображения в медиатеку

В примере приложения я добавил image1.jpg в качестве ресурса. Это потрясающее изображение, и я уверен, что все пользователи захотят его, поэтому мы собираемся сохранить это изображение в библиотеке мультимедиа. Пример приложения сохраняет это изображение в методе Application_Launching в файле App.xaml.cs. Вот код, который делает эту работу:

var library = new MediaLibrary();
var image = library.Pictures.Where(p => p.Name == imageName).SingleOrDefault();

if (image == null)
{
    var resource =
        Application
        .GetResourceStream(new Uri(string.Format("/31DaysMediaLibrary;component/Images/{0}",
                                    imageName),
                            UriKind.Relative));
    var bitmap = new BitmapImage();
    bitmap.SetSource(resource.Stream);

    // Save the image to the camera roll or saved pictures album.
    library.SavePicture(imageName, bitmap.ToStream());
}

Большая часть этого кода просто работает с загрузкой изображения. Здесь есть несколько важных строк, которые используют Медиатеку. Давайте внимательнее посмотрим на некоторые из этих строк.

var library = new MediaLibrary();

Эта строка создает новый класс MediaLibrary. Это то, что даст вам доступ к свойствам и методам медиатеки.

var image = library.Pictures.Where(p => p.Name == imageName).SingleOrDefault();

Эта строка ищет в библиотеке любые изображения, которые сохранены с imageName. Если это изображение уже существует, код не сохраняет его снова.

library.SavePicture(imageName, bitmap.ToStream());

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

public static class BitmapExtensions
{
    public static Stream ToStream(this BitmapImage bitmap)
    {
        var writeableBitmap = new WriteableBitmap(bitmap);
        var stream = new MemoryStream();
        writeableBitmap.SaveJpeg(stream, bitmap.PixelWidth, bitmap.PixelHeight, 0, 100);
        stream.Position = 0;
        return stream;
    }
} 

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

clip_image004 [6]

Получение списка песен

В примере приложения на экране отображается список песен, которые находятся в медиатеке пользователя. Список представляет собой ListBox. Определен DataTemplate, который связывает свойство Text двух TextBlock. Один отображает название песни, а другой — исполнителя. Вот как выглядит XAML для ListBox:

<ListBox
    x:Name="lstSongs"
    SelectionChanged="SongSelectionChanged">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel
                Margin="0,0,0,17"
                Width="432"
                Height="78">
                <TextBlock
                    Text="{Binding Name}"
                    TextWrapping="Wrap"
                    Style="{StaticResource PhoneTextExtraLargeStyle}"/>
                <TextBlock
                    Text="{Binding Artist.Name}"
                    TextWrapping="Wrap"
                    Margin="12,-6,12,0"
                    Style="{StaticResource PhoneTextSubtleStyle}"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Setting the ItemsSource to the list of songs is quite simple:

var library = new MediaLibrary();
lstSongs.ItemsSource = library.Songs; 

What Else Is There?

There are a few other properties off of the MediaLibrary class to take a look at:

Albums — This is similar to the Songs collection but lists albums instead.

Artists — Just like the Albums collection, this collection lists the artists of the songs.

Genres – This collection lists the genres of the songs.

Playlists – This collection lists the playlists that the user has added to their library.

Summary

As you can see, using the Media Library is quite easy. Most of the code in the sample app is written to use the content, not to access it from the library. I talked about how to access the Songs collection and how to save an image to the library. I discussed a few ways to use the library in your own apps. I’m sure there are many other ways to use this content. Have fun and I can’t wait to see your apps.

To download a full Windows Phone project that includes all of the code and concepts from this article, click the Download Code button below.

скачать

Tomorrow, we will cover globalization/localization in the article, and show you how easy it is to include this in your Windows Phone project.  See you then!

toolsbutton

 Source: http://www.jeffblankenburg.com/2011/11/28/31-days-of-mango-day-28-media-library