Windows Phone

Erstellen von Medien-Apps für Windows Phone

Mark Hopkins

 

Windows Phone ist eine großartige Plattform für die Nutzung von Medien. Der integrierte Media Player und der Windows Phone Marketplace sind meine Hauptquellen für Audiomaterial, und zwar sowohl für Musik als auch für meine Lieblings-Podcasts. Ich nutze den Player im Fitnessstudio, im Auto, im Bus und sogar morgens, wenn ich mich für den Tag fertig mache. Ich finde Medien-Apps super, mit denen man Sachen entdecken kann, die man sonst niemals finden würde. So habe ich zum Beispiel mithilfe der integrierten Smart DJ-Funktion und verschiedener anderer Musik-Streaming-Apps viel neue Musik kennengelernt. Es gibt mehrere Apps, mit denen man Videos auf YouTube und Vimeo anschauen kann.

Wenn Sie sich für die Erstellung von Medien-Apps für Windows Phone interessieren, müssen Sie zunächst eine Reihe von Anforderungen erfüllen, um eine optimale Integration in das Betriebssystem sicherzustellen. Insbesondere sollten Sie sichergehen, dass Ihre App in den Musik + Videos-Hub eingebunden wird und dort angezeigt wird.

Integration in den Musik + Videos-Hub

„Hubs“ bieten Benutzern eine bequeme Möglichkeit, auf ihre Inhalte zuzugreifen. Der Musik + Videos-Hub ist der zentrale Ort für Medien auf einem Windows Phone-basierten Gerät. Hier können Sie sich nicht nur Ihre Inhalte ansehen, sondern erhalten auch sofort Zugriff auf Ihre am häufigsten verwendeten Medien. Untersuchungen des Windows Phone-Teams zufolge sind dies die häufigsten Aktivitäten, die Benutzer ausführen möchten:

  1. Eine Wiedergabe fortsetzen
  2. Auf Inhalte zugreifen, die am häufigsten wiedergegeben werden
  3. Inhalte finden, die dem Telefon neu hinzugefügt wurden

Der Musik + Videos-Hub verteilt Inhalte in erster Linie nach diesen drei Kategorien. Gleichzeitig werden Medien-Apps und die lokale Medienbibliothek in einer einzigen Oberfläche zusammengeführt. Abbildung 1 zeigt eine Rundumansicht des Musik + Videos-Hubs in Windows Phone.

The Music + Videos Hub on Windows PhoneAbbildung 1 Der Musik + Videos-Hub in Windows Phone

Der Musik + Videos-Hub ist nicht nur für Endnutzer eine tolle Sache, sondern auch für Ihre Anwendungen sehr wertvoll. Er erfordert keine proaktive Benutzeranpassung, sodass Ihre Inhalte schnell auffindbar sind. Wenn Sie eine Anwendung für die Wiedergabe von Musik oder Videoinhalten haben, sollten Sie sie zur Ausschöpfung des vollen Potenzials von Windows Phone in jedem Fall in den Musik + Videos-Hub integrieren.

Es gibt vier wichtige Integrationspunkte bei der Musik- und Videowiedergabe für Ihre Anwendung:

  1. Füllen der Kachel „Aktuelle Wiedergabe“
  2. Hinzufügen von Elementen in die Listen „Neu“ und „Verlauf“
  3. Feststellen, ob Ihre App von einem Element in der Liste „Neu“ oder in der Liste „Verlauf“ gestartet wurde
  4. Integration in die Apps-Liste

Füllen der Kachel „Aktuelle Wiedergabe“

