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 ...
随机推荐
- Pascal’s Triangle
vector<vector<int>> generate(int num) { vector<vector<int>> result; vector&l ...
- win7 64位系统HP LaserJet P1008 / HP LaserJet P1008 P1007 驱动安装成功,但无法打印的原因
HP LaserJet P1008 打印机驱动安装成功,但是无法打印相关文档的原因是: 1.打印机是水货,惠普中国提供的驱动和该打印机不符合.显示的应该是HP LaserJet Professiona ...
- PHP日期格式转时间戳
PHP 提供了函数可以方便的将各种形式的日期转换为时间戳,该类函数主要是: strtotime():将任何英文文本的日期时间描述解析为时间戳. mktime():从日期取得时间戳. strtotime ...
- 《转》Visual Studio 2010 终极定制安装精简方法
打开VS2010安装目录下的 Setup 文件夹,找到 baseline.dat 文件和 vs_setup.pdi 文件还有一个 locdata.ini 文件,是对应的. 这些都是文本文件,用记事本就 ...
- PeopleEditor允许客户端输入的同时验证输入的内容
如何判断PeopleEditor的值为空 在sharepoint开发中,我们经常会用到PeopleEditor这一控件,最近我在写程序的时候用到了,开始的时候不知道怎么用,后来问题解决啦,现在写出 ...
- VIM中的折叠命令
参考:http://blog.csdn.net/bruce0532/article/details/8497284 za:在折叠与展开间自由转换 zf:创建折叠 示例:zf 3j #本行及以下3 ...
- 关于https和数字证书的一些必须知识
下面这篇文章叫做 HTTPS连接的前几毫秒发生了什么 ,是一篇译文,写得不错,十分有助于理解https. http://blog.jobbole.com/48369/ 下面的链接是百度文库的 数字证 ...
- Android dp px转化公式
// DisplayMetrics metrics = getResources().getDisplayMetrics(); // int statusBarHeight = (int) Math. ...
- Java for LeetCode 172 Factorial Trailing Zeroes
Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in log ...
- Java for LeetCode 154 Find Minimum in Rotated Sorted Array II
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...