我有一个解决方案,其中包括2个项目:main progect和PlayListFilePlayBackAgent。
在主项目中,在MainPage中有一个listBox,它显示不同的内容。有些内容有audioformat,当我在列表框的项目中看到标题和表演者时 - 我点击此列表框项目中的“播放”按钮。此按钮进行一些操作(从某些服务器获取跟踪的URL),然后转到页面AudioPage。在AudioPage中,某些方法从这些网址创建播放列表,而不是以xml格式(序列化)保存在isolatedStorage中。 这是PlayList.cs
public class Playlist
{
public Playlist()
{
Tracks = new List<PlaylistTrack>();
}
[XmlElement(ElementName = "Track")]
public List<PlaylistTrack> Tracks { set; get; }
[XmlElement(ElementName = "TrackCount")]
public int TrackCount { set; get; }
public static Playlist Load(string filename)
{
Playlist playlist = null;
using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
{
using (IsolatedStorageFileStream stream = storage.OpenFile(filename, FileMode.Open))
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Playlist));
playlist = xmlSerializer.Deserialize(stream) as Playlist;
}
}
return playlist;
}
public void Save(string filename)
{
using (IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication())
{
using (IsolatedStorageFileStream stream = storage.CreateFile(filename))
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Playlist));
xmlSerializer.Serialize(stream, this);
}
}
}
}
PlayBackAgent比将此xml反序列化为播放列表并播放它。
这一切都很好,但是当我想听那些不在列表框项目中的曲目我有问题。
我回到我的列表框,而不是选择一些轨道和按钮“播放”。在按钮处理程序中,我.Clear();
我的收藏,获取新曲目的新网址,转到AudioPage并制作新的播放列表。但在模拟器中,我看到之前听过的音乐相同。我认为问题在于PlayListFilePlayBackAgent不会从isolatedStorade更新播放列表。但是,当我点击不同的按钮“播放” - 字段TrackCount更改(不介意它的名称,它只是说播放列表中必须播放播放器的轨道数),我可以在写入Debug.WriteLine(Convert.ToString(playlist.TrackCount));
时在输出中看到它AudioPlayer.cs
。所以我拥有:一个音频播放器,它只播放我给他的第一个播放列表中的音乐。当我想要收听另一个播放列表时 - 在AudioPage中,我看到旧的播放列表并且只能从那些旧的播放列表中收听音乐。我想要的是:当我按下“播放”按钮时,每次都可以更改播放列表的音频播放器,并且可以播放此音乐。
PS:我使用PlayListFilePlayBackAgent,因为它可以播放音乐,即使我关闭此应用程序。如果您需要更多代码 - 请告诉我。感谢。
更新: 按钮处理程序
private void Audio_Button_Click(object sender, RoutedEventArgs e)
{
string uri = null;
TextBox tb = null;
var grid = (Grid)((Button)sender).Parent;
foreach (var child in grid.Children)
{
if (child is TextBox && (string)((TextBox)child).Tag == "URL")
{
tb = (TextBox)child;
}
}
uri = tb.Text;
BackgroundAudioPlayer.Instance.SkipNext();
//MessageBox.Show(uri);
string url = string.Format("https://api.vk.com/method/audio.getById.xml?audios={0}&access_token={1}", uri, App.AccessToken);
var c = new WebClient();
c.OpenReadCompleted += (sender1, e1) =>
{
XDocument xml = XDocument.Load(e1.Result);
MessageBox.Show(xml.ToString());
var inf = from u in xml.Descendants("audio")
select u;
AudioPage.audios.Clear();
foreach (var item in inf)
{
AudioPage.audios.Add(new AudioAttachment((string)item.Element("url"), (string)item.Element("title"), (string)item.Element("artist")));
}
string destination = string.Format("/AudioPage.xaml");
NavigationService.Navigate(new Uri(destination, UriKind.Relative));
AudioPage.count = 0;
};
c.OpenReadAsync(new Uri(url));
}
OnUseraction.cs
protected override void OnUserAction(BackgroundAudioPlayer player, AudioTrack track, UserAction action, object param)
{
switch (action)
{
case UserAction.Play:
if (player.Track == null)
{
// Load playlist from isolated storage
if (playlist == null)
playlist = Playlist.Load("playlist.xml");
// Debug.WriteLine(playlist.Tracks[0].Title);
Debug.WriteLine(Convert.ToString(playlist.TrackCount));
currentTrack = playlist.TrackCount;
player.Track = playlist.Tracks[currentTrack].ToAudioTrack();
}
else
{
player.Play();
}
break;
case UserAction.Pause:
player.Pause();
break;
case UserAction.SkipNext:
if (currentTrack < playlist.Tracks.Count - 1)
{
currentTrack += 1;
player.Track = playlist.Tracks[currentTrack].ToAudioTrack();
}
else
{
player.Track = null;
}
break;
case UserAction.SkipPrevious:
if (currentTrack > 0)
{
currentTrack -= 1;
player.Track = playlist.Tracks[currentTrack].ToAudioTrack();
}
else
{
player.Track = null;
}
break;
case UserAction.Seek:
player.Position = (TimeSpan)param;
break;
}
NotifyComplete();
}
答案 0 :(得分:0)
如果您在UI中更改了播放列表,则需要某种方式向代理发送信号,告知它需要更改播放内容,否则它将继续播放当前曲目。
当用户点击播放按钮时,请从您的应用中调用BackgroundAudioPlayer.Instance.SkipNext
,当您在代理商代码中获得OnUserAction
事件时,您将能够重新检查播放列表XML文件。
答案 1 :(得分:0)
if (playlist == null)
playlist = Playlist.Load("playlist.xml");
您在哪里将播放列表设置为Null?
男人,我感受到你的痛苦。我有完全相同的情况,并使用完全相同的方法(除了我使用IsolatedStorageSettings.ApplicationSettings集合而不是写入文件)。
它适用于第一轮。
行为真的很奇怪..我在前台应用程序上看到了数据更新,但是从播放器中读取相同的设置不会给我新的数据。我也尝试使用新的设置键(如果BAP缓存结果或其他东西),但我得到一些不稳定的结果,它将工作2-5更新,然后只是停止在集合中看到新的设置键。让我疯狂......
我还注意到音轨的Tag属性似乎被正确复制了,所以我尝试序列化我的播放列表并通过标签作为字符串值传递,但是得到了一些内存不足或其他的错误。看起来他们有自己的限制。
如果您对这个问题感到满意,请告诉我。
答案 2 :(得分:0)
也许是有关在Windows Phone上播放音频的最详细信息之一。在此处查看项目http://developer.nokia.com/community/wiki/Streaming_MP3_player_in_WP7。
但是我必须说,在我的情况下,我必须加载数据库并通过循环遍历列表而不使用JSON来提取信息。以下是代码;
private void LoadPlayListFromIsolatedStorage(BackgroundAudioPlayer player)
{
// clear previous playlist
_playList.Clear();
// access to isolated storage
IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication();
using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream("AlbumsData.dat", FileMode.OpenOrCreate, isoStore))
{
if (stream.Length > 0)
{
DataContractSerializer serializer = new DataContractSerializer(typeof(List<Album>));
List<Album> strm = serializer.ReadObject(stream) as List<Album>;
List<Song> _songs = strm[0].Songs;
for (int i = 0; i < _songs.Count; i++)
{
AudioTrack audioTrack = new AudioTrack(
new Uri(_songs[i].Directory, UriKind.Absolute), // URL
_songs[i].Title, // MP3 Music Title
"Artist", // MP3 Music Artist
"Album", // MP3 Music Album name
new Uri(_songs[i].AlbumArt, UriKind.Absolute) // MP3 Music Artwork URL
);
_playList.Add(audioTrack);
}
}
else
{
// no AudioTracks from Isolated Storage
}
// start playing
PlayTrack(player);
}