介绍个第三方:

JieCaoVideoPlayer

  实现Android的全屏视频播放,支持完全自定义UI、手势修改进度和音量、hls、rtsp,设置http头信息,也能在ListView、ViewPager和ListView、ViewPager和Fragment等多重嵌套模式下全屏工作,占用空间非常小,不到60k。

本次是通过 SurfaceView + MediaPlayer 实现 横屏 全屏 播放。

//注意修改:

WindowFeature下的:Window.FEATURE_NO_TITLE, Window.FEATURE_INDETERMINATE_PROGRESS

Fullscreen

AndroidManifest.xml下activity节点添加android:screenOrientation="landscape"

1)通过 AudioManager 控制视频声音。

2)通过getWindow().getAttributes().screenBrightness 获取当前亮度,通过继承SimpleOnGestureListener手势监听onScroll,onSingleTapUp事件,

重新生成

 WindowManager.LayoutParams lpa = getWindow().getAttributes();
if (lpa.screenBrightness > 1.0f)
lpa.screenBrightness = 1.0f;
else if (lpa.screenBrightness < 0.01f)
lpa.screenBrightness = 0.01f; getWindow().setAttributes(lpa);

3)activity oncreate 进行初始化 MediaPlayer, SurfaceView Holder

 if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
// 不维持自身缓冲区,直接显示
// this value only use Hardware decoder before Android 2.3
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB
&& mHardwareDecoder) {
sv_videoplayer.getHolder().setType(
SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
sv_videoplayer.getHolder().setFixedSize(
ScreenUtils.getScreenHeight(this),
ScreenUtils.getScreenWidth(this)); sv_videoplayer.getHolder().setFormat(PixelFormat.RGBA_8888); sv_videoplayer.getHolder().setKeepScreenOn(true);
sv_videoplayer.getHolder().addCallback(new SurFaceCallback());
}

4)调用 MediaPlayer 进行播放

 mediaPlayer.reset();
mediaPlayer.setDataSource(playUrl);
mediaPlayer.setDisplay(sv_videoplayer.getHolder());
// 缓冲
mediaPlayer.prepareAsync();
mediaPlayer
.setOnBufferingUpdateListener(new BufferingUpdateListener());
mediaPlayer.setOnPreparedListener(new PreparedListener(position));
mediaPlayer.setOnCompletionListener(new CompletionListener());

5)在缓冲就绪初始化MediaController

 /**
* //调用该方法,MediaPlayer就进入了"准备就绪" //状态,准备开始播放. //此处可用于动态设置SurfaceView的宽和高
*
*/
private final class PreparedListener implements OnPreparedListener {
private int position; public PreparedListener(int position) {
this.position = position;
} @Override
public void onPrepared(MediaPlayer arg0) {
// TODO Auto-generated method stub
//MediaController进行设置和使用
mMediaController.setMediaPlayer(VideoPlayerActivity.this);
mMediaController.setAnchorView(findViewById(R.id.rl_video_player));
mMediaController.setEnabled(true);
mMediaController.show();
mediaPlayer.start();
mProgressBar.setVisibility(View.GONE);
mLoadRate.setVisibility(View.GONE);
if (position > 0)
mediaPlayer.seekTo(position);
} }

6)显示缓冲百分比

 private final class BufferingUpdateListener implements
OnBufferingUpdateListener { @Override
public void onBufferingUpdate(MediaPlayer arg0, int percent) {
// TODO Auto-generated method stub
mLoadRate.setText(percent + "%");
}
}

7)使用getHolder().addCallback(new SurFaceCallback()),继承Callback,

SurfaceView 所在Activity 离开了前台,SurfaceView会被destory。当Activity又重新

回到前台时,SurfaceView会被重新创建,SurfaceView是在onResume()方法之后被创建。

防止视频过程中,电话来到,导致视频播放失败。

 private final class SurFaceCallback implements Callback {

         @Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,
int arg3) { } @Override
public void surfaceCreated(SurfaceHolder arg0) {
if (mediaPlayer == null) {
return;
}
if (playUrl != null && position > 0) {
play(position);
position = 0;
}
} @Override
public void surfaceDestroyed(SurfaceHolder arg0) {
if (mediaPlayer == null) {
return;
}
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
}
}

