[源码下载]

与众不同 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(, ).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[];
int bytesRead = -; while ((bytesRead = input.Read(readBuffer, , readBuffer.Length)) > )
{
output.Write(readBuffer, , 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 > )
{
// 获取图片中心的第一张图片
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 > )
{
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 (40) - 8.0 媒体: 音乐中心的新增功能, 图片中心的新增功能, 后台音乐播放的新增功能的更多相关文章

  1. 与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展

    [源码下载] 与众不同 windows phone (43) - 8.0 相机和照片: 镜头的可扩展性, 图片的可扩展性, 图片的自动上传扩展 作者:webabcd 介绍与众不同 windows ph ...

  2. 与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成

    原文:与众不同 windows phone (14) - Media(媒体)之音频播放器, 视频播放器, 与 Windows Phone 的音乐和视频中心集成 [索引页][源码下载] 与众不同 win ...

  3. 与众不同 windows phone (16) - Media(媒体)之编辑图片, 保存图片到相册, 与图片的上下文菜单“应用程序...”和“共享...”关联, 与 Windows Phone 的图片中心集成

    原文:与众不同 windows phone (16) - Media(媒体)之编辑图片, 保存图片到相册, 与图片的上下文菜单"应用程序..."和"共享..." ...

  4. 与众不同 windows phone (35) - 8.0 新的启动器: ShareMediaTask, SaveAppointmentTask, MapsTask, MapsDirectionsTask, MapDownloaderTask

    [源码下载] 与众不同 windows phone (35) - 8.0 新的启动器: ShareMediaTask, SaveAppointmentTask, MapsTask, MapsDirec ...

  5. 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件

    [源码下载] 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件 作者:w ...

  6. 与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频

    [源码下载] 与众不同 windows phone (41) - 8.0 相机和照片: 通过 AudioVideoCaptureDevice 捕获视频和音频 作者:webabcd 介绍与众不同 win ...

  7. 与众不同 windows phone (15) - Media(媒体)之后台播放音频

    原文:与众不同 windows phone (15) - Media(媒体)之后台播放音频 [索引页][源码下载] 与众不同 windows phone (15) - Media(媒体)之后台播放音频 ...

  8. 与众不同 windows phone (34) - 8.0 新的控件: LongListSelector

    [源码下载] 与众不同 windows phone (34) - 8.0 新的控件: LongListSelector 作者:webabcd 介绍与众不同 windows phone 8.0 之 新的 ...

  9. 与众不同 windows phone (36) - 8.0 新的瓷贴: FlipTile, CycleTile, IconicTile

    [源码下载] 与众不同 windows phone (36) - 8.0 新的瓷贴: FlipTile, CycleTile, IconicTile 作者:webabcd 介绍与众不同 windows ...

随机推荐

  1. vmtool安装成功,但是hgfs下没有被挂接共享目录!

    vmtool安装成功,但是hgfs下没有被挂接共享目录! 2013-01-04 16:05:18|  分类: Linux|字号 订阅     1.使用vmtool 提供的命令——vmware-hgfs ...

  2. 命令行上的narrowing(随着输入逐步减少备选项)工具

    前面在介绍zsh的时候,说过它的补全用来起比bash的Tab补全方便多了,在有多个备选项是你只要用光标键来挑选就是了,而不是全列出来提示你再多输入几个字符.而Emacs的anything / helm ...

  3. 15.6.8-sql小技巧

    取月头月尾: declare @someDay datetime,@firstDay datetime,@endDay datetime set @someDay='2015.2.2' ,) ,) s ...

  4. Spring源码追踪3——AOP机制

    研究代码: spring配置文件 <cache:annotation-driven /> Java代码 @Cacheable(value = "test", key = ...

  5. 对C#对象的Shallow、Deep Cloning认识【转】

    好像园内比较多博客对 Shallow.Deep Cloning的翻译是深拷贝.浅拷贝,当时我懵了,这个叫法怎么怪怪的. 就好像看军情观察室,台湾评论员,导弹叫飞弹. 至于它们的区别,一张图就可以解释. ...

  6. Failure is not fatal, but failure to change might be.

    Failure is not fatal, but failure to change might be. 失败不是致命的,但无法改变却可能是致命的.

  7. java攻城师之路(Android篇)--搭建开发环境、拨打电话、发送短信、布局例子

    一.搭建开发环境 1.所需资源 JDK6以上 Eclipse3.6以上 SDK17, 2.3.3 ADT17 2.安装注意事项 不要使用中文路径 如果模拟器默认路径包含中文, 可以设置android_ ...

  8. 又是一个小正则replace

    var a = "http://www.xx.com?id=111&-deb"; var b = "http://www.xx.com?-deb&id=1 ...

  9. 当应用程序不是以 UserInteractive 模式运行时显示模式对话框或窗体是无效操作

    在Web程序中引用了WinForm的类库引起了 主要是为了在web程序中使用Message.Show()以及SaveFileDialog类,能web程序中引用了WinForm类库 在Visual St ...

  10. ASP.NET连接Oracle数据库的步骤详解(转)

    ASP.NET连接Oracle数据库的步骤详解   本文我们主要介绍了ASP.NET连接Oracle数据库的步骤及每个步骤需要进行的设置,希望能够对您有所帮助.   在用ASP.NET开发应用程序时, ...