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

在开发直播的时候,源涉及到版权问题,所以软件通常会提供自定义功能,让用户自己添加,这样就与软件开发者没有关系了,当然如果用户添加很多自定义节目,会让用户看起来很乱,这会影响用户的使用心情,所以我们可以显示更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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值