Android流媒体开发之-直播自定义分类

1、Android流媒体开发之-直播实现

2、Android流媒体开发之-直播自定义列表

3、Android流媒体开发之-服务器图片的加载

4、Android流媒体开发之-直播自定义分类

5、Android流媒体开发之-获取直播节目预告-1

6、Android流媒体开发之-直播界面切换电视台频道



在开发直播的时候,节目源涉及到版权问题,所以软件通常会提供自定义功能,让用户自己添加,这样就与软件开发者没有关系了,当然如果用户添加很多自定义节目,会让用户看起来很乱,这会影响用户的使用心情,所以我们可以显示更QQ一样的分类存储用户的自定义的源,先看一下效果:







首先先定义布局界面和Item布局

customexpandablelistview.xml


  1. <?xml version="1.0" encoding="utf-8"?>  

  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  

  3.     android:id="@+id/expandParent"  

  4.     android:layout_width="match_parent"  

  5.     android:layout_height="match_parent"  

  6.     android:orientation="vertical" >  

  7.   

  8.     <ExpandableListView  

  9.         android:id="@+id/expandableListView"  

  10.         android:layout_width="match_parent"  

  11.         android:layout_height="wrap_content" >  

  12.     </ExpandableListView>  

  13.   

  14. </LinearLayout>  


custom_expanditem.xml



  1. <?xml version="1.0" encoding="utf-8"?>  

  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  

  3.     android:layout_width="match_parent"  

  4.     android:layout_height="match_parent"  

  5.     android:orientation="vertical" >  

  6.   

  7.     <TextView  

  8.         android:id="@+id/expand_name"  

  9.         android:layout_width="match_parent"  

  10.         android:layout_height="wrap_content"   

  11.         android:textSize="25sp"  

  12.         >  

  13.     </TextView>  

  14.   

  15. </LinearLayout>  


布局写好了后,我们在编写一个适配器
CustomExpandableAdapter.java


  1. package com.example.list;  

  2.   

  3. import java.util.List;  

  4.   

  5. import com.example.test.R;  

  6.   

  7. import android.app.Activity;  

  8. import android.view.Gravity;  

  9. import android.view.LayoutInflater;  

  10. import android.view.View;  

  11. import android.view.ViewGroup;  

  12. import android.widget.BaseExpandableListAdapter;  

  13. import android.widget.TextView;  

  14.   

  15. public class CustomExpandableAdapter extends BaseExpandableListAdapter{  

  16.   

  17.     private List<String> groupArray;  

  18.     private List<List<String[]>> childArray;  

  19.     private LayoutInflater mLayoutInflater;  

  20.     Activity activity;  

  21.     public CustomExpandableAdapter(Activity activity, List<String> groupArray, List<List<String[]>> childArray){  

  22.         this.activity = activity;  

  23.         this.groupArray = groupArray;  

  24.         this.childArray = childArray;  

  25.         mLayoutInflater = LayoutInflater.from(activity);  

  26.     }  

  27.     @Override  

  28.     public int getGroupCount() {  

  29.         if (groupArray != null) {  

  30.             return groupArray.size();  

  31.         }else {  

  32.             return 0;  

  33.         }  

  34.     }  

  35.   

  36.     @Override  

  37.     public int getChildrenCount(int groupPosition) {  

  38.         return childArray.get(groupPosition).size();  

  39.     }  

  40.   

  41.     @Override  

  42.     public Object getGroup(int groupPosition) {  

  43.         return groupArray.get(groupPosition);  

  44.     }  

  45.   

  46.     @Override  

  47.     public Object getChild(int groupPosition, int childPosition) {  

  48.         return childArray.get(groupPosition).get(childPosition)[0];  

  49.     }  

  50.   

  51.     @Override  

  52.     public long getGroupId(int groupPosition) {  

  53.         return groupPosition;  

  54.     }  

  55.   

  56.     @Override  

  57.     public long getChildId(int groupPosition, int childPosition) {  

  58.         return childPosition;  

  59.     }  

  60.   

  61.     @Override  

  62.     public boolean hasStableIds() {  

  63.         return false;  

  64.     }  

  65.   

  66.     @Override  

  67.     public View getGroupView(int groupPosition, boolean isExpanded,  

  68.             View convertView, ViewGroup parent) {  

  69.         ViewHolder viewHolder;  

  70.         if (convertView == null) {  

  71.             convertView = mLayoutInflater.inflate(R.layout.custom_expanditem, null);  

  72.             viewHolder = new ViewHolder();  

  73.             viewHolder.name = (TextView)convertView.findViewById(R.id.expand_name);  

  74.             viewHolder.name.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);  

  75.             viewHolder.name.setPadding(60 , 0 , 0 , 0 );  

  76.             convertView.setTag(viewHolder);  

  77.         }else {  

  78.             viewHolder = (ViewHolder)convertView.getTag();  

  79.         }  

  80.         viewHolder.name.setText(groupArray.get(groupPosition));  

  81.         return  convertView;   

  82.     }  

  83.   

  84.     @Override  

  85.     public View getChildView(int groupPosition, int childPosition,  

  86.             boolean isLastChild, View convertView, ViewGroup parent) {  

  87.         ViewHolder viewHolder;  

  88.         if (convertView == null) {  

  89.             convertView = mLayoutInflater.inflate(R.layout.custom_expanditem, null);  

  90.             viewHolder = new ViewHolder();  

  91.             viewHolder.name = (TextView)convertView.findViewById(R.id.expand_name);  

  92.             viewHolder.name.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);  

  93.             viewHolder.name.setPadding(60 , 0 , 0 , 0 );  

  94.             convertView.setTag(viewHolder);  

  95.         }else {  

  96.             viewHolder = (ViewHolder)convertView.getTag();  

  97.         }  

  98.         viewHolder.name.setText(childArray.get(groupPosition).get(childPosition)[0]);  

  99.         return  convertView;   

  100.     }  

  101.       

  102.     class ViewHolder{  

  103.         TextView name;  

  104.     }  

  105.   

  106.     @Override  

  107.     public boolean isChildSelectable(int groupPosition, int childPosition) {  

  108.         return true;  

  109.     }  

  110. }  

最后就是主界面功能了


  1. package com.example.list;  

  2.   

  3. import java.io.BufferedReader;  

  4. import java.io.File;  

  5. import java.io.FileInputStream;  

  6. import java.io.InputStream;  

  7. import java.io.InputStreamReader;  

  8. import java.util.ArrayList;  

  9. import java.util.List;  

  10.   

  11. import com.example.test.R;  

  12.   

  13. import android.app.Activity;  

  14. import android.os.Bundle;  

  15. import android.os.Environment;  

  16. import android.widget.ExpandableListView;  

  17. import android.widget.Toast;  

  18.   

  19. public class CustomExpand extends Activity{  

  20.   

  21.     private List<String> groupArray;  

  22.     private List<List<String[]>> childArray;  

  23.     CustomExpandableAdapter adapter;  

  24.       

  25.     ExpandableListView listView;  

  26.     @Override  

  27.     protected void onCreate(Bundle savedInstanceState) {  

  28.         super.onCreate(savedInstanceState);  

  29.         setContentView(R.layout.customexpandablelistview);  

  30.         groupArray = new ArrayList<String>();  

  31.         childArray = new ArrayList<List<String[]>>();  

  32.         ReadSelfChannel("tv.txt");  

  33.         listView = (ExpandableListView) findViewById(R.id.expandableListView);  

  34.         adapter = new CustomExpandableAdapter(this, groupArray, childArray);  

  35.         listView.setAdapter(adapter);  

  36.     }  

  37.       

  38.     public void ReadSelfChannel(String filename){  

  39.         String path = null;  

  40.         File file = null;  

  41.         boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);  

  42.         if (sdCardExist) {  

  43.             path = Environment.getExternalStorageDirectory()+"/"+filename;  

  44.             file = new File(path);  

  45.             if (!file.exists()) {  

  46.                 Toast.makeText(this"请检查文件是否存在", Toast.LENGTH_LONG).show();  

  47.                 return;  

  48.             }  

  49.         }else {  

  50.             Toast.makeText(this"请检查SD卡是否存在", Toast.LENGTH_LONG).show();  

  51.             return;  

  52.         }  

  53.         try {  

  54.             InputStream inStream = new FileInputStream(file);  

  55.             if (inStream != null) {  

  56.                 InputStreamReader inputreader = new InputStreamReader(inStream);  

  57.                  BufferedReader buffreader = new BufferedReader(inputreader);  

  58.                  String line;  

  59.                  String[] splitArray;  

  60.                  int lastGroup = 0;  

  61.                  while (( line = buffreader.readLine()) != null) {  

  62.                      splitArray = line.split(",");  

  63.                      if (splitArray != null && splitArray.length == 3) {  

  64.                          lastGroup = groupArray.size() - 1;  

  65.                          if (lastGroup == -1) {  

  66.                              lastGroup = 0;  

  67.                              groupArray.add(splitArray[0]);  

  68.                         }else if (groupArray.get(lastGroup).equals(splitArray[0])) {  

  69.                             //首先检测最后一个类型  

  70.                         }else {  

  71.                             lastGroup = CheckGroupName(splitArray[0]);  

  72.                             if (lastGroup == -1) {  

  73.                                 groupArray.add(splitArray[0]);  

  74.                                 lastGroup = groupArray.size() - 1;  

  75.                             }  

  76.                         }  

  77.                          String[] tempArray = new String[2];  

  78.                          tempArray[0] = splitArray[1];  

  79.                          tempArray[1] = splitArray[2];  

  80.                          List<String[]> temlist;  

  81.                          int size = childArray.size();  

  82.                          if (size == 0 || (size -1) < lastGroup) {  

  83.                              temlist = new ArrayList<String[]>();  

  84.                         }else {  

  85.                              temlist = childArray.get(lastGroup);  

  86.                              childArray.remove(lastGroup);  

  87.                         }  

  88.                          temlist.add(tempArray);  

  89.                          childArray.add(lastGroup, temlist);  

  90.                     }     

  91.                 }  

  92.                  buffreader.close();  

  93.             }  

  94.         } catch (Exception e) {  

  95.             e.printStackTrace();  

  96.         }  

  97.     }  

  98.       

  99.     public int CheckGroupName(String name){  

  100.         int count = groupArray.size();  

  101.         for (int i = 0; i < count; i++) {  

  102.             if (name.equals(groupArray.get(i))) {  

  103.                 return i;  

  104.             }  

  105.         }  

  106.         return -1;  

  107.     }  

  108. }  


源的格式如下:


  1. 央视,CCTV综合,http://live.gslb.letv.com/gslb?stream_id=cctv1&tag=live&ext=m3u8&sign=live_tv  

  2. 央视,CCTV经济,http://live.gslb.letv.com/gslb?stream_id=cctv2&tag=live&ext=m3u8&sign=live_tv    

  3. 央视,CCTV文艺,http://live.gslb.letv.com/gslb?stream_id=cctv3&tag=live&ext=m3u8&sign=live_tv   

  4. 央视,CCTV国际,http://live.gslb.letv.com/gslb?stream_id=cctv4&tag=live&ext=m3u8&sign=live_tv  

  5. 央视,CCTV体育,http://live.gslb.letv.com/gslb?stream_id=cctv5_800&tag=live&ext=m3u8&sign=live_tv   

  6. 央视,CCTV电影,http://live.gslb.letv.com/gslb?stream_id=cctv6&tag=live&ext=m3u8&sign=live_tv                  

  7. 央视,CCTV农业军事,http://live.gslb.letv.com/gslb?stream_id=cctv7&tag=live&ext=m3u8&sign=live_tv   

  8. 卫视,河南卫视,http://live.gslb.letv.com/gslb?stream_id=henan&tag=live&ext=m3u8&sign=live_tv  

  9. 卫视,东南卫视,http://live.gslb.letv.com/gslb?stream_id=dongnan&tag=live&ext=m3u8&sign=live_tv  

  10. 卫视,东方卫视,http://live.gslb.letv.com/gslb?stream_id=dongfang&tag=live&ext=m3u8&sign=live_tv  

  11. 卫视,北京卫视,http://live.gslb.letv.com/gslb?stream_id=bjws&tag=live&ext=m3u8&sign=live_tv              

  12. 卫视,江苏卫视,http://live.gslb.letv.com/gslb?stream_id=jiangsu&tag=live&ext=m3u8&sign=live_tv         

  13. 卫视,辽宁卫视,http://live.gslb.letv.com/gslb?stream_id=liaoning&tag=live&ext=m3u8&sign=live_tv        

  14. 卫视,陕西卫视,http://live.gslb.letv.com/gslb?stream_id=shanxi1&tag=live&ext=m3u8&sign=live_tv  

  15. 卫视,江西卫视,http://live.gslb.letv.com/gslb?stream_id=jiangxi&tag=live&ext=m3u8&sign=live_tv  

  16. 卫视,甘肃卫视,http://live.gslb.letv.com/gslb?stream_id=gansu&tag=live&ext=m3u8&sign=live_tv            

  17. 卫视,河北卫视,http://live.gslb.letv.com/gslb?stream_id=hebei&tag=live&ext=m3u8&sign=live_tv         

  18. 乐视,乐视电影,http://live.gslb.letv.com/gslb?stream_id=letv_movie_800&tag=live&ext=m3u8&sign=live_tv  

  19. 乐视,乐视电视剧,http://live.gslb.letv.com/gslb?stream_id=letv_tv_800&tag=live&ext=m3u8&sign=live_tv  

  20. 乐视,乐视动漫,http://live.gslb.letv.com/gslb?stream_id=letv_comic_800&tag=live&ext=m3u8&sign=live_tv  

  21. 乐视,乐视体育,http://live.gslb.letv.com/gslb?stream_id=letv_sports_800&tag=live&ext=m3u8&sign=live_tv  

  22. 乐视,乐视1080p,http://live.gslb.letv.com/gslb?stream_id=letv_1080P_3000&tag=live&ext=m3u8&sign=live_tv  

  23. 乐视,乐视文娱,http://live.gslb.letv.com/gslb?stream_id=letv_ent_800&tag=live&ext=m3u8&sign=live_tv  

  24. 乐视,乐视音乐,http://live.gslb.letv.com/gslb?stream_id=letv_music_800&tag=live&ext=m3u8&sign=live_tv      

  25. 其他,翡翠音乐台,rtsp://69.197.154.238/tvbm.kmj  

  26. 其他,高清舞乐台,rtsp://69.197.154.238/dance  

  27. 其他,台湾民族乐,rtsp://69.197.154.238/twmusic  

  28. 其他,星音乐频道,rtsp://69.197.154.238/stars  

  29. 其他,DVMC经典乐,rtsp://69.197.154.238/dvmc  

  30. 其他,欧美性感乐,rtsp://69.197.154.238/6mtv.sexy.  

  31. 其他,好莱坞大片,rtsp://69.197.154.238/hlw.ueixeyfgecvyh  

  32. 其他,热门电影台,rtsp://69.197.154.238/max.awixeyfgecvydr  


这样就完成了,非常方便。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值