Diese Kachel nimmt den meisten Platz im Musik + Videos-Hub ein. Sie zeigt ein relativ großes Bild des aktuell angehaltenen oder zuletzt wiedergegebenen Inhalts an. Wenn Sie auf diese Kachel tippen, wird die Wiedergabe des angezeigten Inhalts entweder fortgesetzt oder gestartet. Durch Ausfüllen dieser Kachel können Sie für Ihre Inhalte werben und schaffen einen zusätzlichen Einstiegspunkt in das Wiedergabeerlebnis, das Ihre App bietet. Das Element „Aktuelle Wiedergabe“ wird durch Festlegen der Eigenschaft „MediaHistory.Instance.NowPlaying“ aktualisiert, wie im folgenden Codeausschnitt gezeigt (ich verwende C# in diesem Artikel):

MediaHistoryItem mediaHistoryItem = new MediaHistoryItem();
// <hubTileImageStream> must be a valid ImageStream.
mediaHistoryItem.ImageStream = <hubTileImageStream>;
mediaHistoryItem.Source = "";
mediaHistoryItem.Title = "NowPlaying";
mediaHistoryItem.PlayerContext.Add("keyString", "Song Name");
MediaHistory.Instance.NowPlaying = mediaHistoryItem;

Hinzufügen von Elementen in der Liste „Verlauf“

Zuletzt auf dem Telefon wiedergegebene Inhalte können durch Aufrufen der Methode „MediaHistory.Instance.WriteRecentPlay“ in der Kachel „Verlauf“ angezeigt werden. So wie die Kachel „Aktuelle Wiedergabe“ zeigen auch die Verlaufskacheln Bilder an und ermöglichen es, durch Antippen die Wiedergabe der enthaltenen Inhalte zu starten. Hier erfahren Sie, wie Sie die Liste „Verlauf“ aktualisieren können:

MediaHistoryItem mediaHistoryItem = new MediaHistoryItem();
// <hubTileImageStream> must be a valid ImageStream.
mediaHistoryItem.ImageStream = <hubTileImageStream>;
mediaHistoryItem.Source = "";
mediaHistoryItem.Title = "RecentPlay";
mediaHistoryItem.PlayerContext.Add("keyString", "Song Name");
MediaHistory.Instance.WriteRecentPlay(mediaHistoryItem);

Hinzufügen von Elementen in der Liste „Neu“

Kacheln mit der Bezeichnung „Neu“ funktionieren genauso wie Verlaufskacheln, zeigen jedoch kürzlich hinzugefügte Telefoninhalte an. So kann eine Kachel mit der Bezeichnung „Neu“ beispielsweise eine Musikdatei vorschlagen, die gerade erst auf das Telefon heruntergeladen wurde. Diese Kacheln können jedoch auch für neu erstellte Radiosender oder Wiedergabelisten und dergleichen verwendet werden. Auch hier gilt, dass die Wiedergabe durch Antippen der Kachel gestartet werden kann. Der folgende Code veranschaulicht, wie die Liste „Neu“ aktualisiert wird:

MediaHistoryItem mediaHistoryItem = new MediaHistoryItem();
// <hubTileImageStream> must be a valid ImageStream.
mediaHistoryItem.ImageStream = <hubTileImageStream>;
mediaHistoryItem.Source = "";
mediaHistoryItem.Title = "MediaHistoryNew";
mediaHistoryItem.PlayerContext.Add("keyString", "Song Name");
MediaHistory.Instance.WriteAcquiredItem(mediaHistoryItem);

Feststellen, wie Ihre App gestartet wurde

Die Kacheln „Verlauf“ und „Neu“ sollten nur zum Starten der Wiedergabe verwendet werden, nicht als allgemeine Startpunkte für Ihre Anwendung. Es ist kein Problem, wenn Ihre App gestartet wurde und Ihre Benutzeroberfläche angezeigt wird, aber für eine effiziente und konsistente Benutzererfahrung sollte der Musiktitel bzw. das Video mit einmaligem Antippen gestartet werden können.

Um festzustellen, ob Ihre Anwendung über die Kachel „Verlauf“ oder die Kachel „Neu“ gestartet wurde, überschreiben Sie zunächst die virtuelle Methode „OnNavigatedTo“. Die Informationen in „NavigationContext“ werden zur Ermittlung der zu dem Element gehörenden Medien verwendet. In diesem Fall handelt es sich um einen Song aus der Medienbibliothek auf dem Gerät. Die Wiedergabe des Songs startet im Ereignishandler „Loaded“ für „PhoneApplicationPage“, nachdem die Seite geladen wurde. Laden Sie den Musik + Videos-Beispielhub in der MSDN-Bibliothek unter bit.ly/y0tEiX herunter, um weitere Informationen dazu zu erhalten.

Der Code in Abbildung 2 zeigt, wie Sie feststellen können, ob die Anwendung über ein Element in der Liste „Verlauf“ oder in der Liste „Neu“ gestartet wurde.

Abbildung 2 Feststellen, ob eine Anwendung über ein Element in der Liste „Verlauf“ oder in der Liste „Neu“ gestartet wurde

// Indicates whether the app was launched from a MediaHistoryItem.
bool _historyItemLaunch = false;
// Key for MediaHistoryItem key-value pair.
const String _playSongKey = "keyString";   
// The song to play.
Song _playingSong = null;
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
  MediaLibrary library = new MediaLibrary();
  if (NavigationContext.QueryString.ContainsKey(_playSongKey))
  {
    // The app launched from a history item.
    // Change _playingSong even if something was already playing
    // because the user directly chose a song history item.
    // Use the navigation context to find the song by name.
    String songToPlay = NavigationContext.QueryString[_playSongKey];
    foreach (Song song in library.Songs)
    {
      if (0 == String.Compare(songToPlay, song.Name))
      {
        _playingSong = song;
        break;
      }
    }
    // Set a flag to indicate that the app started from a
    // history item and that it should immediately start
    // playing the song after the UI has finished loading.
    _historyItemLaunch = true;
  }
}
private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
{
  if (_historyItemLaunch)
  {
    // Launched from a history item, start playing the song.
    if (_playingSong != null)
    {
      MediaPlayer.Play(_playingSong);
    }
  }
}

