none
Como abrir músicas salvas no celular/cartão sd em um aplicativo em C#? RRS feed

  • 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
    quinta-feira, 12 de novembro de 2015 15:42

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.




    sábado, 21 de novembro de 2015 15:55

Todas as Respostas

  • Olá Guilherme Cristino,

    Está saendo apontado também algum trecho de código ou esta mensagem de erro está completa?

    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.

    sexta-feira, 13 de novembro de 2015 11:42
  • Ola Marcos,

    esta mensagem de erro esta completa. Não aponta trechos do código.

    sábado, 14 de novembro de 2015 11:20
  • 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.

    quarta-feira, 18 de novembro de 2015 16:13
  • 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.




    sábado, 21 de novembro de 2015 15:55