注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

东东的博客

江南烟雨,同大家一起分享

 
 
 

日志

 
 

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

2011-04-06 15:37:34|  分类: android相关 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

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

Java代码  1.public ArrayListCursor(String[] columnNames, ArrayList<ArrayList<Object>> rows,String catagoryColumnNames ,Object catagory) {  
2.     int colCount = columnNames.length;  
3.     boolean foundID = false;  
4.     // Add an _id column if not in columnNames  
5.     for (int i = 0; i < colCount; ++i) {  
6.         if (columnNames[i].compareToIgnoreCase("_id") == 0) {  
7.             mColumnNames = columnNames;  
8.             foundID = true;  
9.             break;  
10.         }  
11.     }  
12. 
13.     if (!foundID) {  
14.         mColumnNames = new String[colCount + 1];  
15.         System.arraycopy(columnNames, 0, mColumnNames, 0, columnNames.length);  
16.         mColumnNames[colCount] = "_id";  
17.     }  
18. 
19.     int rowCount = rows.size();  
20.     mRows = new ArrayList<ArrayList<Object>>();  
21. 
22.     int index = -1;  
23.     for(int i = 0 ; i < columnNames.length ; i ++){  
24.        if(columnNames[i] ==catagoryColumnNames)  
25.            index = i;  
26.     }  
27.     if(index ==-1)  
28.try {  
29.    throw new Exception("invade column name");  
30.} catch (Exception e) {  
31.    e.printStackTrace();  
32.}  
33.     for (int i = 0; i < rowCount; ++i) {  
34.        if(!rows.get(i).get(index).equals(catagory))  
35.            continue;  
36.         mRows.add(rows.get(i));  
37.         if (!foundID) {  
38.             mRows.get(i).add(i);  
39.         }  
40.     }  
41. } 
   public ArrayListCursor(String[] columnNames, ArrayList<ArrayList<Object>> rows,String catagoryColumnNames ,Object catagory) {
        int colCount = columnNames.length;
        boolean foundID = false;
        // Add an _id column if not in columnNames
        for (int i = 0; i < colCount; ++i) {
            if (columnNames[i].compareToIgnoreCase("_id") == 0) {
                mColumnNames = columnNames;
                foundID = true;
                break;
            }
        }

        if (!foundID) {
            mColumnNames = new String[colCount + 1];
            System.arraycopy(columnNames, 0, mColumnNames, 0, columnNames.length);
            mColumnNames[colCount] = "_id";
        }

        int rowCount = rows.size();
        mRows = new ArrayList<ArrayList<Object>>();

        int index = -1;
        for(int i = 0 ; i < columnNames.length ; i ++){
         if(columnNames[i] ==catagoryColumnNames)
          index = i;
        }
        if(index ==-1)
   try {
    throw new Exception("invade column name");
   } catch (Exception e) {
    e.printStackTrace();
   }
        for (int i = 0; i < rowCount; ++i) {
         if(!rows.get(i).get(index).equals(catagory))
          continue;
            mRows.add(rows.get(i));
            if (!foundID) {
                mRows.get(i).add(i);
            }
        }
    }     这里可以加入相应列的列名和其属性值,本来想直接对cursor进行内部属性的过滤,可是google了半天没搞懂怎么直接对包装生成的cursor进行操作。虽然FilterQueryProvider可以实现属性过滤,貌似该类是基于sql语句的从而其层次要低于cursor所在的层次。⊙﹏⊙b汗,搞了好久还是以悲剧结束。

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

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

Java代码  1.public static ArrayList<ArrayList<Object>>  parsertoArray() {  
2.    URL url;  
3.    try {  
4.        url = new URL("http://list.mp3.baidu.com/index.html");  
5.        String rex1 = "<div class=\"li\">(.*?<span>(.*?)</span>.*?)</div>";  
6.        String rex2 = ".*?<a.*?href=\"(.*?)\".*?>(.*?)</a>.*?";  
7.        ArrayList<ArrayList<Object>> result = Rex.match(url, rex1, rex2);  
8.        return result;  
9.    } catch (MalformedURLException e) {  
10.        // TODO Auto-generated catch block  
11.        e.printStackTrace();  
12.        return null;  
13.    }  
14.} 
 public static ArrayList<ArrayList<Object>>  parsertoArray() {
  URL url;
  try {
   url = new URL("http://list.mp3.baidu.com/index.html");
   String rex1 = "<div class=\"li\">(.*?<span>(.*?)</span>.*?)</div>";
   String rex2 = ".*?<a.*?href=\"(.*?)\".*?>(.*?)</a>.*?";
   ArrayList<ArrayList<Object>> result = Rex.match(url, rex1, rex2);
   return result;
  } catch (MalformedURLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   return null;
  }
 } 以上代码将歌手,音乐类别和歌曲抽取出来

