Android VideoView播放网络视频

1.这俩天研究了下Videoview播放网络视频。其中遇到一些问题,经过一番努力现在解决了,再此做一个笔记方面记录下。


2.废话不多说直接贴代码,结合代码把我遇到的一些问题说下。

主activity的xml代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
	<!--程序介绍说明  -->
    <TextView
        android:id="@+id/text"
        android:layout_alignParentTop="true"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello" />
    
    <VideoView
        android:layout_centerInParent="true" 
        android:id="@+id/vv_player"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
       />
    
    <SeekBar 
    
        android:layout_below="@id/vv_player"
        android:minHeight="10dp"
        android:maxHeight="10dp"
        android:id="@+id/sb_progress"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"/>
    
    <!--底部控件布局  -->
    <LinearLayout 
        android:layout_alignParentBottom="true"
        android:id="@+id/parent"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_weight="1">
        
		<Button 
	    	android:id="@+id/btn_load"
	    	android:layout_width="0dp"
	    	android:layout_height="wrap_content"
	    	android:layout_weight="1"
	    	android:text="@string/btn_load"/>
		
		<Button 
	    	android:id="@+id/btn_play"
	    	android:layout_width="0dp"
	    	android:layout_height="wrap_content"
	    	android:layout_weight="1"
	    	android:text="@string/btn_play"/>
		
		<Button 
	    	android:id="@+id/btn_pause"
	    	android:layout_width="0dp"
	    	android:layout_height="wrap_content"
	    	android:layout_weight="1"
	    	android:text="@string/btn_pause"/>
		
	</LinearLayout>
</RelativeLayout>


activity 代码:

package com.tvsr.bin;

import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnPreparedListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;

import android.os.Message;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.MediaController;
import android.widget.SeekBar;
import android.widget.Toast;
import android.widget.VideoView;

public class VideoViewDemoActivity extends Activity {
	/** Called when the activity is first created. */

	LinearLayout parent;
	private int widthvideo;
	private int heightvideo;
	private Button btn_load;
	private Button btn_play;
	private Button btn_pause;
	private SeekBar sb_progress;
	private VideoView vv_player;
	private boolean flag = true;
	Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			sb_progress.setProgress(msg.getData().getInt("current", 0) / 1000);
		};
	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		/*
		 * 获取屏幕长宽
		 */
		DisplayMetrics m = new DisplayMetrics();
		getWindowManager().getDefaultDisplay().getMetrics(m);
		widthvideo = m.widthPixels;
		heightvideo = m.heightPixels;

		loadView();
		addListener();
	}

	// 加载整个view视图
	public void loadView() {
		// 加载底部三个button控件
		parent = (LinearLayout) findViewById(R.id.parent);
		btn_load = (Button) findViewById(R.id.btn_load);
		btn_play = (Button) findViewById(R.id.btn_play);
		btn_pause = (Button) findViewById(R.id.btn_pause);
		// 加载进度条控件
		sb_progress = (SeekBar) findViewById(R.id.sb_progress);
		// 加载videoview控件
		vv_player = (VideoView) findViewById(R.id.vv_player);
	}

	// 所有控件事件监听
	public void addListener() {
		// load控件事件监听方法

		btn_load.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				// 设置服务器视频资源路径
				Uri uri = Uri.parse("http://192.168.23.1:8080/Test/video/ss.mp4");
				vv_player.setVideoURI(uri);
				// 设置本地视频资源路径
				// vv_player.setVideoPath("/sdcard/video/test.mp4");
				// vv_player.setMediaController(new
				// MediaController(VideoViewDemoActivity.this));
				// 设置焦点
				vv_player.requestFocus();
			}
		});
		// play控件事件监听方法
		btn_play.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				vv_player.start();
				sb_progress.setMax(vv_player.getDuration() / 1000);
				// 创建一个线程用于同步seekbar进度
				new Thread() {
					@Override
					public void run() {
						// TODO Auto-generated method stub
						super.run();
						while (flag) {
							Message msg = handler.obtainMessage();
							msg.getData().putInt("current", vv_player.getCurrentPosition());
							handler.sendMessage(msg);
							try {
								sleep(1000);
							} catch (Exception e) {
								// TODO: handle exception
							}
						}
					}
				}.start();
			}
		});

		vv_player.setOnPreparedListener(new OnPreparedListener() {

			public void onPrepared(MediaPlayer mp) {

			}
		});

		// pause控件事件监听方法
		btn_pause.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				// TODO Auto-generated method stub
				vv_player.pause();
			}
		});

	}

	

	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		
		
		Toast.makeText(VideoViewDemoActivity.this,""+this.getResources().getConfiguration().orientation, Toast.LENGTH_SHORT).show();
		
		
		if (this.getResources().getConfiguration().orientation ==Configuration.ORIENTATION_LANDSCAPE) {
			Toast.makeText(VideoViewDemoActivity.this, "7895462312355646", Toast.LENGTH_SHORT).show();
			for (int i = 0; i < parent.getChildCount(); i++) {
				parent.getChildAt(i).setVisibility(View.GONE);
			}
			
		}
		
		if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
			Toast.makeText(VideoViewDemoActivity.this, "11111111111111111111111111111111", Toast.LENGTH_SHORT).show();
			for (int i = 0; i < parent.getChildCount(); i++) {
				parent.getChildAt(i).setVisibility(View.VISIBLE);
			}
		}

		super.onConfigurationChanged(newConfig);
	}

}

