Android VideoView播放网络视频
2016-06-03 09:00
393 查看
1.这俩天研究了下Videoview播放网络视频。其中遇到一些问题,经过一番努力现在解决了,再此做一个笔记方面记录下。
2.废话不多说直接贴代码,结合代码把我遇到的一些问题说下。
主activity的xml代码:
activity 代码:
现在结合代码说一些个人遇到的一些问题:
1.videoView使用:调用videoview.setVideoUrl(),传入一个url作为参数即可,然后videoview.start()方法就可以播放。"暂停“的方法:videoview.pause(); 当想再次播放 直接调用videoview.start()就可以了。
2.videoView.getDuration(),获取播放视频的时间。注意这里返回的long类型。将long类型的数,转化成String 类型的时候。用如下代码:
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,可能需要自己找一个更改下就可以了注意。
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,可能需要自己找一个更改下就可以了注意。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件