Usuário com melhor resposta
Como abrir músicas salvas no celular/cartão sd em um aplicativo em C#?

Pergunta
-
Ola Pessoal, desde já agradeço a ajuda de todos vocês.
Estou criando um app para Windows Phone 8.1 que utiliza o "FileOpenPicker" para o usuário escolher uma música. neste caso eu adicionei as seguintes Capabilities:
Music Library
Removable Storage
E também tive que adicionar em Declarations:
File Opem Picker
Depois de todas essas configurações e de pesquisar muito, aprendi a reproduzir uma música aberta pelo usuário com o seguinte código:
CoreApplicationView view; public MainPage() { this.InitializeComponent(); view = CoreApplication.GetCurrentView(); } private void btProcurar_Click(object sender, RoutedEventArgs e) {
FileOpenPicker AbrirMusica = new FileOpenPicker();AbrirMusica.ViewMode = PickerViewMode.List; AbrirMusica.SuggestedStartLocation = PickerLocationId.MusicLibrary; AbrirMusica.FileTypeFilter.Clear(); AbrirMusica.FileTypeFilter.Add(".mp3"); AbrirMusica.FileTypeFilter.Add(".wma"); AbrirMusica.FileTypeFilter.Add(".3gp"); abriu_a_musica = "Sim"; AbrirMusica.PickSingleFileAndContinue(); view.Activated += View_Activated; } public static FileOpenPickerContinuationEventArgs args;
private void View_Activated(CoreApplicationView sender, IActivatedEventArgs args1) { args = args1 as FileOpenPickerContinuationEventArgs; if (args != null) { try { var stream = await MainPage.args.Files[0].OpenAsync(FileAccessMode.Read); await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { MediaMusica.SetSource(stream, MainPage.args.Files[0].ContentType); textNomeMusica.Text = MainPage.args.Files[0].Name; textNomeMusica.Text = textNomeMusica.Text.Replace(".mp3", ""); textNomeMusica.Text = textNomeMusica.Text.Replace(".wma", ""); textNomeMusica.Text = textNomeMusica.Text.Replace(".3gp", ""); musicaPersonalizada = textNomeMusica.Text + "©" + MainPage.args.Files[0].Name + "©" + MainPage.args.Files[0].ContentType; AtualizarAbertas(); }); } catch { abriu_a_musica = "Não"; } } view.Activated -= View_Activated; }
Este código funcionou perfeitamente para abrir e música usando o "FileOpenPicker" e também para salvar a música aberta, ele salva a música na variável musicaPersonalizada.
Agora o único problema é para acessar novamente essa música que o usuário abriu, pois o app salva todas as músicas abertas em uma lista. esta variável "musicaPersonalizada" salva o nome da música, o local e também a extensão (.mp3, .wma).
Estou usando o seguinte código para reproduzir esta música que foi salva na variável musicaPersonalizada:
var textos = Convert.ToString(ApplicationData.Current.LocalSettings.Values["MusicaPersonalizada" + MainPage.personalizadaSelecionada]).Split('©'); try { StorageFolder biblioteca = KnownFolders.MusicLibrary; StorageFile musica = await biblioteca.GetFileAsync(textos[1]); var stream2 = await musica.OpenAsync(FileAccessMode.Read); await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { MediaMusica.SetSource(stream2, textos[2]); textNomeMusica.Text = textos[0]; musicaPersonalizada = textos[0] + "©" + textos[1]; }); } catch (Exception e) { mensagemImpossivelReproduzir(e.Message, textos[0], textos[1]); }
}
}
private async void mensagemImpossivelReproduzir(string motivo, string titulo, string caminho)
{
MessageDialog mensagem1 = new MessageDialog("Tem alguma coisa me impedindo de reproduzir\n" + caminho + "\nMotivo: " + motivo, "Não foi possivel reproduzir " + titulo);
await mensagem1.ShowAsync();
this.Frame.Navigate(typeof(MainPage));
}Configurei o app para me dar uma mensagem explicando por que não conseguiu reproduzir a música, pois quando o usuário abre a música funciona, mas quando o app abre usando as informações salvas em windows.storage aparece este erro:
"The system cannot find the file specified. (Exception from HRESULT: 0x80070002)"
Eu não entendo por que isso esta acontecendo, já pesquisei em todo lugar, mas não encontrei nenhuma resposta.
Novamente agradeço a todos pela ajuda.
- Editado Guilherme Cristino quinta-feira, 12 de novembro de 2015 15:46
- Editado Marcos SJ sexta-feira, 13 de novembro de 2015 11:39 Ortografia
Respostas
-
Depois de muita pesquisa consegui fazer da forma correta, ou pelo menos fazer funcionar, e a solução é bem simples.
Primeira coisa que eu fiz, como eu quero abrir apenas músicas, retirei a extensão (.3gp) esta extensão causa um grande bug em aparelhos com o Windows 10, pois ao invés de abrir um painel para que eu possa escolher onde quero procurar minha música, fazia o aparelho procurar as músicas diretamente do aplicativo de fotos. Um bug muito serio em dispositivos com o windows 10, já com o Windows Phone 8.1 esse bug não acontecia.
Depois disso realizei a seguinte mudança no código:
musicaPersonalizada = textNomeMusica.Text + "©" + MainPage.args.Files[0].Path + "©" + MainPage.args.Files[0].ContentType;
Ao invés de usar o nome do arquivo para que o aplicativo o procure na biblioteca de música eu salvei o Path(endereço completo do arquivo que foi aberto) para ter certeza que o app vai encontrar a música.
E mudei quase que completamente o código para acessar a música pelo Path:
StorageFile musica = await StorageFile.GetFileFromPathAsync(textos[1]); IRandomAccessStream musicStream = await musica.OpenReadAsync(); await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { MediaMusica.SetSource(musicStream, textos[2]); textNomeMusica.Text = textos[0]; musicaPersonalizada = textos[0] + "©" + textos[1]; });
Estou usando o StorageFile.GetFileFromPathAsync(); para fazer o app localizar música pelo Path que foi salvo na primeira vez que o usuário a abriu.
E por ultimo, mas não menos importante, usei o código IRandomAcessStream para poder fazer o app de fato abrir a música.
Espero que este meu problema e solução possa ajudar quem passou por isso também.
- Editado Guilherme Cristino sábado, 21 de novembro de 2015 15:57
- Marcado como Resposta Guilherme Cristino sábado, 21 de novembro de 2015 15:57
Todas as Respostas
-
Está saendo apontado também algum trecho de código ou esta mensagem de erro está completa?
Marcos Roberto de Souza Junior
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
-
-
Olá,
Por gentileza, verifique estas informações e faça uma ponte com o problema que você está enfrentando, talvez assim consiga resolvê-lo.
Atenciosamente
Marcos Roberto de Souza Junior
Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita
MSDN Community Support
Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.
-
Depois de muita pesquisa consegui fazer da forma correta, ou pelo menos fazer funcionar, e a solução é bem simples.
Primeira coisa que eu fiz, como eu quero abrir apenas músicas, retirei a extensão (.3gp) esta extensão causa um grande bug em aparelhos com o Windows 10, pois ao invés de abrir um painel para que eu possa escolher onde quero procurar minha música, fazia o aparelho procurar as músicas diretamente do aplicativo de fotos. Um bug muito serio em dispositivos com o windows 10, já com o Windows Phone 8.1 esse bug não acontecia.
Depois disso realizei a seguinte mudança no código:
musicaPersonalizada = textNomeMusica.Text + "©" + MainPage.args.Files[0].Path + "©" + MainPage.args.Files[0].ContentType;
Ao invés de usar o nome do arquivo para que o aplicativo o procure na biblioteca de música eu salvei o Path(endereço completo do arquivo que foi aberto) para ter certeza que o app vai encontrar a música.
E mudei quase que completamente o código para acessar a música pelo Path:
StorageFile musica = await StorageFile.GetFileFromPathAsync(textos[1]); IRandomAccessStream musicStream = await musica.OpenReadAsync(); await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { MediaMusica.SetSource(musicStream, textos[2]); textNomeMusica.Text = textos[0]; musicaPersonalizada = textos[0] + "©" + textos[1]; });
Estou usando o StorageFile.GetFileFromPathAsync(); para fazer o app localizar música pelo Path que foi salvo na primeira vez que o usuário a abriu.
E por ultimo, mas não menos importante, usei o código IRandomAcessStream para poder fazer o app de fato abrir a música.
Espero que este meu problema e solução possa ajudar quem passou por isso também.
- Editado Guilherme Cristino sábado, 21 de novembro de 2015 15:57
- Marcado como Resposta Guilherme Cristino sábado, 21 de novembro de 2015 15:57