`

android播放器(music player)源码分析4(StreamStarter,URLEncoder)

 
阅读更多
  1. 上一篇完成了百度MP3大类和小类的解析抽取,进一步需要进行歌曲资源抽取。例如抽取某个歌手的所有热歌,这里需要注意一点:url中如果包含有中文字符或者其他的一些特殊字符,例如空格,需要进行处理否则无法连接到网页(使用URLConnection)。比如http://mp3.baidu.com/singerlist/周杰伦.html 。这里使用了一下代码进行处理:
    Java代码
    1. try{
    2. mOnlineURL=mOnlineURL.replaceAll("/","_").replace(":","_");
    3. mOnlineURL=(URLEncoder.encode(mOnlineURL,"UTF-8").replace("___","://").replace("_","/"));
    4. returnmatch(newURL(mOnlineURL),rex,otherColums);
    5. }catch(MalformedURLExceptione){
    经过以上url的处理,给出歌手的正则表达式:
    Java代码
    1. Matchermatcher=Pattern
    2. .compile(
    3. "<ahref=/"#/"class=/"p/"onclick=/"returnplayAll//((//d*?)//)/">.*?</a>.*?target=/"_blank/">(.*?)</a>")
    4. .matcher(sb);
    得到如下的结果:
    Xml代码
    1. 14辑-美人啊bonamana完整版
    2. 2sorry,sorryposter
    3. 3the2ndasiatourconcertalbumsupersh
    4. 4the2ndasiatourconcertalbumsupersh
    5. 5the2ndasiatourconcertalbumsupersh
    6. 6the2ndasiatourconcertalbumsupersh
    7. 7supershow1stasiatouralbum
    8. 84辑-美人啊bonamana完整版
    9. 9美人啊bonamana
    这时只需两个参数(歌曲名和歌手)就可以通过百度给的api得到歌曲资源,见http://cloud21.javaeye.com/blog/611914中关于api的使用。
    Xml代码
    1. <result>
    2. <count>5</count>
    3. <url>
    4. <encode>
    5. http://zhangmenshiting.baidu.com/service/k2eZl25omWqWa5lnZpyZa2Jol5mZappuamtsZmtomWlfn6NndK6ap5WXcGyWZm5vYmplmW1ncGhqmGRlmJlsmpdkmGybnGpoaWqUZ5s2
    6. </encode>
    7. <decode>
    8. b5fc92b2e9f31fb316ded4c6999262b1.mp3?xcode=8a077182e81909f11cc5bf2e8ff3088a3f
    9. </decode>
    10. <type>8</type>
    11. <lrcid>915420</lrcid>
    12. </url>
    13. <url>
    14. <encode>http://bbs.snrx.net/mp3/mZenlaOdsK2WpZg0.mp3</encode>
    15. <decode>hetangyuese.mp3</decode>
    16. <type>1</type>
    17. <lrcid>915420</lrcid>
    18. </url>
    19. <url>
    20. <encode>
    21. http://file.qlteacher.com/upload/cz2010/medias/1008/06/YmdlZ2pubmlhMg$$.mp3
    22. </encode>
    23. <decode>152358710.mp3</decode>
    24. <type>1</type>
    25. <lrcid>915420</lrcid>
    26. </url>
    27. <url>
    28. <encode>http://www.yxdlc.com/music/ajI$.mp3</encode>
    29. <decode>9.mp3</decode>
    30. <type>1</type>
    31. <lrcid>915420</lrcid>
    32. </url>
    33. <url>
    34. <encode>http://lt.dd-99.com/mp3/lGhsbW5obWqTYzM$.mp3</encode>
    35. <decode>c6999262b1.mp3</decode>
    36. <type>1</type>
    37. <lrcid>915420</lrcid>
    38. </url>
    39. </result>
    得到这个xml档案后,使用以下程序进行解析并组合出一条url(每次只挑选第一个url作为歌曲资源,这里不是很合理,理想的挑选方法时ping出所有歌曲资源的响应速度并选择响应速度最快的歌曲资源作为最终资源)
    Java代码
    1. publicstaticStringparserToUrl(Stringname,Stringartist){
    2. Stringurl="";
    3. try{
    4. Stringorginurl=Parameter.MUSIC_PATH_REX.replace(
    5. "("+MediaStore.OnLine.NAME+")",URLEncoder.encode(name,"UTF-8")).replace(
    6. "("+MediaStore.OnLine.ARTIST+")",URLEncoder.encode(artist,"UTF-8"));
    7. Log.v(OnlineParser.class.getName(),orginurl);
    8. URLConnectionconnection=(newURL(orginurl)).openConnection();
    9. connection.setConnectTimeout(10000);
    10. connection.addRequestProperty("User-Agent","Chrome/5.0.37");
    11. connection.connect();
    12. InputStreamstr=connection.getInputStream();
    13. DocumentBuilderdocBuilder=DocumentBuilderFactory.newInstance()
    14. .newDocumentBuilder();
    15. Documentdoc=docBuilder.parse(str);
    16. NodeListnodelist=doc.getElementsByTagName("url");
    17. for(inti=0;i<nodelist.getLength();){
    18. NodeListchildren=nodelist.item(i).getChildNodes();
    19. Stringencode=children.item(0).getTextContent();
    20. Stringdecode=URLEncoder.encode(children.item(1).getTextContent(),"UTF-8");
    21. url=encode.substring(0,encode.lastIndexOf("/")+1)+decode;
    22. returnurl;
    23. }
    24. }catch(MalformedURLExceptione){
    25. e.printStackTrace();
    26. }catch(IOExceptione){
    27. e.printStackTrace();
    28. }catch(ParserConfigurationExceptione){
    29. e.printStackTrace();
    30. }catch(SAXExceptione){
    31. e.printStackTrace();
    32. }
    33. returnurl;
    34. }
    35. /////////
    36. publicclassParameter{
    37. publicstaticfinalStringMUSIC_PATH_REX="http://box.zhangmen.baidu.com/x?op=12&count=1&title=("+MediaStore.OnLine.NAME+")$$("+MediaStore.OnLine.ARTIST+")$$$$";
    38. }
  2. StreamStarter:android源码中的音乐播放器已经实现了在线播放的功能,该类就是StreamStarter。这里需要的注意的是当启动该activity时,要设置以下数据
    Java代码
    1. Uriuri=getIntent().getData();
    将歌曲的url资源植入次activity。

虽然实现了在线播放,可存在一个问题当离开播放界面后歌曲也自动停止播放,明明已经启动了后台的service......可能是未创建缓冲数据,在研究研究(待续)

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics