介绍个第三方:

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. HDU 1978 记忆化搜索(dfs+dp)

    Y - How many ways Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  2. 安装tar.bz2文件

    (1) 解包 – tar jxvf softname-10.0.1.tar.gz -C /usr/src/(-C指的是把文件解压到后面的路径下,此处可以不选) – cd /usr/src/softna ...

  3. ORACLE清除某一字段重复的数据(选取重复数据中另一个字段时期最大值)

    需求:资产维修表中同一资产可能维修完继续申请维修,这时候维修状态需要根据最近的维修时间去判断维修状态,所以同一资产ID下会出现重复的数据(维修审批通过,维修审批未通过),或者可能不出现(未申请维修), ...

  4. [Android Pro] 横竖屏切换时,禁止activity重新创建,android:configChanges="keyboardHidden|orientation" 不起作用

    referece to : http://blog.csdn.net/mybook1122/article/details/24978025 这个网上搜索,很多结果都是: AndroidManifes ...

  5. Liz Murray成功故事的偶然与必然(转)

    偶尔,我看到了一部电影:Homeless to Harvard (风雨哈佛路) 说句老实话,她( Liz Murray 莉丝·默里 )的经历确实让人钦佩和学习! 下面我看到他人写的有这本电影的评论,觉 ...

  6. android wifi驱动移植详细过程

    转自:http://bbs.imp3.net/thread-10558924-1-1.html 对于刚入手android没多久的人来说,android wifi 驱动的移植确实还是有难度的,不过参考了 ...

  7. Net4.0---AspNet中URL重写的改进(转载)

    转载地址:http://www.cnblogs.com/oec2003/archive/2010/07/27/1785862.html URL重写有很多的好处,如有利于SEO.便于记忆.隐藏真实路径使 ...

  8. css局部概念的理解:

    1.DIV-Padding理解:一直以来对div中的padding属性,一直不理解,使用最多的也就是margin,padding是div的内空间的相对距离,margin是div的外部相对位置,如果用一 ...

  9. PHP 常用正则汇总

     平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用:    }|d{})-((([-]{}))|([|]))-(([-]([-]{}))|([|]))$/   ([-]{}) ...

  10. 三种方法实现js跨域访问

    转自:http://narutolby.iteye.com/blog/1464436 javascript跨域访问是web开发者经常遇到的问题,什么是跨域,一个域上加载的脚本获取或操作另一个域上的文档 ...