APP开发流程实例讲解-儒释道网络电台八天开发全程-实现功能代码:播放控制

APP开发流程实例讲解-儒释道网络电台八天开发全程

实现功能代码:播放控制

APP开发流程实例讲解-儒释道网络电台八天开发全程

  1. 项目发起
  2. 功能和界面初步设定
  3. 在Android Studio中完成界面设计
  4. 实现功能代码:播放控制
  5. 优化排错:增强稳定性和添加异常处理
  6. 界面美化并进一步优化排错
  7. 百度云深度兼容测试并进一步优化排错
  8. 签名发布

获取播放地址

昨天的已经写了通过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截图

儒释道网络电台APP截图


儒释道网络电台APP截图


儒释道网络电台APP截图

如上所示,界面还是不太美观。这个在后天改进吧。如果谁能帮我设计更好的界面,那实在是太感谢了。

所有代码已经上传 

儒释道网络电台源码

https://code.csdn.net/do168/buddhismnetworkradio/tree/master


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值