Android视频播放器缓冲时流量显示的实现方式

来源:互联网 发布:linux增大分区 编辑:程序博客网 时间:2024/05/17 23:46
最近做项目时,要用到视频播放器,做好以后发现,在播放网络视频是不能像其它软件一样如(PPTV、QQLIVE)等,在视频缓冲的时候显示视频缓冲的大小(kb/s)。上网找了很多好像没有类似的方法。比如:
videoview的getBufferPercentage:这个方法是获取视频加载的百分比,但是不能转换为KB/S,而且视频已经播放出来了才能出发这个事件,一般用来设置seekBar。
MediaPlayer的setOnBufferingUpdateListener:和getBufferPercentage方法一样。
也有人说可以用MediaPlayer.MediaPlayer:这个方法中的MEDIA_INFO_DOWNLOAD_RATE_CHANGED来监听下载速度。但是我找了半天也没有,我用的是ANDROID2.2.
都不行,然后我就想到了流量监控,不是就能知道在视频缓冲的时候用了多少流量了嘛。
所有就找到了TrafficStats这个类,用getUidRxBytes这个方法来查找我这个程序使用的流量。这个方法需要传递一个UID(进程ID)
下面是通过程序包名来转换UID的方法
  1. public long getUidRxBytes(){ //获取总的接受字节数,包含Mobile和WiFi等
  2.              PackageManager pm = getPackageManager();
  3.          ApplicationInfo ai = null;
  4.                 try {
  5.                         ai = pm.getApplicationInfo("cn.wangan.bnaction", PackageManager.GET_ACTIVITIES);
  6.                 } catch (NameNotFoundException e1) {
  7.                         // TODO Auto-generated catch block
  8.                         e1.printStackTrace();
  9.                 }
  10.             return TrafficStats.getUidRxBytes(ai.uid)==TrafficStats.UNSUPPORTED?0:(TrafficStats.getTotalRxBytes()/1024);
  11.             }
复制代码
本身TrafficStats.getUidRxBytes查找出来的是小b,所以要除以1024来转换为KB。
但是这个方法统计的流量是从开机一直到关机的流量,不能实现我所想达到的“显示视频加载速度”的要求。
于是我想到了倒计时的原理,我们能不能让他每一秒都运行一次,用上一秒的流量减去下一秒的流量不就能知道每一秒视频缓冲的大小了吗!
  1. timer = new Timer();
  2.                 timer.schedule(task, 1000,1000);
复制代码
  1. TimerTask task = new TimerTask() {
  2.         
  3.         @Override
  4.         public void run() {
  5.                 new_KB = getUidRxBytes() - old_KB;
  6.                 old_KB=getUidRxBytes();
  7.             System.out.println("++++++++++++++++++++++++++++"+s_KB);
  8.             Message msg = new Message();
  9.                 msg.what = 0;
  10.                 msg.obj =new_KB;
  11.                 handler.sendMessage(msg);
  12.         }
  13.   };  
复制代码
实例化一个timer,在新建一个TimerTask处理我们的代码,timer.schedule(task, 1000,1000)就是在一秒之后执行TimerTask 中的代码,而且1秒循环一次。因为TimerTask 是一个异步线程,所以要新建一个Handler来获取这个值
  1. private Handler handler = new Handler(){
  2.                 @Override
  3.                 public void handleMessage(Message msg) {
  4.                                         switch(msg.what){
  5.                                         case 0 :
  6.                              s_KB =(Long) msg.obj;
  7.                              System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"+s_KB);
  8.                              progressBar.setMessage("视频加载中("+s_KB+"K/S)...");
  9.                                         break;
  10.                                         }
  11.                                 }
  12.                         };
复制代码
最后把这个值显示到progressBar中!
下面是效果图,显示的值和360手机卫士的流量浮框是一样的!


360手机助手截图01.png (123.27 KB, 下载次数: 6)

360手机助手截图01.png
转载:http://www.apkbus.com/android-123796-1-1.html
编辑
0 0
原创粉丝点击