APP开发流程实例讲解-儒释道网络电台八天开发全程
实现功能代码:播放控制
APP开发流程实例讲解-儒释道网络电台八天开发全程
获取播放地址
昨天的已经写了通过OKHttp和正则表达式获取服务器地址。今天扩展ServersList类,在这个类内增加获取默认播放地址以及获取音频和视频的代码,如下
public Uri getSoundUriAuto(){
if(selectedServer==null)
selectedServer = getServerAuto();
Uri uri = Uri.parse("http://"+selectedServer.serverAddress+":1935/liveedgelist/_definst_/livetvaudio/playlist.m3u8");
return uri;
}
public Uri getVideoUriAuto(){
if(selectedServer==null)
selectedServer = getServerAuto();
Uri uri = Uri.parse("http://"+selectedServer.serverAddress+":1935/liveedgelist/_definst_/livetv/playlist.m3u8");
return uri;
}
数据中心类
为了方便管理数据,写了个简单的数据管理类DataCenter,代码如下
public class DataCenter {
public List<String> programs;
public List<String> news;
public ServersList servers;
public String note;
public boolean allSetValue(){
return programs!=null && news!=null && servers!=null && note!=null;
}
}
在onCreate中加入数据加载线程
//开启等待初始化动画
new Thread(new Runnable() {
@Override
public void run() {
while (!data.allSetValue()){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
runOnUiThread(new Runnable() {
@Override
public void run() {
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
View headerView = navigationView.getHeaderView(0);
ListView lv_programs = (ListView) headerView.findViewById(R.id.lv_programs);
lv_programs.setAdapter(new ProgramListAdapter(MainActivity.this,data));
ListView lv_news = (ListView) headerView.findViewById(R.id.lv_news);
lv_news.setAdapter(new NewsListAdapter(MainActivity.this,data));
NavigationView navigationViewR = (NavigationView) findViewById(R.id.right_nav_view);
View headerViewR = navigationViewR.getHeaderView(0);
ListView lv_servers = (ListView) headerViewR.findViewById(R.id.lv_servers);
lv_servers.setAdapter(new ServerListAdapter(MainActivity.this,data));
setListViewHeightBasedOnChildren(lv_programs);
setListViewHeightBasedOnChildren(lv_news);
setListViewHeightBasedOnChildren(lv_servers);
lv_servers.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
。。。。。。
}
});
}
});
}
}).start();
原本想添加个等待动画,今天没时间了,明天再加吧。
ListView定制Adapter
分别做了三个简单的类,贴一个吧
public class ServerListAdapter extends BaseAdapter {
DataCenter data;
private LayoutInflater mInflater;
public ServerListAdapter(Context context, DataCenter data){
this.data=data;
this.mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
return data.servers.servers.size();
}
@Override
public Object getItem(int i) {
return data.servers.servers.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View convertView, ViewGroup viewGroup) {
ServerInfo holder = data.servers.servers.get(i);
//观察convertView随ListView滚动情况
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item_servers, null);
}
convertView.setTag(holder);
TextView txt = (TextView) convertView.findViewById(R.id.txt);
txt.setText(holder.serverName);
return convertView;
}
}
播放控制
有三个地方需要用到播放控制。
- 开始和暂停播放
- 仅声音状态发生改变
- 更改了服务器地址
在不播放视频时,显示一个背景图片,不然太难看了。
现在的代码虽然工作了,但控制上还有些混乱,没有统一管理,这样在后后添加功能时会很麻烦。明天再弄一个统一管理的方法。下面贴一个状态改变时的播放控制代码
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
onlySound = b;
if(videoView.isPlaying())
videoView.pause();
if(onlySound) {
videoView.setVisibility(View.VISIBLE);
videoView.setBackgroundResource(R.drawable.zcgt);
videoView.setVideoURI(data.servers.getSoundUriAuto());
} else {
videoView.setBackgroundResource(0);
videoView.setVideoURI(data.servers.getVideoUriAuto());
}
videoView.start();
}
儒释道网络电台APP截图
如上所示,界面还是不太美观。这个在后天改进吧。如果谁能帮我设计更好的界面,那实在是太感谢了。
所有代码已经上传
https://code.csdn.net/do168/buddhismnetworkradio/tree/master