`

android播放器(music player)源码分析3(页面解析,ArrayListCursor)

 
阅读更多

一。首先介绍ArrayListCursor的使用,该类的可以将ArrayList包装为cursor,从而实现的游标适配器。这里重载了ArrayListCursor,生成一个可以包装自定义数据结构的游标。

Java代码
  1. publicArrayListCursor(String[]columnNames,ArrayList<ArrayList<Object>>rows,StringcatagoryColumnNames,Objectcatagory){
  2. intcolCount=columnNames.length;
  3. booleanfoundID=false;
  4. //Addan_idcolumnifnotincolumnNames
  5. for(inti=0;i<colCount;++i){
  6. if(columnNames[i].compareToIgnoreCase("_id")==0){
  7. mColumnNames=columnNames;
  8. foundID=true;
  9. break;
  10. }
  11. }
  12. if(!foundID){
  13. mColumnNames=newString[colCount+1];
  14. System.arraycopy(columnNames,0,mColumnNames,0,columnNames.length);
  15. mColumnNames[colCount]="_id";
  16. }
  17. introwCount=rows.size();
  18. mRows=newArrayList<ArrayList<Object>>();
  19. intindex=-1;
  20. for(inti=0;i<columnNames.length;i++){
  21. if(columnNames[i]==catagoryColumnNames)
  22. index=i;
  23. }
  24. if(index==-1)
  25. try{
  26. thrownewException("invadecolumnname");
  27. }catch(Exceptione){
  28. e.printStackTrace();
  29. }
  30. for(inti=0;i<rowCount;++i){
  31. if(!rows.get(i).get(index).equals(catagory))
  32. continue;
  33. mRows.add(rows.get(i));
  34. if(!foundID){
  35. mRows.get(i).add(i);
  36. }
  37. }
  38. }

这里可以加入相应列的列名和其属性值,本来想直接对cursor进行内部属性的过滤,可是google了半天没搞懂怎么直接对包装生成的cursor进行操作。虽然FilterQueryProvider可以实现属性过滤,貌似该类是基于sql语句的从而其层次要低于cursor所在的层次。⊙﹏⊙b汗,搞了好久还是以悲剧结束。

于是在没有别的办法,就自己重载了AbstractCursor类,在构造函数里面实现对属性的过滤。

二。页面解析。在原有的播放器源码上实现在线播放,第一步就是要解析得到所需的资源。首先对这源码表示崇拜一下,没想到内部源码写的真的很完美(就我个人而言),想实现在线播放比较容易,只需要将自己的一些逻辑加进去,该源码已经提供了完整的在线播放的功能。这里首先介绍下百度音乐的解析

Java代码
  1. publicstaticArrayList<ArrayList<Object>>parsertoArray(){
  2. URLurl;
  3. try{
  4. url=newURL("http://list.mp3.baidu.com/index.html");
  5. Stringrex1="<divclass=/"li/">(.*?<span>(.*?)</span>.*?)</div>";
  6. Stringrex2=".*?<a.*?href=/"(.*?)/".*?>(.*?)</a>.*?";
  7. ArrayList<ArrayList<Object>>result=Rex.match(url,rex1,rex2);
  8. returnresult;
  9. }catch(MalformedURLExceptione){
  10. //TODOAuto-generatedcatchblock
  11. e.printStackTrace();
  12. returnnull;
  13. }
  14. }

以上代码将歌手,音乐类别和歌曲抽取出来

Java代码
  1. classCatagoryCursorAdapterextendsSimpleCursorAdapter{
  2. privateintmCatagoryID;
  3. publicCatagoryCursorAdapter(Contextcontext,intlayout,Cursorc,
  4. String[]from,int[]to,intcatagoryID){
  5. super(context,layout,c,from,to);
  6. String[]mCursorCols=newString[]{MediaStore.OnLine.ID,
  7. MediaStore.OnLine.NAME,MediaStore.OnLine.URL,MediaStore.OnLine.CATAGORY_ID,MediaStore.OnLine.CATAGORY_VALUE};
  8. mCatagoryID=catagoryID;
  9. ArrayListCursorcurrentCursor=newArrayListCursor(mCursorCols,currentArray,MediaStore.OnLine.CATAGORY_ID,mCatagoryID);
  10. changeCursor(currentCursor);
  11. }
  12. }

通过这个适配其将百度音乐页头的那部分按照android的布局显示出来,具体处理就不细说了。当用户点击一个分类是则显示该类别下的所有音乐,这个暂时未实行。不过点击一个歌手类别时显示该类别下所有歌手已经完成,代码如下

Java代码
  1. privatevoidinitCursor(){
  2. //创建URL对象
  3. //给定一个URL,例如<Ahref="http://list.mp3.baidu.com/top/top200.html">http://list.mp3.baidu.com/top/top200.html</A>
  4. Stringrex="<td><span>(.*?)//.</span><ahref=/"(.*?)/".*?>(.*?)</a></td>";
  5. ArrayList<ArrayList<Object>>result=Rex.match(mOnlineURL,rex);
  6. mCursorCols=newString[]{MediaStore.OnLine.ID,MediaStore.OnLine.RANK,
  7. MediaStore.OnLine.URL,MediaStore.OnLine.NAME};
  8. mTrackCursor=newArrayListCursor(mCursorCols,result);
  9. }

这样播放在线音乐的资源大类已经基本都实现了,接下来就是歌曲资源的解析和播放。

转载于http://ishelf.javaeye.com/admin/blogs/733920

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics