流媒体开发之-直播自定义分类
可可工作室出品:
欢迎使用可可直播视频播放器:
http://pan.baidu.com/share/link?shareid=3291150676&uk=4111208708
在开发直播的时候,源涉及到版权问题,所以软件通常会提供自定义功能,让用户自己添加,这样就与软件开发者没有关系了,当然如果用户添加很多自定义节目,会让用户看起来很乱,这会影响用户的使用心情,所以我们可以显示更QQ一样的分类存储用户的自定义的源,先看一下效果:
首先先定义布局界面和Item布局
customexpandablelistview.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/expandParent" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ExpandableListView android:id="@+id/expandableListView" android:layout_width="match_parent" android:layout_height="wrap_content" > </ExpandableListView> </LinearLayout>
custom_expanditem.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/expand_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="25sp" > </TextView> </LinearLayout>
布局写好了后,我们在编写一个适配器
CustomExpandableAdapter.java
package com.example.list; import java.util.List; import com.example.test.R; import android.app.Activity; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseExpandableListAdapter; import android.widget.TextView; public class CustomExpandableAdapter extends BaseExpandableListAdapter{ private List<String> groupArray; private List<List<String[]>> childArray; private LayoutInflater mLayoutInflater; Activity activity; public CustomExpandableAdapter(Activity activity, List<String> groupArray, List<List<String[]>> childArray){ this.activity = activity; this.groupArray = groupArray; this.childArray = childArray; mLayoutInflater = LayoutInflater.from(activity); } @Override public int getGroupCount() { if (groupArray != null) { return groupArray.size(); }else { return 0; } } @Override public int getChildrenCount(int groupPosition) { return childArray.get(groupPosition).size(); } @Override public Object getGroup(int groupPosition) { return groupArray.get(groupPosition); } @Override public Object getChild(int groupPosition, int childPosition) { return childArray.get(groupPosition).get(childPosition)[0]; } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { convertView = mLayoutInflater.inflate(R.layout.custom_expanditem, null); viewHolder = new ViewHolder(); viewHolder.name = (TextView)convertView.findViewById(R.id.expand_name); viewHolder.name.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); viewHolder.name.setPadding(60 , 0 , 0 , 0 ); convertView.setTag(viewHolder); }else { viewHolder = (ViewHolder)convertView.getTag(); } viewHolder.name.setText(groupArray.get(groupPosition)); return convertView; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { ViewHolder viewHolder; if (convertView == null) { convertView = mLayoutInflater.inflate(R.layout.custom_expanditem, null); viewHolder = new ViewHolder(); viewHolder.name = (TextView)convertView.findViewById(R.id.expand_name); viewHolder.name.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); viewHolder.name.setPadding(60 , 0 , 0 , 0 ); convertView.setTag(viewHolder); }else { viewHolder = (ViewHolder)convertView.getTag(); } viewHolder.name.setText(childArray.get(groupPosition).get(childPosition)[0]); return convertView; } class ViewHolder{ TextView name; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } }
最后就是主界面功能了
package com.example.list; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import com.example.test.R; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.widget.ExpandableListView; import android.widget.Toast; public class CustomExpand extends Activity{ private List<String> groupArray; private List<List<String[]>> childArray; CustomExpandableAdapter adapter; ExpandableListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.customexpandablelistview); groupArray = new ArrayList<String>(); childArray = new ArrayList<List<String[]>>(); ReadSelfChannel("tv.txt"); listView = (ExpandableListView) findViewById(R.id.expandableListView); adapter = new CustomExpandableAdapter(this, groupArray, childArray); listView.setAdapter(adapter); } public void ReadSelfChannel(String filename){ String path = null; File file = null; boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); if (sdCardExist) { path = Environment.getExternalStorageDirectory()+"/"+filename; file = new File(path); if (!file.exists()) { Toast.makeText(this, "请检查文件是否存在", Toast.LENGTH_LONG).show(); return; } }else { Toast.makeText(this, "请检查SD卡是否存在", Toast.LENGTH_LONG).show(); return; } try { InputStream inStream = new FileInputStream(file); if (inStream != null) { InputStreamReader inputreader = new InputStreamReader(inStream); BufferedReader buffreader = new BufferedReader(inputreader); String line; String[] splitArray; int lastGroup = 0; while (( line = buffreader.readLine()) != null) { splitArray = line.split(","); if (splitArray != null && splitArray.length == 3) { lastGroup = groupArray.size() - 1; if (lastGroup == -1) { lastGroup = 0; groupArray.add(splitArray[0]); }else if (groupArray.get(lastGroup).equals(splitArray[0])) { //首先检测最后一个类型 }else { lastGroup = CheckGroupName(splitArray[0]); if (lastGroup == -1) { groupArray.add(splitArray[0]); lastGroup = groupArray.size() - 1; } } String[] tempArray = new String[2]; tempArray[0] = splitArray[1]; tempArray[1] = splitArray[2]; List<String[]> temlist; int size = childArray.size(); if (size == 0 || (size -1) < lastGroup) { temlist = new ArrayList<String[]>(); }else { temlist = childArray.get(lastGroup); childArray.remove(lastGroup); } temlist.add(tempArray); childArray.add(lastGroup, temlist); } } buffreader.close(); } } catch (Exception e) { e.printStackTrace(); } } public int CheckGroupName(String name){ int count = groupArray.size(); for (int i = 0; i < count; i++) { if (name.equals(groupArray.get(i))) { return i; } } return -1; } }
源的格式如下:
央视,CCTV综合,http://live.gslb.letv.com/gslb?stream_id=cctv1&tag=live&ext=m3u8&sign=live_tv 央视,CCTV经济,http://live.gslb.letv.com/gslb?stream_id=cctv2&tag=live&ext=m3u8&sign=live_tv 央视,CCTV文艺,http://live.gslb.letv.com/gslb?stream_id=cctv3&tag=live&ext=m3u8&sign=live_tv 央视,CCTV国际,http://live.gslb.letv.com/gslb?stream_id=cctv4&tag=live&ext=m3u8&sign=live_tv 央视,CCTV体育,http://live.gslb.letv.com/gslb?stream_id=cctv5_800&tag=live&ext=m3u8&sign=live_tv 央视,CCTV电影,http://live.gslb.letv.com/gslb?stream_id=cctv6&tag=live&ext=m3u8&sign=live_tv 央视,CCTV农业军事,http://live.gslb.letv.com/gslb?stream_id=cctv7&tag=live&ext=m3u8&sign=live_tv 卫视,河南卫视,http://live.gslb.letv.com/gslb?stream_id=henan&tag=live&ext=m3u8&sign=live_tv 卫视,东南卫视,http://live.gslb.letv.com/gslb?stream_id=dongnan&tag=live&ext=m3u8&sign=live_tv 卫视,东方卫视,http://live.gslb.letv.com/gslb?stream_id=dongfang&tag=live&ext=m3u8&sign=live_tv 卫视,北京卫视,http://live.gslb.letv.com/gslb?stream_id=bjws&tag=live&ext=m3u8&sign=live_tv 卫视,江苏卫视,http://live.gslb.letv.com/gslb?stream_id=jiangsu&tag=live&ext=m3u8&sign=live_tv 卫视,辽宁卫视,http://live.gslb.letv.com/gslb?stream_id=liaoning&tag=live&ext=m3u8&sign=live_tv 卫视,陕西卫视,http://live.gslb.letv.com/gslb?stream_id=shanxi1&tag=live&ext=m3u8&sign=live_tv 卫视,江西卫视,http://live.gslb.letv.com/gslb?stream_id=jiangxi&tag=live&ext=m3u8&sign=live_tv 卫视,甘肃卫视,http://live.gslb.letv.com/gslb?stream_id=gansu&tag=live&ext=m3u8&sign=live_tv 卫视,河北卫视,http://live.gslb.letv.com/gslb?stream_id=hebei&tag=live&ext=m3u8&sign=live_tv 乐视,乐视电影,http://live.gslb.letv.com/gslb?stream_id=letv_movie_800&tag=live&ext=m3u8&sign=live_tv 乐视,乐视电视剧,http://live.gslb.letv.com/gslb?stream_id=letv_tv_800&tag=live&ext=m3u8&sign=live_tv 乐视,乐视动漫,http://live.gslb.letv.com/gslb?stream_id=letv_comic_800&tag=live&ext=m3u8&sign=live_tv 乐视,乐视体育,http://live.gslb.letv.com/gslb?stream_id=letv_sports_800&tag=live&ext=m3u8&sign=live_tv 乐视,乐视1080p,http://live.gslb.letv.com/gslb?stream_id=letv_1080P_3000&tag=live&ext=m3u8&sign=live_tv 乐视,乐视文娱,http://live.gslb.letv.com/gslb?stream_id=letv_ent_800&tag=live&ext=m3u8&sign=live_tv 乐视,乐视音乐,http://live.gslb.letv.com/gslb?stream_id=letv_music_800&tag=live&ext=m3u8&sign=live_tv 其他,翡翠音乐台,rtsp://69.197.154.238/tvbm.kmj 其他,高清舞乐台,rtsp://69.197.154.238/dance 其他,台湾民族乐,rtsp://69.197.154.238/twmusic 其他,星音乐频道,rtsp://69.197.154.238/stars 其他,DVMC经典乐,rtsp://69.197.154.238/dvmc 其他,欧美性感乐,rtsp://69.197.154.238/6mtv.sexy. 其他,好莱坞大片,rtsp://69.197.154.238/hlw.ueixeyfgecvyh 其他,热门电影台,rtsp://69.197.154.238/max.awixeyfgecvydr
这样就完成了,非常方便。
欢迎使用可可直播视频播放器:
http://pan.baidu.com/share/link?shareid=3291150676&uk=4111208708