欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2022-07-03 18:42:01
  暑假来深圳实习终于有了点闲钱买了台hd7,一直就想抽空把pc上的豆瓣电台移动到windows phone上,但是总抽不出时间。国庆的时候放假7天,抽了3天的尝试了移植,初步能够实现...

 

暑假来深圳实习终于有了点闲钱买了台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("https://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("https://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都失败,所以直接打包放下载里了,有兴趣的同学可以去下载一下。有什么好的解决上面问题的方法也不吝赐教,谢谢。

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

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

 

摘自 博比的杂货间