Dieser Artikel ist Tag #28 der Serie 31 Tage Mango von Jeff Blankenburg.
Der Originalartikel befindet sich hier: Day #28: Media Library.
Dieser Artikel wurde in der Originalserie von Gastautor Jeff Fansler geschrieben. Bei Twitter kann Jeff unter @fanzoo erreicht werden.
Heute schauen wir uns die Klasse MediaLibrary an. Diese ist Teil des Namespaces Microsoft.Xna.Framework.Media. Wie der Name schon andeutet, gibt uns diese Klasse Zugriff auf die Medienbibliothek des Anwenders. Eine Medienbibliothek auf Windows Phone speichert Bilder und Musik. Indem Sie die MediaLibrary verwenden, können Sie diese Inhalte in Ihrer eigenen Anwendung verwenden. Es gibt einige Gründe, warum das als Entwickler interessant sein kann. Hier sind einige Ideen:
- Sie können eine Liste von Liedern anzeigen und den Benutzer eine Hintergrundmusik zu Ihrer Anwendung wählen lassen.
- Sie können den Benutzer Bilder eines Dienstes (z.B. Flickr) herunterladen lassen und diese in der Medienbibliothek ablegen.
- Sie können die Künstler und Genres der Medienbibliothek verwenden, um dem Anwender Vorschläge für ähnliche Inhalte zu machen.
Um zu zeigen, wie die Medienbibliothek verwendet werden kann, habe ich eine Beispielanwendung gebaut. Diese App wird alle Lieder aus der Medienbibliothek des Anwenders anzeigen, ein gewähltes Lied abspielen und dem Anwender erlauben, ein Bild aus der Medienbibliothek als Hintergrundbild für die Anwendung zu wählen. Die App verwendet die Medienbibliothek also, um eine Liste der Lieder zu bekommen und sie wird außerdem ein Bild zur späteren Verwendung für den Benutzer in der Medienbibliothek ablegen.
Ein Bild in der Medienbibliothek speichern
In der Beispielanwendung habe ich image1.jpg als Ressource hinzugefügt. Es ist ein tolles Bild und ich bin mir sicher, dass alle Benutzer das Bild haben wollen. Wir werden es also in der Medienbibliothek ablegen. Die Beispielanwendung speichert dieses Bild in der Methode Application_Launching in App.xaml.cs. Hier ist der Code, der das erledigt:
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()); }
Der meiste Code hat mit dem Laden des Bildes zu tun. Einige wichtige Zeilen verwenden die MediaLibrary. Lassen Sie uns diese Zeilen näher ansehen.
var library = new MediaLibrary();
Diese Zeile erstellt eine neue Instanz von MediaLibrary. Damit bekommen wir Zugriff auf deren Eigenschaften und Methoden.
var image = library.Pictures.Where(p => p.Name == imageName).SingleOrDefault();
Mit dieser Zeile durchsuchen wir die MediaLibrary nach einem Bild mit dem Namen imageName. Wenn das Bild bereits existiert, speichert der Code es nicht nochmal.
library.SavePicture(imageName, bitmap.ToStream());
Diese Zeile speichert das BitmapImage in der MediaLibrary. Wie Sie wissen, hat das BitmapImage normalerweise keine Methode ToStream. Ich habe eine Extension Method verwendet, um diese Methode hinzuzufügen. Diese Erweiterung hat eigentlich nichts mit der Medienbibliothek zu tun, aber der Vollständigkeit halber ist sie hier:
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; } }
Nachdem der Code ausgeführt wurde, wird das Bild in der Medienbibliothek verfügbar sein. Sie können das in unserer Beispielanwendung ausprobieren, indem Sie den Button in der Application Bar der Anwendung drücken. Dadurch wird ein PhotoChooserTask gestartet und das Bild sollte dort zur Auswahl stehen.
Eine Liste von Liedern bekommen
Der Screenshot der Beispielanwendung oben zeigt eine Liste von Liedern in der Medienbibliothek des Benutzers. Die Liste ist eine ListBox. Wir haben einen DataTemplate definiert, der die Eigenschaft Text zweier TextBlocks bindet. Der eine zeigt den Namen des Liedes und der andere den Künstler. Das XAML für die ListBox sieht so aus:
<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>
Die ItemsSource der ListBox zu setzen ist sehr einfach:
var library = new MediaLibrary(); lstSongs.ItemsSource = library.Songs;
Was gibt es noch?
Es gibt einige weitere Eigenschaften der Klasse MediaLibrary die wir uns ansehen sollten:
- Albums — Ähnlich wie die Liste der Lieder, nur das Alben zurückgegeben werden.
- Artists — Wieder ähnlich wie die Liste der Lieder, diesmal für Künstler.
- Genres — Diese Collection beinhaltet die Genres der Lieder.
- Playlists — Die Playlists, die der Benutzer zur Medienbibliothek hinzugefügt hat.
Zusammenfassung
Wie Sie sehen können, ist die Verwendung der Medienbibiothek relativ einfach. Der meiste Code der Anwendung wurde geschrieben, um mit den Inhalten umzugehen, nicht um diese in der MediaLibrary zuzugreifen. Wir haben gesehen, wie man auf die Liste der Lieder zugreift und wie man ein Bild abspeichern kann. Ich habe auch einige Ideen zur Verwendung der Medienbibliothek angerissen. Ich bin mir sicher, dass es viele weitere Verwendungsmöglichkeiten gibt. Viel Spaß bei der Entwicklung. Ich freue mich schon auf Ihre Apps.
Um ein komplettes Windows Phone Projekt mit dem Code dieses Artikels herunterzuladen, drücken Sie auf den Download Code Button:
Morgen werden wir Globalisierung/Lokalisierung behandeln.
Bis dahin!