メイン プロジェクトと PlayListFilePlayBackAgent の 2 つのプロジェクトを含むソリューションがあります。
メイン プロジェクトの MainPage には、さまざまなコンテンツを表示する listBox があります。一部のコンテンツにはオーディオ形式があり、リストボックスのアイテムにタイトルとパフォーマーが表示されたら、このリストボックスのアイテムの「再生」ボタンをクリックします。このボタンは、いくつかの操作を行い (サーバーからトラックの URL を取得)、AudioPage のページに移動します。AudioPage では、いくつかのメソッドがそれらの URL からプレイリストを作成し、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();
私のコレクションで、新しいトラックの新しい URL を取得し、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();
}