您的位置:首页 > 理论基础 > 计算机网络

Android VideoView播放网络视频

2016-06-03 09:00 393 查看
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,可能需要自己找一个更改下就可以了注意。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android 移动 视频 网络