android 全屏视频播放(SurfaceView + MediaPlayer)
介绍个第三方:
实现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)的更多相关文章
- Android 全屏显示
Android全屏显示: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInst ...
- android全屏去掉title栏的多种实现方法
android全屏去掉title栏的多种实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2013-02-18我要评论 android全屏去掉title栏包括以下几个部分:实现应用中的所有ac ...
- Android全屏(包含3种隐藏顶部状态栏及标题栏和一种隐藏Android 4.0平板底部状态栏的方法)
http://www.xuebuyuan.com/558284.html 方法一 public class MainActivity extends Activity { @Override prot ...
- Android 全屏显示的方法(不包含状态栏)
我们都知道在Android中某些功能的实现往往有两种方法:一种是在xml文件中设置相应属性,另一种是用代码实现.同样Android实现全屏显示也可以通过这两种方法实现: 1.在AndroidManif ...
- Android 全屏相关操作
1.隐藏标题栏(titlebar) (1)在代码中隐藏标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); (2)在Manifest中Applicati ...
- 【转】Android 全屏方案(隐藏NavigationBar)
http://www.07net01.com/2015/04/822292.html 在android4.0及其以上的版本中,出现了一个很屌的东西,叫做Navigation Bar,它和Status ...
- Android全屏显示
requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_ ...
- android全屏和取消全屏 旋转屏幕
全屏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 取消全屏 getWindow().clearFlags(Win ...
- Android全屏的两种方法
在开发中我们经常需要把我们的应用设置为全屏,这里我所知道的有俩中方法,一中是在代码中设置,另一种方法是在配置文件里改! 一.在代码中设置: [java] view plain copy package ...
随机推荐
- 一张图说明该选用神马程式来serve你的django应用
- ubuntu12 apache2部署多个网站的方法
由于对apache2的配置不是很精通.吃了不少瘪. 这里总结下,希望对碰到同样问题的人带来帮助: 假设需求是有两个站点,site1和site2.其端口分别为80和8080. 1. 配置监听端口 修改 ...
- django-jinjia 集成
现成包可以参考这里: http://niwibe.github.io/django-jinja/ Requirements Python 2.7, 3.3 or 3.4 Django 1.4, 1. ...
- Java和Python运行速度对比
Java和Python运行速度对比:同一个函数运行一百万次,Java耗时0.577秒,Python耗时78秒--135倍的差距. 版本:Java 8,Python 2.7.10 Java测试代码: i ...
- recv和send函数
转自 http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html 1. send解析 sockfd:指定发送端套接字描述符. bu ...
- Sharepoint 2010 创建栏 计算栏
SharePoint 创建栏时,可以添加计算字段, 网上查了查,相关资料如下: http://wenku.baidu.com/view/936239e9b8f67c1cfad6b88f.html ht ...
- Android的Observable和iOS的NotificationCenter
使用起来很类似,参看以下网址http://stackoverflow.com/questions/10327200/equivalent-of-ios-nsnotificationcenter-in- ...
- ubuntu 13.10 amd64安装ia32-libs
很多软件只有32位的,有的依赖32位库还挺严重的:从ubuntu 13.10已经废弃了ia32-libs,但可以使用多架构,安装软件或包apt-get install program:i386.有的还 ...
- UVALive 7269 Snake Carpet (构造)
题目:传送门. 题意:构造出一个矩阵,使得矩阵含有n条蛇,每条蛇的长度是1到n,并且奇数长度的蛇有奇数个拐弯,偶数长度 的蛇有偶数个拐弯. 奇数和偶数分开构造,奇数可以是: 1357 3357 555 ...
- jQuery常规选择器
//简单选择器$('div').css('color','red'); //元素选择器,返回多个元素$('#box').css('color','red');//id选择器,返回单个元素$('.box ...