Windows Phone

Criando aplicativos de mídia para Windows Phone

Mark Hopkins

 

O Windows Phone é uma excelente plataforma para consumir mídia. O media player interno e o Windows Phone Marketplace são minhas principais origens para material de escuta de música e para meus podcasts favoritos. Ouço na academia, no carro, no ônibus e até enquanto estou me preparando para meu dia. Adoro aplicativos de mídia que me ajudam a descobrir material que, de outra forma, eu não conheceria. Por exemplo, aprendo muito sobre novas músicas por meio do recurso interno Smart DJ, bem como por meio de vários outros aplicativos de música de streaming. Vários aplicativos permitem que eu acesse conteúdo de vídeo fornecido pelo YouTube e o Vimeo.

Se estiver interessado em criar aplicativos de mídia para Windows Phone, você precisará colocar várias peças no lugar para obter uma boa integração com o SO. Particularmente, você deverá ter certeza de que seu aplicativo participa e aparece no Hub Música+Vídeo.

Integrando-se com o Hub Música+Vídeo

Os “Hubs” fornecem um local conveniente para os usuários localizarem conteúdo. O Hub Música+Vídeo é o local aonde ir para obter mídia em um dispositivo baseado no Windows Phone. Você vai até lá não apenas para ver seu conteúdo, mas também porque ele fornece acesso instantâneo à mídia que é mais importante para você. Com base em uma pesquisa realizada pela equipe do Windows Phone, descobrimos que as coisas mais comuns que os usuários desejam fazer são:

  1. Continuar algo que estavam reproduzindo.
  2. Acessar o conteúdo que reproduzem mais frequentemente.
  3. Localizar conteúdo que acabaram de adicionar a seu telefone.

O Hub Música+Vídeo coloca o conteúdo nessas três categorias essenciais e, ao mesmo tempo, agrega aplicativos de música e a biblioteca de mídia local em uma única experiência. A Figura 1 mostra a exibição do panorama completo do Hub Música+Vídeo no Windows Phone.

The Music + Videos Hub on Windows Phone
Figura 1 O Hub Música+Vídeo no Windows Phone

Além de ser excelente para os usuários finais, o Hub Música+Vídeo fornece grande valor para seus aplicativos. Ele não exige nenhuma personalização proativa do usuário, e seu conteúdo é facilmente detectável. Se você tiver um aplicativo que forneça reprodução de conteúdo de música ou de vídeo, deverá integrá-lo com o Hub Música+Vídeo. Essa é uma parte importante da experiência do Windows Phone.

Há quatro pontos de integração dos quais seu aplicativo pode tirar proveito na experiência de música e vídeo:

  1. popular o bloco Now Playing.
  2. Adicionar itens às listas New e History.
  3. Determinar se seu aplicativo foi iniciado em um item de New ou de History.
  4. Integrar-se com a lista Apps.

Populando o bloco Now Playing

Esse bloco é o estado real mais proeminente no Hub Música+Vídeo, exibindo uma imagem relativamente grande de qualquer conteúdo que esteja pausado no momento ou que foi reproduzido pela última vez. Um toque nesse bloco continuará ou iniciará a reprodução do conteúdo exibido. Com a população dessa imagem você promove seu conteúdo e cria um ponto de entrada adicional em sua experiência de reprodução do aplicativo. Atualize o item Now Playing definindo a propriedade MediaHistory.Instance.NowPlaying, conforme mostrado no trecho de código a seguir (estou usando C# neste artigo):

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;

Adicionando itens de History

O conteúdo que foi reproduzido mais recentemente no telefone pode ser exibido em um bloco History chamando o método MediaHistory.Instance.WriteRecentPlay. Assim como o bloco Now Playing, os blocos History exibem imagens e podem ser tocados para iniciar a reprodução do conteúdo que contêm. A lista History é atualizada da seguinte maneira:

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);

Adicionando novos itens

Os blocos “New” funcionam da mesma maneira como os blocos History, mas exibem conteúdo adicionado recentemente ao telefone. Por exemplo, um bloco New promove um arquivo de música que acabou de ser adicionado ao telefone. No entanto, esses blocos também podem ser usados para coisas como estações de rádio ou listas de reprodução criados recentemente. A mesma ação de iniciar a reprodução com um toque no bloco se aplica aqui. O código a seguir demonstra como atualizar a lista New:

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);

Determinando como seu aplicativo foi iniciado

Os blocos New e History devem ser usados apenas para iniciar a reprodução e não devem ser usados como pontos de inicialização genéricos em seu aplicativo. Não haverá problema se seu aplicativo for iniciado e sua interface do usuário for exibida. O importante é que a música ou o vídeo devem se iniciados com um único toque para que a experiência seja eficiente e consistente.

Para determinar se seu aplicativo foi iniciado em um bloco History ou New, comece substituindo o método virtual OnNavigatedTo. As informações no NavigationContext são usadas para determinar a mídia associada ao item, neste caso, uma música da biblioteca de mídia do dispositivo. A reprodução da música é iniciada no manipulador de eventos Loaded da PhoneApplicationPage depois que o carregamento for concluído pela página. Para obter mais informações sobre isso, baixe o Exemplo de Hub Música+Vídeo na biblioteca MSDN no bit.ly/y0tEiX.