现在结合代码说一些个人遇到的一些问题:


1.videoView使用:调用videoview.setVideoUrl(),传入一个url作为参数即可,然后videoview.start()方法就可以播放。"暂停“的方法:videoview.pause();  当想再次播放  直接调用videoview.start()就可以了。

2.videoView.getDuration(),获取播放视频的时间。注意这里返回的long类型。将long类型的数,转化成String 类型的时候。用如下代码:

DateFormat formatter = new SimpleDateFormat("mm:ss");
		return formatter.format(new Date(time));
这里假如时间大于1个小时候的时候,那个1小时检测不到,即使加了”hh:mm:ss“也不行,这个地方该注意。


3.videoView还可以获取当前的缓冲数,当前播放在那个时刻,还可以直接从某一个时间点播放。

videoview.getBufferPercentage()  获取缓冲时间。

videoview.getCurrentPosition() 获取当前的播放位置。

videoview.seekto() 从那一位置播放(快进就会用到这个)

当然还有一些 判断是否正在播放 等等那样的 方法。具体可以查看下API、


4.viedeoView全屏的问题:具体的可以看下这个人写的文章http://blog.csdn.net/mad1989/article/details/7756586,在这里我简单说下。

  android:configChanges="orientation|screenSize" 属性就是避免横竖屏切换的时候,保持原来的 数据,不重新加载。

其中有一点需要注意:不要再activity的配置文件中 指定原本的横竖屏状态,否则横竖屏转换会出问题,具体什么问题我也不知道,我这是在一篇博客上看到的。


5.onConfigurationChanged这个方法当配置改变的时候就会被调用。例如软键盘弹出/横竖屏转换  都会被调用。this.getResource.getConfiguration.orientation 获取当前的屏幕状态,这个值应该和Configuration类中的SCREEN_ORIENTATION_PORTRAIT相等,而不是ActivityInfo的SCREEN_ORIENTATION_PORTRAIT。


6.有人可能担心横屏的大小  是否能充满整个屏幕。

在这里我是这样处理的:当横屏的时候,我把除VideoView以外所有的view都设置成Gone,注意一个问题单纯的把LinearLayout设置成View.Gone状态没得用,必须要把里面的子view都设置成Gone,并且videoview的宽度要设置成fill_parent。因为不管是横屏还是竖屏 宽度都是fill_parent,至于高度因为设置的是wrap_content,所以测量的时候 父布局会把自己能给的最大值最为子view(也就是videoview)的高度。

当然你也可以获取屏幕的宽高,自己通过layoutparams来设置 这样也可以,博主试过。


基本就是这些问题了。我把我写的demo(基于eclipse)上传  再把github一位大神写的上传。感兴趣可以下载学习看下人家写的代码。


大牛的代码:http://download.csdn.net/detail/qq_25984015/9539779

我的这个demo:http://download.csdn.net/detail/qq_25984015/9539791


网络视屏的url,可能需要自己找一个更改下就可以了注意。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值