WindowsPhone 8 如何下载网络音频到独立存储空间中后台播放

       本文阐述如何在WindowsPhone 8 中下载网络音频,并保存到独立存储空间中。实现在无网络的情况下能够后台播放此音频文件。

直接进入主题:

1、新建解决方案:PlayIsolatedStorageMusicDemo。


2、在解决方案中添加一个“WindowPhone音频播放代理”项目:MyAudioPlaybackAgent


3、在项目“PlayIsolatedStorageMusicDemo”中添加对项目“MyAudioPlaybackAgent”的引用

解决方案资源管理器目录结构如图所示:

WindowsPhone 8 如何下载网络音频到独立存储空间中后台播放_第1张图片


4、在MainPage.xaml文件中进行简单布局,未下载完成前“移动”和“播放”按钮不可用;使用一个ProgressBar显示下载进度(由于只是个简单的

Demo,所以这里的XAML页面布局就简单一点),如图

WindowsPhone 8 如何下载网络音频到独立存储空间中后台播放_第2张图片


5、下载按钮添加DownLoad_Click事件:

private BackgroundTransferRequest _request;
        private string downloadPath;
        private void DownLoad_Click(object sender, RoutedEventArgs e)
        {
            // 传输的文件网络路径
            Uri requestUri;
            try
            {
                requestUri = new Uri(fileUrl.Text, UriKind.RelativeOrAbsolute);
            }
            catch
            {
                MessageBox.Show("文件地址不符合格式");
                return;
            }

            //设置文件下载地址
            downloadPath = string.Format("shared/transfers/{0}.mp3", Guid.NewGuid());

            //创建一个后台文件传输请求
            _request = new BackgroundTransferRequest(
                    requestUri)
            {
                Method = "GET",// 设置传输的方法为GET请求
                DownloadLocation = new Uri(downloadPath, UriKind.Relative),
                Tag = "something else",   //添加请求的Tag属性,Tag属性不能超过4000个字符
                TransferPreferences = TransferPreferences.AllowBattery
            };

            _request.TransferStatusChanged += _request_TransferStatusChanged;
            _request.TransferProgressChanged += _request_TransferProgressChanged;

            // 使用BackgroundTransferService添加文件传输请求
            try
            {
                BackgroundTransferService.Add(_request);
            }
            catch (Exception ex)
            {
                MessageBox.Show("无法添加请求:" + ex.Message);
            }
        }

其中:

void _request_TransferStatusChanged(object sender, BackgroundTransferEventArgs e)
        {
            if (e.Request.TransferStatus == TransferStatus.Completed)
            {
                if (e.Request.StatusCode == 200 || e.Request.StatusCode==206)
                {
                    btnMove.IsEnabled = true;
                    //to do something else
                }
            }
        }



	void _request_TransferProgressChanged(object sender, BackgroundTransferEventArgs e)
        {
            Bar.Value = _request.BytesReceived*100/_request.TotalBytesToReceive;
        }


6、给“移动”按钮添加事件:

string fileName;
        private void btnMove_Click(object sender, RoutedEventArgs e)
        {
            fileName = downloadPath.Split(new char[] { '/' }, StringSplitOptions.None)[2];
            using (var storage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                if (storage.FileExists(downloadPath))
                {
                    storage.MoveFile(downloadPath, fileName);
                    btnPlay.IsEnabled = true;
                }
            }
        }


7、给“播放”按钮添加事件:

private void btnPlay_Click(object sender, RoutedEventArgs e)
        {
            AudioTrack _audioTrack = new AudioTrack(new Uri(fileName, UriKind.Relative),"歌曲名", "艺术家", "专辑", null);
            BackgroundAudioPlayer.Instance.Track = _audioTrack;

            BackgroundAudioPlayer.Instance.Play();
        }


8、运行程序。输入音频文件下载地址,即可实现下载网络音频,并在后台播放下载完成的音频文件


9、一些说明:

  • BackgroundTransferRequest的下载地址必须下载到独立存储空间的“shared/transfers/”的文件夹下,但是此地址不能作为BackgroundAudioPlayer类的音频播放地址,一次需要将其移动位置后才能进行播放。
  • 记得对“WindowPhone音频播放代理”项目的引用,因为即使不引用也不会出现异常,导致无法播放音频。
  • Tip:可以使用 WindowsPhonePowerTools工具查看部署的App独立存储空间的目录结构和文件
  • MSDN上有更详细的关于“如何播放 Windows Phone 的后台音频”的说明文档,详见:http://msdn.microsoft.com/zh-cn/library/windowsphone/develop/hh202978(v=vs.105).aspx
  • 感谢雪松写的文章(Windows Phone Mango开发实践——后台音频)的借鉴,可惜是Mango的,不过多数内容对WP8还是一样的。
  • 第一次攥写这类开发博文,不足之处还请大家见谅。
  • 源码下载      

你可能感兴趣的:(windows,移动,phone,独立存储,后台音频)