Integration in die Apps-Seite

Wenn Ihre Anwendung eine oder mehrere der oben erwähnten APIs aufruft, erscheint sie automatisch in der Apps-Liste im Hub. Außerdem wird sie in der Hauptanwendungsliste angezeigt. Damit wird es einfacher, Ihre Anwendung zu finden und darauf zuzugreifen, zudem wird sie zentraler Bestandteil der Mediendarstellung. Diese automatische Integration findet statt, wenn der Prozess für die App Hub-Einreichung und -Zertifizierung erkennt, dass Ihre Anwendung die APIs „MediaHistory“ und „MediaHistoryItem“ aufruft und das Anwendungsmanifest ändert, um widerzuspiegeln, dass es sich um eine Medien-App handelt, indem das Attribut „HubType“ festgelegt wird. Sie können dies vor der Einreichung (nur für Testzwecke) selbst festlegen, indem Sie das <App>-Element in der Datei „WMAppManifest.xml“ in Ihrem Windows Phone-Projekt aktualisieren:

<App  ... HubType="1">

Dadurch wird Ihr Programm während des Tests in der Apps-Liste angezeigt. Beachten Sie, dass der App Hub-Einreichungsprozess diese Datei vor der Veröffentlichung basierend auf den erkannten, in Ihrer Anwendung aufgerufenen APIs überschrieben wird.

Erforderliche Grafikdateien

Da der Musik + Videos-Hub inhaltszentriert ist, basiert der Platz, den jede Anwendung erhält, auf der Nutzung. Das heißt, je häufiger Ihre App verwendet wird, desto bekannter wird Ihr Inhalt. Nutzen Kunden Ihre Anwendung regelmäßig, wird der Musik + Videos-Hub mit Ihren Inhalten gefüllt, sodass Sie eine tolle Werbemöglichkeit erhalten.

