本来这次的作业应该是接着上次简单的播放器做的,然而我感觉上次的播放器有点难看,又想重新复习一下之前讲过的各种控件,就重新做了一个播放器,功能比上次多了两个,一个是在线播放,另一个是缓存,这两个功能说难不难,但说简单坑还是不少的,接下来我们慢慢说。
本次程序的代码:https://github.com/cui-jia-hua/singleMediaPlayer
布局
因为这次是重新实现的播放器,所以我想简单讲一下我的布局,之前我使用了NavigetionView,然而事实证明并不好看,所以这次我选择了SplitView,并且将打开文件与下载文件的按钮放在了flyout中,这就使得界面变得清爽了不少,同时左侧我使用的是ListView + ParallaxView,用来显示本地已经下载的文件。
参考博客:flyout菜单与事件https://blog.csdn.net/zmq570235977/article/details/50489330
在线播放功能
上次简单的实现了用户播放本地文件的功能,总体来说还是挺简单的,而这次的第一个在线播放功能也不算难,相信大家都能发现,这两段代码唯一不同就是文件路径,在线播放需要提供uri,并且Mediasource的方法需要改变一下,其他的只需要复制粘贴就好了。
下载媒体
本次任务的重点我觉得就在于将音频下载到本地上,对于这一任务我找了好久的资料,不过苦于c#本身博客较少,并且搜索的时候经常会和安卓混在一起,导致进度缓慢,最终通过官方文档与其他同学的博客找到一种方法
这个方法可以顺利的将媒体下载到用户的音乐文件夹下
同时,经过测试,无论下载的是音频还是视频,该代码均可以将其下载到本地并能够顺利播放。
参考:下载文件 https://docs.microsoft.com/zh-cn/windows/uwp/files/quickstart-managing-folders-in-the-music-pictures-and-videos-libraries#get-notified-of-changes-to-the-list-of-folders-in-a-library
https://docs.microsoft.com/en-us/uwp/api/windows.web.http.httpclient.getbufferasync#Windows_Web_Http_HttpClient_GetBufferAsync_Windows_Foundation_Uri_
播放
仅仅下载到本地是不够的,我觉得应该让这个播放器能够播放已经下载到本地的媒体文件,ListView显示出当前用户音乐文件夹下的所有文件,并通过用户点击来进行播放。这个功能听起来简单,但实现的时候我仍是飞了不少功夫,首先是需要再ListView上把当前用户音乐文件夹下的所有文件显示出来,通过动态创建ListViewItem的方法,我检查当前文件夹下的所有文件,并创建ListViewItem,将它们插入到ListView中。在每一次添加之前还需要清除,否则就会重复添加,清除当前ListView中所有元素的方式是这个:https://www.cnblogs.com/zchenjian/p/6244081.html
其次ListView的参考代码较少,不知道如何获取用户选择的选项。这一问题我是一点一点试出来的,程序如下
仅仅获取当前item的文本是不够的,我们还需要找到用户的音乐文件夹路径,在那个路径下找到用户选择的item,就可以顺利播放了。
参考文档:ItemClickEventArgs方法:https://msdn.microsoft.com/zh-tw/library/windows/apps/windows.ui.xaml.controls.itemclickeventargs.aspx