android 全屏视频播放(SurfaceView + MediaPlayer)

介绍个第三方:

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事件,

重新生成

1 WindowManager.LayoutParams lpa = getWindow().getAttributes();

2 if (lpa.screenBrightness > 1.0f)

3 lpa.screenBrightness = 1.0f;

4 else if (lpa.screenBrightness < 0.01f)

5 lpa.screenBrightness = 0.01f;

6

7 getWindow().setAttributes(lpa);

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

1 if (mediaPlayer == null) {

2 mediaPlayer = new MediaPlayer();

3 // 不维持自身缓冲区,直接显示

4 // this value only use Hardware decoder before Android 2.3

5 if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB

6 && mHardwareDecoder) {

7 sv_videoplayer.getHolder().setType(

8 SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

9 }

10 sv_videoplayer.getHolder().setFixedSize(

11 ScreenUtils.getScreenHeight(this),

12 ScreenUtils.getScreenWidth(this));

13

14 sv_videoplayer.getHolder().setFormat(PixelFormat.RGBA_8888);

15

16 sv_videoplayer.getHolder().setKeepScreenOn(true);

17 sv_videoplayer.getHolder().addCallback(new SurFaceCallback());

18 }

4)调用 MediaPlayer 进行播放

1 mediaPlayer.reset();

2 mediaPlayer.setDataSource(playUrl);

3 mediaPlayer.setDisplay(sv_videoplayer.getHolder());

4 // 缓冲

5 mediaPlayer.prepareAsync();

6 mediaPlayer

7 .setOnBufferingUpdateListener(new BufferingUpdateListener());

8 mediaPlayer.setOnPreparedListener(new PreparedListener(position));

9 mediaPlayer.setOnCompletionListener(new CompletionListener());

5)在缓冲就绪初始化MediaController

1 /**

2 * //调用该方法,MediaPlayer就进入了"准备就绪" //状态,准备开始播放. //此处可用于动态设置SurfaceView的宽和高

3 *

4 */

5 private final class PreparedListener implements OnPreparedListener {

6 private int position;

7

8 public PreparedListener(int position) {

9 this.position = position;

10 }

11

12 @Override

13 public void onPrepared(MediaPlayer arg0) {

14 // TODO Auto-generated method stub

15 //MediaController进行设置和使用

16 mMediaController.setMediaPlayer(VideoPlayerActivity.this);

17 mMediaController.setAnchorView(findViewById(R.id.rl_video_player));

18 mMediaController.setEnabled(true);

19 mMediaController.show();

20 mediaPlayer.start();

21 mProgressBar.setVisibility(View.GONE);

22 mLoadRate.setVisibility(View.GONE);

23 if (position > 0)

24 mediaPlayer.seekTo(position);

25 }

26

27 }

6)显示缓冲百分比

1 private final class BufferingUpdateListener implements

2 OnBufferingUpdateListener {

3

4 @Override

5 public void onBufferingUpdate(MediaPlayer arg0, int percent) {

6 // TODO Auto-generated method stub

7 mLoadRate.setText(percent + "%");

8 }

9 }

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

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

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

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

1 private final class SurFaceCallback implements Callback {

2

3 @Override

4 public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,

5 int arg3) {

6

7 }

8

9 @Override

10 public void surfaceCreated(SurfaceHolder arg0) {

11 if (mediaPlayer == null) {

12 return;

13 }

14 if (playUrl != null && position > 0) {

15 play(position);

16 position = 0;

17 }

18 }

19

20 @Override

21 public void surfaceDestroyed(SurfaceHolder arg0) {

22 if (mediaPlayer == null) {

23 return;

24 }

25 if (mediaPlayer.isPlaying()) {

26 mediaPlayer.stop();

27 }

28 }

29 }