Da der Musik + Videos-Hub Inhalte aus vielen verschiedenen Quellen zusammenfasst, ist es wichtig, dass Sie sich Ihre App durch die visuelle Darstellung der Kachel von anderen Apps abhebt. Die Darstellung hängt natürlich von der Art Ihrer Anwendung ab. Denken Sie auch daran, dass der Benutzer z. B. über allgemeine Albumcover verfügt, die in derselben Liste für seine aktuellen Alben angezeigt werden. Wenn ein Radiosender gerade einen Song aus einem Album spielt, sollte Ihre Radiosender-App eine Kachel anzeigen, die sich visuell von dem Albumcover unterscheidet, das bei Abspielen des Songs über die Medienbibliothek angezeigt werden würde. Sie können beispielsweise Kacheln verwenden, die Ihre Marke und ein Design für den Inhalt anzeigen.

Im Musik + Videos-Hub angezeigte Kacheln müssen den folgenden Ikonographieregeln entsprechen:

  • Jede Kachel muss den Titel Ihrer Anwendung oder das Logo enthalten.
  • Die Kachel „Aktuelle Wiedergabe“ muss die Abmessung 358 x 358 Pixel haben. Die Dateigröße darf maximal 75 KB betragen.
  • Andere Kacheln müssen die Abmessung 173 x 173 Pixel haben.
  • Für die Eigenschaft „Title“ der MediaHistoryItem-Klasse muss ein Text festgelegt werden, der den Inhalt widerspiegelt, z. B. der Name des Radiosenders oder der Titel des Videos.

Um die Benutzer nicht zu verwirren, sollten die Kacheln nur dann Albumcover enthalten, wenn das Album nach Antippen der Kachel wiedergegeben wird. Wenn Ihre Anwendung einen Stream wiedergibt, sollte die Grafik der Kachel den gerade wiedergegebenen Stream beschreiben. Dies ist jedoch lediglich eine Empfehlung, keine Zertifizierungsanforderung.

Wiedergeben von Medien

Beim Abspielen eines Videos ist die Mediendarstellung ähnlich, unabhängig davon, ob Sie eine XNA Framework- oder eine Silverlight-App erstellen. In einer XNA Framework-App verwenden Sie die Klasse „MediaPlayerLauncher“, die den Windows Phone Media Player startet, wenn Sie „MediaPlayerLauncher.Show“ aufrufen. In Silverlight verwenden Sie die MediaElement-API, die eine bessere Anpassung des Benutzererlebnisses, z. B. Aussehen und Platzierung von Steuerelementen, ermöglicht, aber letztendlich auch den Windows Phone Media Player zur tatsächlichen Wiedergabe des Videos nutzt. Bei Audiodateien wird es interessanter.

„MediaElement“ im Vergleich zu „SoundEffect“

In einer XNA Framework-Anwendung verwenden Sie die Klasse „SoundEffect“ (oder die zugehörige Klasse „SoundEffectInstance“ bzw. „DynamicSoundEffectInstance“) zur Wiedergabe von Audiodateien. Diese Klassen unterstützen nur die Wiedergabe von WAV-Audioquellen. Sie können die Wiedergabe jedoch besser kontrollieren und einige interessante Funktionen verwenden, z. B. die Möglichkeit, bis zu 16 Sounds gleichzeitig abzuspielen und sie als Mix auszugeben.

In einer Silverlight-Anwendung können Sie die Klasse „MediaElement“ verwenden, um zusätzlich zu Videos auch Audiodateien abzuspielen. Die Klasse „MediaElement“ unterstützt die Wiedergabe von WAV-, WMA-, MP3- und anderen Audioquellen. Eine vollständige Liste der in Windows Phone abspielbaren Audioformate finden Sie unter „Supported Media Codecs for Windows Phone“ (bit.ly/aflZrb). Die Klasse „MediaElement“ erlaubt nur die Wiedergabe jeweils eines Sounds. Wenn bereits ein anderer Sound abgespielt wird, stoppt die Klasse „MediaElement“ diesen, wenn Sie die Wiedergabe eines neuen Sounds starten.