Java代码  1.class CatagoryCursorAdapter extends SimpleCursorAdapter{  
2. 
3.    private int mCatagoryID;  
4.    public CatagoryCursorAdapter(Context context, int layout, Cursor c,  
5.            String[] from, int[] to,int catagoryID) {  
6.        super(context, layout, c, from, to);  
7.        String[] mCursorCols = new String[] { MediaStore.OnLine.ID,  
8.                MediaStore.OnLine.NAME, MediaStore.OnLine.URL ,MediaStore.OnLine.CATAGORY_ID,MediaStore.OnLine.CATAGORY_VALUE};  
9. 
10.        mCatagoryID = catagoryID;  
11.        ArrayListCursor currentCursor = new ArrayListCursor(mCursorCols, currentArray,MediaStore.OnLine.CATAGORY_ID,mCatagoryID);  
12.        changeCursor(currentCursor);  
13.    }  
14.} 
 class CatagoryCursorAdapter extends SimpleCursorAdapter{

  private int mCatagoryID;
  public CatagoryCursorAdapter(Context context, int layout, Cursor c,
    String[] from, int[] to,int catagoryID) {
   super(context, layout, c, from, to);
   String[] mCursorCols = new String[] { MediaStore.OnLine.ID,
     MediaStore.OnLine.NAME, MediaStore.OnLine.URL ,MediaStore.OnLine.CATAGORY_ID,MediaStore.OnLine.CATAGORY_VALUE};

   mCatagoryID = catagoryID;
   ArrayListCursor currentCursor = new ArrayListCursor(mCursorCols, currentArray,MediaStore.OnLine.CATAGORY_ID,mCatagoryID);
   changeCursor(currentCursor);
  }
 } 通过这个适配其将百度音乐页头的那部分按照android的布局显示出来,具体处理就不细说了。当用户点击一个分类是则显示该类别下的所有音乐,这个暂时未实行。不过点击一个歌手类别时显示该类别下所有歌手已经完成,代码如下

Java代码  1.private void initCursor() {  
2.    // 创建URL对象  
3.              //给定一个URL,例如<A href="http://list.mp3.baidu.com/top/top200.html">http://list.mp3.baidu.com/top/top200.html</A>  
4. 
5. 
6. 
7.    String rex = "<td><span>(.*?)\\.</span><a href=\"(.*?)\".*?>(.*?)</a></td>";  
8.    ArrayList<ArrayList<Object>> result = Rex.match(mOnlineURL, rex);  
9.    mCursorCols = new String[] { MediaStore.OnLine.ID,MediaStore.OnLine.RANK,  
10.            MediaStore.OnLine.URL, MediaStore.OnLine.NAME };  
11. 
12.    mTrackCursor = new ArrayListCursor(mCursorCols, result);  
13. 
14.} 
 private void initCursor() {
  // 创建URL对象
               //给定一个URL,例如http://list.mp3.baidu.com/top/top200.html

 

  String rex = "<td><span>(.*?)\\.</span><a href=\"(.*?)\".*?>(.*?)</a></td>";
  ArrayList<ArrayList<Object>> result = Rex.match(mOnlineURL, rex);
  mCursorCols = new String[] { MediaStore.OnLine.ID,MediaStore.OnLine.RANK,
    MediaStore.OnLine.URL, MediaStore.OnLine.NAME };

  mTrackCursor = new ArrayListCursor(mCursorCols, result);

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

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


转自:http://blog.csdn.net/bigapple88/archive/2011/03/29/6285430.aspx

  评论这张
 
阅读(1258)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017