开发者社区> 杰克.陈> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能

简介: 原文:与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能 [源码下载] 与众不同 windows phone (40) - 8.
+关注继续查看
原文:与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能

[源码下载]


与众不同 windows phone (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能



作者:webabcd


介绍
与众不同 windows phone 8.0 之 媒体

  • 添加音乐到音乐中心,从音乐中心删除音乐
  • 与图片中心相关的新增功能
  • BackgroundAudioPlayer 的新增功能



示例
1、演示如何添加音乐到音乐中心,以及如何从音乐中心删除音乐
MusicMediaLibrary/MusicMediaLibrary.xaml

<phone:PhoneApplicationPage
    x:Class="Demo.Media.MusicMediaLibrary"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d"
    shell:SystemTray.IsVisible="True">

    <Grid Background="Transparent">
        <StackPanel Orientation="Vertical">

            <Button x:Name="btnAdd" Content="添加音乐到音乐中心" Click="btnAdd_Click" />

            <Button x:Name="btnDelete" Content="从音乐中心删除音乐" Click="btnDelete_Click" />

        </StackPanel>
    </Grid>

</phone:PhoneApplicationPage>

MusicMediaLibrary/MusicMediaLibrary.xaml.cs

/*
 * 演示如何添加音乐到音乐中心,以及如何从音乐中心删除音乐
 * 
 * 
 * 在 wp8 中新增了 Microsoft.Xna.Framework.Media.PhoneExtensions.MediaLibraryExtensions,其扩展了 MediaLibrary 类
 *     MediaLibrary.SaveSong(Uri filename, SongMetadata songMetadata, SaveSongOperation operation) - 保存音乐到音乐中心,返回 Song 对象
 *         Uri filename - 需要添加到音乐中心的音乐文件,必须在 IsolatedStorage 下
 *         SongMetadata songMetadata - 元数据
 *         SaveSongOperation operation - CopyToLibrary 拷贝音乐文件;MoveToLibrary 移动音乐文件
 *     MediaLibrary.Delete(Song song) - 根据 Song 对象从音乐中心删除数据
 * 
 * 
 * 注:
 * 1、需要在 manifest 中增加配置 <Capability Name="ID_CAP_MEDIALIB_AUDIO" />
 * 2、音乐文件只支持mp3和wma,且必须在 IsolatedStorage 下
 * 3、音乐的封面文件只支持jpg,且必须在 IsolatedStorage 下
 * 
 * 
 * 另:
 * 1、播放音乐或视频的话,需要在 manifest 中增加配置 <Capability Name="ID_CAP_MEDIALIB_PLAYBACK" />
 * 2、除了用 MediaElement 播放音乐外,还可以用 MediaPlayer(xna) 播放,参见:http://www.cnblogs.com/webabcd/archive/2011/07/11/2102713.html
 */

using System;
using System.Collections.Generic;
using System.Windows;
using Microsoft.Phone.Controls;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Media.PhoneExtensions;
using System.IO.IsolatedStorage;
using System.IO;
using Windows.Storage.Streams;
using Windows.Storage;
using System.Threading.Tasks;

namespace Demo.Media
{
    public partial class MusicMediaLibrary : PhoneApplicationPage
    {
        private Random _random = new Random();

        public MusicMediaLibrary()
        {
            InitializeComponent();
        }

        private async void btnAdd_Click(object sender, RoutedEventArgs e)
        {
            // 将相关文件复制到 ApplicationData 的 Local 目录下
            await CopyFileToApplicationData(new Uri("ms-appx:///Assets/Demo.mp3", UriKind.Absolute), "Demo.mp3");
            await CopyFileToApplicationData(new Uri("ms-appx:///Assets/Son.jpg", UriKind.Absolute), "Son.jpg");

            // 将相关文件复制到 IsolatedStorage 的根目录下
            // CopyFileToIsolatedStorage(new Uri("Assets/Demo.mp3", UriKind.Relative), "Demo.mp3");
            // CopyFileToIsolatedStorage(new Uri("Assets/Son.jpg", UriKind.Relative), "Son.jpg");

            // 需要添加到音乐中心的音乐文件仅支持mp3和wma,且必须在 ApplicationData 下,以下格式会先在 Local 目录下找,找不到再到 Local/IsolatedStorage 目录下找
            Uri musicUri = new Uri("Demo.mp3", UriKind.Relative);
            // 需要添加到音乐中心的音乐封面文件仅支持jpg,且必须在 ApplicationData 下,以下格式会先在 Local 目录下找,找不到再到 Local/IsolatedStorage 目录下找
            Uri picUri = new Uri("Son.jpg", UriKind.Relative);

            // 构造 SongMetadata 对象
            // 如果按以下内容设置 SongMetadata 对象,则音乐文件在音乐中心的保存路径为:webabcd/webabcd album/music xxxx.mp3
            SongMetadata sm = new SongMetadata();
            sm.AlbumName = "webabcd album";
            sm.ArtistName = "webabcd";
            sm.GenreName = "rock";
            sm.Name = "music " + _random.Next(1000, 10000).ToString();
            sm.ArtistBackgroundUri = picUri;
            sm.AlbumArtUri = picUri;
            sm.AlbumArtistBackgroundUri = picUri;

            MediaLibrary library = new MediaLibrary();

            try
            {
                // 添加音乐文件到音乐中心
                Song song = library.SaveSong(musicUri, sm, SaveSongOperation.CopyToLibrary);
            }
            catch (Exception ex)
            {
                // 如果文件已存在,则会抛出 System.InvalidOperationException 异常
                MessageBox.Show(ex.Message);
            }
        }

        private void btnDelete_Click(object sender, RoutedEventArgs e)
        {
            /*
             * MediaLibrary - 媒体库
             *     Songs - 返回音乐中心的 SongCollection
             *     Albums - 返回音乐中心的 AlbumCollection
             *     Artists - 返回音乐中心的 ArtistCollection
             *     Genres - 返回音乐中心的 GenreCollection
             *     Playlists - 返回音乐中心的 Playlists
             */

            MediaLibrary library = new MediaLibrary();

            // 通过 MediaLibrary 遍历音乐中心中的音乐文件
            foreach (Song song in library.Songs)
            {
                // 从音乐中心删除音乐文件
                if (song.Artist.Name == "webabcd")
                    library.Delete(song);
            }
        }


        // 将文件从 Package 复制到 IsolatedStorage 的根目录下
        private void CopyFileToIsolatedStorage(Uri sourceUri, string targetFileName)
        {
            IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication();
            using (Stream input = Application.GetResourceStream(sourceUri).Stream)
            {
                using (IsolatedStorageFileStream output = isf.CreateFile(targetFileName))
                {
                    byte[] readBuffer = new byte[4096];
                    int bytesRead = -1;

                    while ((bytesRead = input.Read(readBuffer, 0, readBuffer.Length)) > 0)
                    {
                        output.Write(readBuffer, 0, bytesRead);
                    }
                }
            }
        }

        // 将文件从 Package 复制到 ApplicationData 的 Local 目录下
        private async Task CopyFileToApplicationData(Uri sourceUri, string targetFileName)
        {
            StorageFolder applicationFolder = ApplicationData.Current.LocalFolder;

            StorageFile sourceFile = await StorageFile.GetFileFromApplicationUriAsync(sourceUri);
            await sourceFile.CopyAsync(applicationFolder, targetFileName, NameCollisionOption.ReplaceExisting);
        }
    }
}


2、演示与图片中心相关的新增功能
MusicMediaLibrary/PictureMediaLibrary.xaml

<phone:PhoneApplicationPage
    x:Class="Demo.Media.PictureMediaLibrary"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d"
    shell:SystemTray.IsVisible="True">

    <Grid Background="Transparent">
        <StackPanel Orientation="Vertical">

            <Image Name="img" Width="50" Height="50" />
            <Image Name="img2" Width="50" Height="50" Margin="0 10 0 0" />
            <Image Name="img3" Width="50" Height="50" Margin="0 10 0 0" />
            
            <Button x:Name="btnGet" Content="获取图片中心的图片的小缩略图和预览图" Click="btnGet_Click" />

            <Button x:Name="btnShare" Content="共享图片中心的指定的图片" Click="btnShare_Click"  />

        </StackPanel>
    </Grid>

</phone:PhoneApplicationPage>

MusicMediaLibrary/PictureMediaLibrary.xaml.cs

/*
 * 演示与图片中心相关的新增功能
 * 
 * 
 * 在 wp8 中新增了 Microsoft.Xna.Framework.Media.PhoneExtensions.MediaLibraryExtensions,其扩展了 MediaLibrary 类和 Picture 类
 *     Picture.GetPreviewImage() - 获取预览图(介于缩略图与原图之间)
 *     Picture.GetPath() - 获取文件路径,可以用于“共享”之类的场景,本例会介绍
 *     MediaLibrary.GetPathFromToken(fileToken) - 根据 token 获取媒体库文件的路径
 * 
 * 
 * 注:
 * 1、需要在 manifest 中增加配置 <Capability Name="ID_CAP_MEDIALIB_PHOTO" />
 * 2、在 wp8 中,保存在手机上的每个图片,系统都将为其自动创建两种缩略图:小缩略图和预览图
 */

using System.Linq;
using System.Windows;
using Microsoft.Phone.Controls;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Media.PhoneExtensions;
using Microsoft.Phone;
using Microsoft.Phone.Tasks;

namespace Demo.Media
{
    public partial class PictureMediaLibrary : PhoneApplicationPage
    {
        public PictureMediaLibrary()
        {
            InitializeComponent();
        }

        private void btnGet_Click(object sender, RoutedEventArgs e)
        {
            /*
             * MediaLibrary - 媒体库
             *     Pictures - 返回图片中心的全部图片
             *     SavedPictures - 返回图片中心的已保存图片
             *     RootPictureAlbum - 返回图片中心的所有根相册
             */

            MediaLibrary library = new MediaLibrary();

            if (library.Pictures.Count > 0)
            {
                // 获取图片中心的第一张图片
                Picture picture = library.Pictures.First();

                img.Source = PictureDecoder.DecodeJpeg(picture.GetImage()); // 获取原图
                img2.Source = PictureDecoder.DecodeJpeg(picture.GetThumbnail()); // 获取缩略图
                img3.Source = PictureDecoder.DecodeJpeg(picture.GetPreviewImage()); // 获取预览图
            }
        }

        private void btnShare_Click(object sender, RoutedEventArgs e)
        {
            MediaLibrary library = new MediaLibrary();

            if (library.Pictures.Count > 0)
            {
                Picture picture = library.Pictures.First();
                // 获取媒体文件路径
                string picturePath = picture.GetPath();

                // 由文件启动 app 时会传递过来文件的 token 值,用此方法可以根据 token 获取媒体库文件的路径
                // string picturePath = library.GetPathFromToken(fileToken);

                // 根据媒体文件路径共享之
                ShareMediaTask shareMediaTask = new ShareMediaTask();
                shareMediaTask.FilePath = picturePath;
                shareMediaTask.Show();
            }
        }
    }
}


3、演示后台音频播放的新增功能
MusicMediaLibrary/BackgroundAudio.xaml

<phone:PhoneApplicationPage
    x:Class="Demo.Media.BackgroundAudio"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d"
    shell:SystemTray.IsVisible="True">

    <Grid Background="Transparent">
        <StackPanel Orientation="Vertical">

            <TextBlock x:Name="lblMsg" TextWrapping="Wrap" Text="BackgroundAudioPlayer 的 PlayStateChanged 事件有了事件参数 PlayStateChangedEventArgs" />

        </StackPanel>
    </Grid>

</phone:PhoneApplicationPage>

MusicMediaLibrary/BackgroundAudio.xaml.cs

/*
 * 演示后台音频播放的新增功能
 * 
 * 
 * 注:
 * 关于后台音频播放参见:http://www.cnblogs.com/webabcd/archive/2012/07/23/2604457.html
 */

using System;
using Microsoft.Phone.Controls;
using Microsoft.Phone.BackgroundAudio;

namespace Demo.Media
{
    public partial class BackgroundAudio : PhoneApplicationPage
    {
        public BackgroundAudio()
        {
            InitializeComponent();

            // 播放状态发生改变时
            BackgroundAudioPlayer.Instance.PlayStateChanged += Instance_PlayStateChanged;
        }

        void Instance_PlayStateChanged(object sender, EventArgs e)
        {
            /*
             * 以下是新增功能
             */

            // 将事件参数参数对象转换为 PlayStateChangedEventArgs
            PlayStateChangedEventArgs newEventArgs = (PlayStateChangedEventArgs)e;

            // BackgroundAudioPlayer 的当前的 PlayerState
            PlayState currentPlayState = newEventArgs.CurrentPlayState;

            // BackgroundAudioPlayer 在进入当前 PlayerState 时的前一个 PlayerState(如果没有此中间状态则 IntermediatePlayState 等于 CurrentPlayState)
            PlayState intermediatePlayState = newEventArgs.IntermediatePlayState;  
        }
    }
}



OK
[源码下载]

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
[Windows Phone] 以多国语言做为开发前提 (2)
原文:[Windows Phone] 以多国语言做为开发前提 (2) ? 前言 在先前的文章 [Windows Phone 开发 - 以多国语言做为开发前提 (1)] 中说明了简单的多国语言范例,今天再补充两个常见的例子,讯息中包含变数和图片,方法一样是透过资源档的方式达成。
759 0
Windows Phone开发(33):路径之其它Geometry
原文: Windows Phone开发(33):路径之其它Geometry 上一节中,我们把最复杂的PathGeometry给干了,生剩下几个家伙就好办事了。
725 0
Windows Phone开发(39):漫谈关键帧动画上篇
原文: Windows Phone开发(39):漫谈关键帧动画上篇 尽管前面介绍的几种动画会让觉得很好玩了,但是,不知道你是否发现,在前面说到的一系列XXXAnimation中,都有一个共同点,那就是仅仅针对两个值的目标值之间产生动画,如果使用By,将在原值和加上By后的目标值之间进行动画处理;如果使用From,To,那就更好理解了,就是首尾两个值之间值的动画。
958 0
Windows Phone开发(41):漫谈关键帧动画之下篇
原文: Windows Phone开发(41):漫谈关键帧动画之下篇 也许大家已经发现,其实不管什么类型的动画,使用方法基本是一样的,不知道大家总结出规律了没有?当你找到规律之后,你会发现真的可以举一反六的,不骗你。
749 0
Windows Phone开发(45):推送通知大结局——Raw通知
原文: Windows Phone开发(45):推送通知大结局——Raw通知 为什么叫大结局呢?因为推送通知服务就只有三种,前面扯了两种,就剩下一种——Raw通知。
833 0
Windows Phone开发(25):启动器与选择器之WebBrowserTask
原文: Windows Phone开发(25):启动器与选择器之WebBrowserTask 从名字上就看出来,这个家伙就是打开浏览并浏览到指定页面。 它有两个用途完全一样的属性:Uri属性是System.Uri类型,这是新写进的属性; URL是字符串类型,但如果使用该属性,会发出警告“已过时”,所以建议使用前者。
847 0
Windows Phone开发(18):变形金刚第九季——变换
原文: Windows Phone开发(18):变形金刚第九季——变换 变换不是一个好理解的概念,不是吓你,它涉及很多有关代数,几何,以及线性代数的知识。怎么?被我的话吓怕了?不用怕,尽管我们未必能够理解这些概念,只要我们知道怎么使用它们就是了。
831 0
解读Windows Phone开发的六个关键模块
  今天给大家提供的是一系列的Windows Phone 7 开发的文章,包括提供试用版应用程序、返回键、全景视图、项目模板以及页面间的导航等。本节内容是Windows Phone 7开发之:提供试用版应用程序。
873 0
+关注
杰克.陈
一个安静的程序猿~
文章
问答
文章排行榜
最热
最新
相关电子书
更多
ECS运维指南之Windows系统诊断
立即下载
《云服务器运维之Windows篇》
立即下载
FIS Global Accelerating Digital Intelligence in FinTech
立即下载