android 实现视频播放功能,android开发之简单视频播放器(VideoView)
简单视频播放器的使用
一、简单使用videoView和MediaController实现播放控制
1、添加需要的权限
2、设置布局
android:id="@+id/main_video"
android:layout_width="match_parent"
android:layout_height="240dp"
/>
3、实例化VideoView
VideoView videoView = (VideoView) findViewById(R.id.main_video);
MediaController controller = new MediaController(this);//实例化控制器
// String path = Environment.getExternalStorageDirectory().getAbsolutePath()+"jiaoxue.mp4";
/**
* 本地播放
*/
// videoView.setVideoPath("path");
/**
* 网络播放
*/
videoView.setVideoURI(Uri.parse("http://192.168.1.109:8080/video/jiaoxue.mp4"));
/**
* 将控制器和播放器进行互相关联
*/
controller.setMediaPlayer(videoView);
videoView.setMediaController(controller);
二、自定义播放器 (贴上源码)
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.zzj.myeasyvideoplaydemo.MainActivity">
android:layout_width="match_parent"
android:layout_height="240dp">
android:id="@+id/main_video"
android:layout_width="match_parent"
android:layout_height="240dp"
/>
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="vertical"
android:layout_alignParentBottom="true"
>
android:layout_width="match_parent"
android:layout_height="5dp"
android:layout_marginLeft="-20dp"
android:layout_marginRight="-20dp"
android:max="100"
android:indeterminate="false"
android:progress="20"
/>
android:gravity="center_vertical"
android:background="#101010"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
>
android:id="@+id/play_pasue_image"
android:layout_marginLeft="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/video_play_blue"
/>
android:id="@+id/main_current_time"
android:layout_marginLeft="16dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="00:00:00"
android:textSize="14dp"
android:textColor="#ffffff"
/>
android:layout_marginLeft="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="/"
android:textSize="14dp"
android:textColor="#4c4c4c"
/>
android:id="@+id/main_totally_time"
android:layout_marginLeft="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="00:00:00"
android:textSize="14dp"
android:textColor="#ffffff"
/>
android:layout_marginRight="5dp"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/video_sound_switch"
/>
android:layout_width="100dp"
android:layout_height="5dp"
android:progress="20"
android:max="100"
/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/play"
/>
视频Java类:
public class TestMovieActivity extends BaseActivity {
public static final int UPDATA_VIDEO_NUM = 1;
private CustomVideoView videoView;
private MediaController controller;//控制器
private RelativeLayout videoLayout;
private LinearLayout controllerLayout;//播放器的总控制布局
private SeekBar play_seek, volume_seek;//播放进度和音量控制进度
private ImageView play_controller_image, screen_image,volume_Image;
private TextView current_time_tv, totally_time_tv;
private String path;
private int screen_width, screen_height;
private AudioManager audioManager;//音量控制器
private boolean screen_flag = true;//判断屏幕转向
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//实例化音量控制器
audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
setContentView(R.layout.act_testmovie);
initView();
initData();
initViewOnClick();
// controller = new MediaController(this);//实例化控制器
// path = Environment.getExternalStorageDirectory().getAbsolutePath()+"jiaoxue.mp4";
/**
* 本地播放
*/
// videoView.setVideoPath("");
/**
* 网络播放
*/
videoView.setVideoURI(Uri.parse("http://192.168.1.109:8080/video/jiaoxue.mp4"));
//视频播放时开始刷新
// videoView.start();
play_controller_image.setImageResource(R.mipmap.video_play_blue);
// handler.sendEmptyMessage(UPDATA_VIDEO_NUM);
/**
* 将控制器和播放器进行互相关联
*/
// controller.setMediaPlayer(videoView);
// videoView.setMediaController(controller);
}
@Override
protected void onPause() {
super.onPause();
handler.removeMessages(UPDATA_VIDEO_NUM);
}
@Override
protected void onDestroy() {
super.onDestroy();
handler.removeMessages(UPDATA_VIDEO_NUM);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// 判断当前屏幕的横竖屏状态
int screenOritentation = getResources().getConfiguration().orientation;
if (screenOritentation == Configuration.ORIENTATION_LANDSCAPE) {
//横屏时处理
setVideoScreenSize(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
volume_seek.setVisibility(View.VISIBLE);
volume_Image.setVisibility(View.VISIBLE);
screen_flag = false;
//清除全屏标记,重新添加
getWindow().clearFlags((WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN));
getWindow().addFlags((WindowManager.LayoutParams.FLAG_FULLSCREEN));
} else {
//竖屏时处理
setVideoScreenSize(ViewGroup.LayoutParams.MATCH_PARENT, DisplayUtils.dp2px(mContext,240));
screen_flag = true;
volume_seek.setVisibility(View.GONE);
volume_Image.setVisibility(View.GONE);
//清除全屏标记,重新添加
getWindow().clearFlags((WindowManager.LayoutParams.FLAG_FULLSCREEN));
getWindow().addFlags((WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN));
}
}
/**
* 通过handler对播放进度和时间进行更新
*/
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == UPDATA_VIDEO_NUM) {
//获取视频播放的当前时间
int currentTime = videoView.getCurrentPosition();
//获取视频的总时间
int totally = videoView.getDuration();
//格式化显示时间
updataTimeFormat(totally_time_tv, totally);
updataTimeFormat(current_time_tv, currentTime);
//设置播放进度
play_seek.setMax(totally);
play_seek.setProgress(currentTime);
//自己通知自己更新
handler.sendEmptyMessageDelayed(UPDATA_VIDEO_NUM, 500);//500毫秒刷新
}
}
};
/**
* 设置横竖屏时的视频大小
*
* @param width
* @param height
*/
private void setVideoScreenSize(int width, int height) {
//获取视频控件的布局参数
ViewGroup.LayoutParams videoViewLayoutParams = videoView.getLayoutParams();
//设置视频范围
videoViewLayoutParams.width = width;
videoViewLayoutParams.height = height;
videoView.setLayoutParams(videoViewLayoutParams);
//设置视频和控制组件的layout
ViewGroup.LayoutParams videoLayoutLayoutParams= videoLayout.getLayoutParams();
videoLayoutLayoutParams.width = width;
videoLayoutLayoutParams.height = height;
videoLayout.setLayoutParams(videoLayoutLayoutParams);
}
/**
* 时间格式化
*
* @param textView 时间控件
* @param millisecond 总时间 毫秒
*/
private void updataTimeFormat(TextView textView, int millisecond) {
//将毫秒转换为秒
int second = millisecond / 1000;
//计算小时
int hh = second / 3600;
//计算分钟
int mm = second % 3600 / 60;
//计算秒
int ss = second % 60;
//判断时间单位的位数
String str = null;
if (hh != 0) {//表示时间单位为三位
str = String.format("%02d:%02d:%02d", hh, mm, ss);
} else {
str = String.format("%02d:%02d", mm, ss);
}
//将时间赋值给控件
textView.setText(str);
}
/**
* 按钮点击事件
*/
private void initViewOnClick() {
//播放按钮事件
play_controller_image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//判断播放按钮的状态
if (videoView.isPlaying()) {
play_controller_image.setImageResource(R.mipmap.video_play_blue);
//视频暂停
videoView.pause();
//当视频处于暂停状态,停止handler的刷新
handler.removeMessages(UPDATA_VIDEO_NUM);
} else {
play_controller_image.setImageResource(R.mipmap.video_pause_white);
videoView.start();
//当视频播放时,通知刷新
handler.sendEmptyMessage(UPDATA_VIDEO_NUM);
}
}
});
//播放进度条事件
play_seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
//设置当前的播放时间
updataTimeFormat(current_time_tv, progress);
if (videoView.getDuration() == progress) {
play_controller_image.setImageResource(R.mipmap.video_play_blue);
}
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
//拖动视频进度时,停止刷新
handler.removeMessages(UPDATA_VIDEO_NUM);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//停止拖动后,获取总进度
int totall = seekBar.getProgress();
//设置VideoView的播放进度
videoView.seekTo(totall);
//重新handler刷新
handler.sendEmptyMessage(UPDATA_VIDEO_NUM);
}
});
//音量控制条事件
volume_seek.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
//设置音量变动后系统的值
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,progress,0);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
//设置全屏按钮点击事件
screen_image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showLog("------当前屏幕标记----:"+screen_flag);
if(screen_flag){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//控制屏幕竖屏
}else {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//控制屏幕横屏
}
}
});
}
@Override
protected void initView() {
videoView = (CustomVideoView) findViewById(R.id.main_video);
videoLayout = (RelativeLayout) findViewById(R.id.act_testmovie_videolayout);
controllerLayout = (LinearLayout) findViewById(R.id.main_controller_liner);
play_seek = (SeekBar) findViewById(R.id.main_play_seek);
volume_seek = (SeekBar) findViewById(R.id.main_volume_seek);
current_time_tv = (TextView) findViewById(R.id.main_current_time);
totally_time_tv = (TextView) findViewById(R.id.main_totally_time);
play_controller_image = (ImageView) findViewById(R.id.play_pasue_image);
screen_image = (ImageView) findViewById(R.id.main_screen_image);
volume_Image = (ImageView) findViewById(R.id.act_testmovies_volume_image);
DisplayMetrics metric = new DisplayMetrics();
screen_width = metric.widthPixels;
screen_height = metric.heightPixels;
}
@Override
protected void initData() {
//获取设置音量的最大值
int volumeMax = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
volume_seek.setMax(volumeMax);
//获取设置当前音量
int currentVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
volume_seek.setProgress(currentVolume);
}
}
补上CustomVideoView
public class CustomVideoView extends VideoView {
//声明屏幕的大小
int width = 1920;
int height = 1080;
public CustomVideoView(Context context) {
super(context);
}
public CustomVideoView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public CustomVideoView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//设置宽高
int defaultWidth = getDefaultSize(width,widthMeasureSpec);
int defaultHeight = getDefaultSize(height,heightMeasureSpec);
setMeasuredDimension(defaultWidth,defaultHeight);
}
}
android 实现视频播放功能,android开发之简单视频播放器(VideoView)相关推荐
- android 实现视频播放功能,Android项目实现视频播放器
本文实例为大家分享了Android项目实现视频播放器的具体代码,供大家参考,具体内容如下 VideoView控件是播放视频用的,借助它可以完成一个简易的视频播放器. ①在activity_main.x ...
- 文件管理器android实现,Android开发之简单文件管理器实现方法
易采站长站为您分析Android开发之简单文件管理器实现方法,简单实现了Android的文件目录查看,文件重命名,打开,删除等功能,需要的朋友可以参考下 本文实例讲述了Android开发之简单文件管理 ...
- Android Studio——简单视频播放器
1.界面分析 三个界面:主界面,视频列表界面,视频播放界面,如下图所示: 2.实现思路 (1)主界面设计 很简单,就一个背景和一个控件,然后为控件设置点击事件,然后跳转到视频列表界面 activity ...
- java如何开发视频软件_使用JAVA编写视频播放器
Java因其跨平台优势而陷入困境. 当时,我以为"写一次,到处跑". 这听起来不错,它应该是所有语言开发的最终方法. Java必将统治世界. 事实证明当时我还太小. 所谓的鱼和熊掌 ...
- 安卓打开java文件管理器_Android开发之简单文件管理器实现方法
本文实例讲述了Android开发之简单文件管理器实现方法.分享给大家供大家参考,具体如下: 这里运用Java I/O.ListActivity.Dialog.Bitmap等实现简单文件管理器,可以查看 ...
- android studio多媒体播放器,Android支持全屏、小窗口的视频播放器
NiceVieoPlayer Android支持全屏.小窗口的视频播放器,完美实现全屏.小窗口播放切换 Features 用IjkPlayer/MediaPlayer + TextureView封装, ...
- 集音频和视频播放功能于一身的简易播放器
<Win32_17>集音频和视频播放功能于一身的简易播放器 搜索源代码
- 【音视频零基础入门 1】视频播放器原理、流媒体协议、封装格式、视频编码、音频编码
[音视频零基础入门 1]视频播放器原理.流媒体协议.封装格式.视频编码 一.视频播放器原理 1.1 解协议 1.2 解封装 1.3 解码 1.4 视音频同步 二.流媒体协议 三.封装格式 四.封装格式 ...
- linux音视频质量,linux好用的视频播放器
想知道在Linux上应该使用哪种视频播放器吗?我们在这里列出了Linux发行版中可用的7款最佳开源视频播放器. 您可以在Linux上观看在线流媒体服务,但是在电脑上观看电影/电视连续剧或其他视频内容还 ...
最新文章
- python学习路线-Python学习路线
- MFC中滚动条slider和编辑框edit的联动
- CV:基于Keras利用CNN主流架构之mini_XCEPTION训练情感分类模型hdf5并保存到指定文件夹下
- java max sum_杭电1024 Max Sum Plus Plus状压dp(java)
- 2017 JMP Discovery Summit China圆满落幕
- Springcloud整理
- mysql数据库常用备份、恢复命令
- 利用C++Builder自定义Windows窗体“系统菜单”
- sota和fota区别_汽车fota是什么意思
- 数据可视化(3)--Google Charts
- 经典机器学习系列(十四)PAC-Learning
- 遗传算法是一种进化算法_一种算法的少量更改可以减少种族主义的借贷
- 基于邮件推拉技术的数据库远程数据同步解决方案
- 使用OBS录屏神器,完美录制第二块屏幕。
- 魅族开售跳票,创饥饿营销新高度?
- Dw怎么背景图片设置
- hdu5442 后缀数组
- Chrome 添加【微信 / QQ】内置浏览器(解决 “请在微信客户端打开链接” 提示)
- 2022陈箫箫胡程灿信息论课程作业 MIMO信道(multi-input multi-output,MIMO)简介
- 字节跳动-飞书视频-测试开发面试题
热门文章
- 没有计算机网络适配器,WinXP没有网络适配器怎么添加?本地连接消失了如何恢复?...
- Ubuntu22.04编译Android切换Python2.7版本
- ESP32设备驱动-DS3231实时时钟(RTC)驱动
- WPF最新的电子书整理打包下载
- 人生苦短,为何一定要学Python?
- 刷脸支付技术的最大特征是能避免个人信息泄露
- 杜克大学计算机专业本科入学条件,杜克大学录取条件
- 100%完美解决 mac系统不能使用su命令问题 —— sudo和su的区别
- Java项目:医药进销存系统(java+SSM+JSP+Layui+jQuery+Maven+mysql)
- OSCAR开源大会 | 「开源学」:如何分门别类理解开源