O código da Figura 2 mostra como determinar se o aplicativo foi iniciado em um item na lista History ou New.

Figura 2 Determinando se o aplicativo foi iniciado em um item na lista History ou New

// 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);
    }
  }
}

Integrando com a página Apps

Se seu aplicativo chama uma ou mais das APIs mencionadas anteriormente, ele aparecerá automaticamente na lista Apps do Hub, além de aparecer na lista de aplicativos principais. Isso facilita a localização e o acesso ao aplicativo e o faz parte da experiência de mídia principal. Essa integração automática ocorre quando o processo de envio e certificação do Hub App detecta que seu aplicativo chama as APIs MediaHistory e MediaHistoryItem e altera o manifesto do aplicativo para refletir que esse é um aplicativo de mídia definindo o atributo HubType. Você mesmo pode definir isso antes do envio, para fins de teste apenas, atualizando o elemento <App> no arquivo WMAppManifest.xml em seu projeto do Windows Phone:

<App  ... HubType="1">

Isso permitirá que seu programa apareça na lista Apps durante o teste. Observe que o processo de envio de AppHub substituirá esse arquivo antes da publicação baseado nas APIs que detecta que você está chamando em seu aplicativo.

Arquivos gráficos necessários

Como o Hub Música+Vídeo é centrado em conteúdo, a quantidade de espaço que cada aplicativo obtém é baseada no uso. Isso significa que quanto mais seu aplicativo é usado, mais proeminente será seu conteúdo. Para clientes que usam seu aplicativo regularmente, o Hub Música+Vídeo será preenchido com seu conteúdo, dando uma excelente oportunidade promocional a você.

Como esse Hub agrega conteúdo de muitas origens diferentes, é importante considerar o design visual do bloco, que diferenciará seu aplicativo dos outros. O que isso significa variará de acordo com seu aplicativo. Lembre-se de que, por exemplo, o usuário terá arte de álbum genérica mostrada nessa mesma lista de seus álbuns reais. Se você tiver uma estação de rádio que esteja reproduzindo uma música de um álbum, seu aplicativo de estação de rádio deverá exibir um bloco visualmente distinto da arte final da capa do álbum que seria exibida ao reproduzir a música na biblioteca de mídia. Considere o uso de blocos que mostrem sua marca e a arte final do conteúdo.

Os blocos exibidos no Hub Música+Vídeo devem estar em conformidade com as seguintes regras de iconografia:

  • Você deve incluir o título ou o logotipo de seu aplicativo em cada bloco.
  • O bloco Now Playing deve ter 358 x 358 pixels. O tamanho do arquivo deve ser de 75 KB ou menos.
  • Outros blocos devem ter 173 x 173 pixels.
  • A propriedade Title da classe MediaHistoryItem deve ser definida como texto que represente o conteúdo, como o nome de uma estação ou o título de um vídeo.

Para evitar confusão para os usuários, os blocos não devem conter arte de álbum, a menos que o álbum seja reproduzido quando o bloco for pressionado. Se seu aplicativo reproduzir um fluxo, o gráfico do bloco deverá descrever o fluxo que está sendo reproduzido. Embora esse não seja um requisito de certificação, essa é um prática recomendada.

Reproduzindo mídia

Ao reproduzir vídeo, a experiência será semelhante se você criar um aplicativo do XNA Framework ou do Silverlight. Em um aplicativo do XNA Framework, use a classe MediaPlayerLauncher, que inicia o media player do Windows Phone quando você chama MediaPlayerLauncher.Show. No Silverlight, use a API MediaElement, que permite mais personalização da experiência do usuário, como a aparência e o posicionamento dos controles, mas que no final usa o media player do Windows Phone para exibir o vídeo. Para áudio, a coisa se torna um pouco mais interessante.

MediaElement versus SoundEffect

Em um aplicativo do XNA Framework, use a classe SoundEffect (ou as classes SoundEffectInstance ou DynamicSoundEffectInstance relacionadas) para reproduzir áudio. Essas classes dão suporte apenas à reprodução de origens de áudio WAV. No entanto, você tem um controle maior sobre a reprodução e pode usar alguns recursos interessantes, como a habilidade de reproduzir até 16 sons de uma vez e misturá-los na saída.

Em um aplicativo Silverlight, você pode usar a classe MediaElement para reproduzir áudio além de vídeo. A classe MediaElement dá suporte à reprodução de WAV, WMA, MP3 e outras origens de áudio. Consulte o artigo Codecs de mídia com suporte para Windows Phone (bit.ly/aflZrb) para obter uma lista completa dos formatos de áudio que podem ser reproduzidos no Windows Phone. A classe MediaElement permite a reprodução de apenas um som de cada vez. Se outro som já estiver sendo reproduzido, a classe MediaElement o interromperá quando você iniciar a reprodução de um novo som.