In einer Silverlight-Anwendung können Sie auch die Klasse „SoundEffect“ zum Abspielen von Audiodateien verwenden. Um eine XNA Framework-API in einer Silverlight-Anwendung nutzen zu können, müssen Sie die in XNA Framework-Anwendungen enthaltene Spieleschleife simulieren. Dazu erstelle ich in der Regel eine Methode mit der Bezeichnung „StartGameLoop“ zur Einrichtung einer GameTimer-Eigenschaft. Ich rufe die Methode „StartGameLoop“ vom Konstruktor meiner von „PhoneApplicationPage“ abgeleiteten Klasse auf (siehe Abbildung 3). „GameTimer“ ist eine neue Klasse in Windows Phone 7.1 SDK, die die Integration von Silverlight und XNA Framework vereinfacht.

Figure 3 Meine Silverlight StartGameLoop-Methode simuliert eine XNA Framework-Spieleschleife

// Constructor
public MainPage()
{
  InitializeComponent();
   StartGameLoop();
}
private void StartGameLoop()
{
  // Timer to simulate the XNA game loop (SoundEffect
  // class is from the XNA Framework).
  GameTimer gameTimer = new GameTimer();
  gameTimer.UpdateInterval = TimeSpan.FromMilliseconds(33);
  // Call FrameworkDispatcher.Update to update the XNA Framework internals.
  gameTimer.Update += delegate { try { FrameworkDispatcher.Update(); } catch { } };
  // Start the GameTimer running.
  gameTimer.Start();
  // Prime the pump or you'll get an exception
  // on the first XNA Framework call.
  FrameworkDispatcher.Update();
}

Nach Implementierung dieser Timerschleife können Sie XNA Framework-APIs auch an anderer Stelle in Ihrer von „PhoneApplicationPage“ abgeleiteten Klasse aufrufen.

Marketplace-Zertifizierung

Wenn eine Anwendung die Klasse „MediaHistory“ oder „MediaHistoryItem“ aufruft, wird sie als Music + Videos-Hubanwendung betrachtet und in der Apps-Liste angezeigt (wenn auf dem Telefon installiert). Der Einreichungsprozess erkennt, dass die Anwendung diese Klasse verwendet, und aktualisiert den Hubtyp in der Windows Phone-Anwendungsmanifestdatei automatisch in „Musik + Videos“.

Damit Ihre App im Marketplace akzeptiert wird, müssen mehrere Zertifizierungsanforderungen erfüllt werden. Zum Zeitpunkt der Verfassung dieses Artikels waren diese Voraussetzungen in den Abschnitten 6.4 und 6.5 der Anforderungen der Anwendungszertifizierung für Windows Phone unter bit.ly/kN6N7Z dokumentiert. Änderungen der Zertifizierungsanforderungen sind vorbehalten. Die Anforderungen werden zudem regelmäßig aktualisiert, weshalb Sie darauf achten sollten, sich mit dem jeweils aktuellen Stand der folgenden Anleitungen vertraut zu machen.

Die Zertifizierungsanforderungen sehen beispielsweise vor, dass die Musik, die ein Benutzer beim Starten Ihrer App gerade abgespielt, nicht unterbrochen wird. Dies ist sinnvoll, da ein Benutzer vielleicht gerade seine Lieblingsmusik hört, während er beispielsweise ein Spiel spielt. Dieses besondere Szenario wird in den Abschnitten 6.5.1 und 6.5.2 behandelt.

Außerdem interessant ist Abschnitt 6.5.3, in dem Folgendes angegeben ist:

Eine Anwendung kann einen gerade auf dem Telefon abgespielten Musiktitel unterbrechen, um ein nicht interaktives Video im Vollbildmodus oder ein nicht interaktives Audiosegment (z. B. eine Zwischensequenz oder einen Medienclip) wiederzugeben, ohne die Zustimmung des Benutzers einzuholen.

Eine Anwendung muss die Wiedergabe des zuvor abgespielten Musiktitels fortsetzen, sobald die Anwendung geschlossen wird.

Wie halten Sie also die Musik des Benutzers an und starten sie dann erneut? Wenn Sie eine Silverlight-App erstellen, müssen Sie wie zuvor erläutert die simulierte Spieleschleife einrichten.