android 全屏视频播放(SurfaceView + MediaPlayer)的更多相关文章

  1. Android 全屏显示

    Android全屏显示: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInst ...

  2. android全屏去掉title栏的多种实现方法

    android全屏去掉title栏的多种实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2013-02-18我要评论 android全屏去掉title栏包括以下几个部分:实现应用中的所有ac ...

  3. Android全屏(包含3种隐藏顶部状态栏及标题栏和一种隐藏Android 4.0平板底部状态栏的方法)

    http://www.xuebuyuan.com/558284.html 方法一 public class MainActivity extends Activity { @Override prot ...

  4. Android 全屏显示的方法(不包含状态栏)

    我们都知道在Android中某些功能的实现往往有两种方法:一种是在xml文件中设置相应属性,另一种是用代码实现.同样Android实现全屏显示也可以通过这两种方法实现: 1.在AndroidManif ...

  5. Android 全屏相关操作

    1.隐藏标题栏(titlebar) (1)在代码中隐藏标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); (2)在Manifest中Applicati ...

  6. 【转】Android 全屏方案(隐藏NavigationBar)

    http://www.07net01.com/2015/04/822292.html 在android4.0及其以上的版本中,出现了一个很屌的东西,叫做Navigation Bar,它和Status ...

  7. Android全屏显示

    requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_ ...

  8. android全屏和取消全屏 旋转屏幕

    全屏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 取消全屏 getWindow().clearFlags(Win ...

  9. Android全屏的两种方法

    在开发中我们经常需要把我们的应用设置为全屏,这里我所知道的有俩中方法,一中是在代码中设置,另一种方法是在配置文件里改! 一.在代码中设置: [java] view plain copy package ...

随机推荐

  1. 一张图说明该选用神马程式来serve你的django应用

  2. ubuntu12 apache2部署多个网站的方法

    由于对apache2的配置不是很精通.吃了不少瘪. 这里总结下,希望对碰到同样问题的人带来帮助: 假设需求是有两个站点,site1和site2.其端口分别为80和8080. 1. 配置监听端口 修改 ...

  3. django-jinjia 集成

    现成包可以参考这里:  http://niwibe.github.io/django-jinja/ Requirements Python 2.7, 3.3 or 3.4 Django 1.4, 1. ...

  4. Java和Python运行速度对比

    Java和Python运行速度对比:同一个函数运行一百万次,Java耗时0.577秒,Python耗时78秒--135倍的差距. 版本:Java 8,Python 2.7.10 Java测试代码: i ...

  5. recv和send函数

    转自  http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html 1. send解析 sockfd:指定发送端套接字描述符. bu ...

  6. Sharepoint 2010 创建栏 计算栏

    SharePoint 创建栏时,可以添加计算字段, 网上查了查,相关资料如下: http://wenku.baidu.com/view/936239e9b8f67c1cfad6b88f.html ht ...

  7. Android的Observable和iOS的NotificationCenter

    使用起来很类似,参看以下网址http://stackoverflow.com/questions/10327200/equivalent-of-ios-nsnotificationcenter-in- ...

  8. ubuntu 13.10 amd64安装ia32-libs

    很多软件只有32位的,有的依赖32位库还挺严重的:从ubuntu 13.10已经废弃了ia32-libs,但可以使用多架构,安装软件或包apt-get install program:i386.有的还 ...

  9. UVALive 7269 Snake Carpet (构造)

    题目:传送门. 题意:构造出一个矩阵,使得矩阵含有n条蛇,每条蛇的长度是1到n,并且奇数长度的蛇有奇数个拐弯,偶数长度 的蛇有偶数个拐弯. 奇数和偶数分开构造,奇数可以是: 1357 3357 555 ...

  10. jQuery常规选择器

    //简单选择器$('div').css('color','red'); //元素选择器,返回多个元素$('#box').css('color','red');//id选择器,返回单个元素$('.box ...