豆瓣电台 for windows phone 7.5开发笔记

Tags: windowsphone

 

暑假来深圳实习终于有了点闲钱买了台HD7,一直就想抽空把PC上的豆瓣电台移动到Windows Phone上,但是总抽不出时间。国庆的时候放假7天,抽了3天的尝试了移植,初步能够实现大部分功能了。很欣慰的是之前的DoubanAPI只在网络通信部分改动了一些细节,几乎不费任何力气就移植到了WP7上。在开发期间,主要的瓶颈在于后台播放模块,也就是7.1 SDK里新增加的Background Audio Agent类,因此在这里总结一下。

Windows Phone 7.5的Background Audio Agent在我的理解非常类似于Win32窗体的消息回调函数。函数是由开发者自己设计的,但是却不能由开发者的程序调用。两部分代码属于不同的进程(静态类成员不能被共享访问),因为在两部分代码间共享数据就成了最大的问题。起初我是考虑使用独立存储进行通信,但是却不知道为什么总是会出现一边已经只保存了数据,但是另外一边读出来还是旧的数据的情况。后来考虑的方法是利用BackgroundAudioPlayer.Instance静态对象里的Tag属性在两部分代码间传递数据。BackgroundAudioPlayer.Instance是BackgroundAudio Service里最重要的一个对象,一个系统同时只能有一个BackgroundAudio的实例,如果两个应用的都使用了后台播放服务,后启动的就会把之前的一个覆盖掉。

关于Tag共享部分的代码如下

public static void ChangeTrackTag(int TagIndex, string NewTag)

{

    if (BackgroundAudioPlayer.Instance.Track == null)

    {

        BackgroundAudioPlayer.Instance.Track = new AudioTrack(

            new Uri("http://douban.fm"),

            "",

            "",

            "",

            null,

            "|||||",

            EnabledPlayerControls.Pause | EnabledPlayerControls.SkipNext

       );

    }

    

    string[] Tags = BackgroundAudioPlayer.Instance.Track.Tag.Split('|');

    Tags[TagIndex] = NewTag;

 

    for (int i = 0; i < Tags.Length - 1; ++i)

    {

        Tags[i] += "|";

    }

 

    AudioTrack at = BackgroundAudioPlayer.Instance.Track;

    BackgroundAudioPlayer.Instance.Track = new AudioTrack(

        new Uri("http://douban.fm"),

        at.Title,

        at.Artist,

        at.Album,

        at.AlbumArt,

        string.Concat(Tags),

        EnabledPlayerControls.Pause | EnabledPlayerControls.SkipNext

    );

    

}

 

public static string GetTrackTag(int TagIndex)

{

    if (BackgroundAudioPlayer.Instance.Track == null)

        return "";

    try

    {

        return BackgroundAudioPlayer.Instance.Track.Tag.Split('|')[TagIndex];

    }

    catch

    {

        return "";

    }

}

目前的代码里是利用这样的方法实现两部分代码数据交换,今天求教了一高人,回复说用MVVM可以完美解决这个问题。看来又要花时间看资料了,不过这段时间工作太忙,暂时不会再Update,像以前的Code一样烂尾算了。

本来打算把代码放到Google Code的平台上,但是貌似这几天GFW抽风,怎么Commit都失败,所以直接打包放下载里了,有兴趣的同学可以去下载一下。有什么好的解决上面问题的方法也不吝赐教,谢谢。

之是之前发在智机网上的版本:http://www.wpxap.com/thread-173201-1-1.html

Google Code:http://code.google.com/p/lemanz-douban-radio/downloads/detail?name=Douban_wp.7z&can=2&q=#makechanges

 

摘自 博比的杂货间

本文链接:http://www.4byte.cn/learning/96891.html