Em um aplicativo Silverlight, você também poderá usar a classe SoundEffect para reproduzir áudio. Para usar uma API do XNA Framework em um aplicativo Silverlight, você precisará simular o Loop de jogo localizado em aplicativos do XNA Framework. Para fazer isso, eu normalmente crio um método chamado StartGameLoop para configurar um GameTimer. Chamo o método StartGameLoop do construtor de minha classe derivada PhoneApplicationPage (consulte a Figura 3). A GameTimer é uma nova classe disponível no SDK do Windows Phone 7.1 para facilitar a integração com o Silverlight e o XNA Framework.

Figura 3 Meu StartGameLoop do Silverlight simula um loop de jogo do XNA Framework

// 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();
}

Depois de implementar esse loop de timer, você poderá chamar as APIs do XNA Framework em outro lugar em sua classe derivada PhoneApplicationPage.

Certificação do Marketplace

Quando um aplicativo chama as classes MediaHistory ou MediaHistoryItem ele é considerado um aplicativo do Hub Music + Vídeos e aparecerá na lista Apps quando instalado no telefone. O processo de envio detecta que o aplicativo usa essas classes e atualiza automaticamente o tipo de hub para Música+Vídeo no arquivo de manifesto do aplicativo do Windows Phone.

Vários requisitos de certificação relativos à reprodução de mídia devem ser seguidos para que seu aplicativo seja aceito no Marketplace. No momento da redação deste artigo, esses requisitos estão documentados nas seções 6.4 e 6.5 do artigo Requisitos de certificação de aplicativos para Windows Phone no bit.ly/kN6N7Z. Os requisitos de certificação sempre estão sujeitos a alterações e são atualizados regularmente, portanto, para qualquer uma das orientações a seguir, verifique se você está usando a versão mais recente.

Os requisitos de certificação determinam que você não pode interromper a música que um usuário está reproduzindo quando seu aplicativo é iniciado. Isso faz sentido porque um usuário pode gostar de ouvir sua música favorita enquanto interage com um jogo, por exemplo. As seções 6.5.1 e 6.5.2 abordam esse cenário específico.

De interesse adicional é a seção 6.5.3, que declara que:

um aplicativo pode interromper a reprodução atual de música no telefone para reproduzir um vídeo de animação completa não interativo ou um segmento de áudio não interativo (por exemplo, corte de cena ou clipe de mídia) sem pedir permissão ao usuário.

Um aplicativo deve continuar a música que estava sendo reproduzida anteriormente, assim que o aplicativo for fechado.

Sendo assim, como pausar e reiniciar a música do usuário? Se estiver criando um aplicativo Silverlight, você precisará configurar o loop de jogo simulado, conforme detalhado anteriormente.

Eu tentei com uma pausa do áudio em reprodução no momento, reproduzindo meu efeito de som e reiniciando imediatamente o áudio que estava sendo reproduzido. Isso criou uma experiência de usuário dissonante e diminuiu realmente o impacto do efeito de som que eu desejava reproduzir. Portanto, acabei pausando o áudio em reprodução no momento em que o usuário navega para a minha página e reiniciando-o quando ele sai. Fiz isso substituindo os métodos OnNavigatedTo e OnNavigatedFrom. Dentro desses métodos de substituição, chamo funções auxiliares para pausar e reiniciar o áudio, conforme mostrado na Figura 4.

Figura 4 Substituindo OnNavigatedTo e OnNavigatedFrom para pausar o áudio

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();
  }
}

Seja um bom cidadão

Para recapitular, ao criar aplicativos de mídia para o SO Windows Phone há várias coisas a serem consideradas além dos detalhes de nível inferior de tratamento da mídia real.

Integre com o Hub Música+Vídeo para que seu aplicativo contribua com a experiência do usuário da maneira esperada pelos usuários em todos os aplicativos de mídia. Isso significa popular os blocos History e New com seu conteúdo e ter certeza de que seu programa apareça na lista Apps.

Leia e compreenda os requisitos de certificação referentes a aplicativos de mídia, para que seu aplicativo tenha mais probabilidade de ser aprovado no processo de envio ao Windows Phone Marketplace.

Seguindo essas diretrizes, você garantirá que os usuários tenham um bom ponto de partida sabendo como interagir com seu aplicativo. Você também aumentará a visibilidade de seu aplicativo e de seu conteúdo garantindo que eles apareçam nas áreas adequadas no Hub Música+Vídeo. E seu aplicativo será um "bom cidadão" no Windows Phone.

Mark Hopkins é escritor técnico de programação da equipe de Documentação para desenvolvedores do Windows Phone. Ele trabalha na Microsoft, desde 1992, com produtos focalizados em desenvolvedor, incluindo suporte para desenvolvedores e ao Visual C++, MFC, SDK da Plataforma Windows, SDK do Internet Explorer, SDK do Tablet PC, SDK do Surface e SDK do Windows Phone. Ele também é músico e devotado fã do Seattle Sounders FC.

Agradecemos aos seguintes especialistas técnicos pela revisão deste artigo: Andrew Byrne, Kim Cameron, Robert Lyon, Nitya Ravi, Cheryl Simmons e Matt Stroshane