Ich habe versucht, die aktuelle Audiowiedergabe anzuhalten, meinen Soundeffekt abzuspielen und sofort die vorher abgespielte Audiodatei neu zu starten. Dadurch wurde das Benutzererlebnis jedoch ziemlich beeinträchtigt und die Wirkung des Soundeffekts, den ich abspielen wollte, eher abgeschwächt. So habe ich die aktuelle Audiowiedergabe schließlich angehalten, als der Benutzer auf meine Seite navigiert war, und dann erneut gestartet, als er die Seite verlassen hat. Dazu habe ich die Methoden „OnNavigatedTo“ und „OnNavigatedFrom“ überschrieben. In diesen überschriebenen Methoden rufe ich Hilfsfunktionen zum Anhalten und Neustarten der Audiowiedergabe auf, wie in Abbildung 4 zu sehen.

Abbildung 4 Überschreiben der Methoden „OnNavigatedTo“ und „OnNavigatedFrom“ zum Anhalten der Audiowiedergabe

protected override void OnNavigatedTo(NavigationEventArgs e)
{
  // If the MediaPlayer is already playing music,
  // pause it upon entering the app.
  PauseMediaPlayer();
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
  // If the MediaPlayer was already playing music,
  // resume playback as the user leaves the app.
  ResumeMediaPlayer();
}
private void PauseMediaPlayer()
{
  // See the MainPage Constructor earlier in the
  // article where the GameTimer object is created.
  // This enables the use of the XNA Framework MediaPlayer
  // class by pumping the XNA FrameworkDispatcher.
  // Pause the media player if it's already playing music.
  if (!MediaPlayer.GameHasControl)
  {
    MediaPlayer.Pause();
    resumeMediaPlayerAfterDone = true;
  }
}
private void ResumeMediaPlayer()
{
  // If music was playing, resume playback.
  if (resumeMediaPlayerAfterDone)
  {
    MediaPlayer.Resume();
  }
}

Problemloser Einsatz

Um es noch einmal kurz zusammenzufassen: Bei der Erstellung von Medienanwendungen für das Windows Phone-Betriebssystem müssen mehrere Dinge jenseits der einfachen Details beim Umgang mit den eigentlichen Medien beachtet werden.

Integrieren Sie Ihre Anwendung unbedingt in den Musik + Videos-Hub, damit sie das mittlerweile von allen Medien-Apps erwartete Benutzererlebnis bietet. Das bedeutet, die Kacheln „Verlauf“ oder „Neu“ mit Ihren Inhalten zu füllen und sicherzustellen, dass Ihr Programm in der Apps-Liste angezeigt wird.

Lesen Sie die Zertifizierungsanforderungen für Medien-Apps, die Ihnen dabei helfen, Ihre Anwendung schneller durch den Windows Phone Marketplace-Einreichungsprozess zu bringen.

Durch die Befolgung dieser Anleitungen stellen Sie sicher, dass Benutzer einen guten Einstieg in die Interaktion mit Ihrer App haben. Zudem erhöhen Sie die Sichtbarkeit Ihrer App und Ihrer Inhalte, indem Sie dafür sorgen, dass sie in den entsprechenden Bereichen im Musik + Videos-Hub angezeigt werden. Auf diese Weise ermöglichen Sie einen problemlosen Einsatz in Windows Phone.

Mark Hopkins ist leitende Redakteurin im Bereich Programmierung im Windows Phone Developer Documentation-Team. Er ist seit 1992 bei Microsoft beschäftigt und arbeitet an Produkten für Entwickler, einschließlich Support für Entwickler, Visual C++, MFC, Windows Platform SDK, Internet Explorer SDK, Tablet PC SDK, Surface SDK und Windows Phone SDK. Er ist außerdem Musiker und begeisterter Fan des Seattle Sounders FC.

Unser Dank gilt den folgenden technischen Experten für die Durchsicht dieses Artikels: Andrew Byrne, Kim Cameron, Robert Lyon, Nitya Ravi,Cheryl Simmons und Matt Stroshane