您的位置:首页 > 其它

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

2013-08-23 19:37 288 查看
可可工作室出品:

欢迎使用可可直播视频播放器:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