Android视频播放器开发
第一个播放器开发的实例,是通过VideoView+MediaController的方式实现的
主要实现了视频播放、暂停、快进、快退的功能
创建项目的名称为VideoView,建立类名为MyVideoView
一、项目的布局写法
代码中注释的部分记得去掉
注:横竖屏切换时会导致重走生命周期,为了避免这种情况,在在AndroidManifest中配置
<activity android:name=".MainActivity"
android:configChanges="keyboardHidden|orientation|screenSize">
除此之外还需要在AndroidManifest中添加网络权限和sd卡权限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
在activity_main.xml中添加视图布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.eddie.videoview.MainActivity">
<RelativeLayout
android:id="@+id/rl"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
//控制视频大小
<com.example.eddie.videoview.MyVideoView
android:id="@+id/videoview"
android:layout_width="380dp"
android:layout_height="380dp" />
</RelativeLayout>
<Button
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_below="@id/rl"
android:text="开始" />
<Button
android:id="@+id/btn_2"
android:layout_width="match_parent"
android:layout_height="60dp"
android:layout_below="@id/btn"
android:text="全屏" />
</RelativeLayout>
二、主程序
记录三个AndroidStudio快捷键:
1、ctrl+Alt+Shift+L用于初始化代码,让代码对齐
2、ctrl+Alt+Shift+T可以抽取代码中的变量为成员变量
3、ctrl+d用于复制代码到下一行
public class MainActivity extends AppCompatActivity {
private VideoView videoView;//播放视频的视图
private Button btn;//播放按钮
private Button btn_2;//全屏播放按钮
private MediaController mMediaController;//视频播放控制器
private boolean isFullScreen;//是否全屏的判断
private boolean isWantExit;//判断是否真的想退出
private MainActivity mMainActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMainActivity = this;
initView();//绑定视图
initListener();//绑定事件
}
/*
* 绑定视图
* */
private void initView() {
videoView = (VideoView) findViewById(R.id.videoview);
btn = (Button) findViewById(R.id.btn);
btn_2 = (Button) findViewById(R.id.btn_2);
mMediaController = new MediaController(this);//初始化视频播放控制器
}
/*
*设置点击事件以及监听
* */
private void initListener() {
//设置准备完成监听
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
//TODO 视频准备完成后,调用此处方法
}
});
//设置播放完成监听
videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//TODO 视频播放完成后,调用此处方法
}
});
//设置视频播放出错时候的监听
videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
//TODO 视频播放解析出错,调用此处方法
return true;
}
});
//给“开始”button设置点击事件,在点击后进行播放视频,并且将控制器与视频绑定
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//设置播放视频地址,要提前配置权限
videoView.setVideoPath("http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8");
//videoview绑定控制器
videoView.setMediaController(mMediaController);
//把控制器视图平铺到哪一个视图上(Mediacontroller底层是一个popupwindow)
mMediaController.setAnchorView(videoView);
videoView.start();
}
});
btn_2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
changeScreen();
}
});
}
//半屏变全屏
public void changeScreen() {
if (isFullScreen) {//如果是全屏就变为半屏
//1、将当前activity设置为竖屏
mMainActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
//2、给videoview设置半屏参数
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(dp2px(this, 300), dp2px(this, 300));//代码中写的都是px值
videoView.setLayoutParams(layoutParams);
isFullScreen = false;
} else {//如果不是全屏就变为全屏
//1、把屏幕编程全屏
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//width,height
//2、把当前activity设置为全屏
mMainActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
//3、给videoview设置全屏参数
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);//width,height
videoView.setLayoutParams(layoutParams);
isFullScreen = true;
}
}
/*
* 当点击屏幕的时候会调用,如果返回true表示消费掉该事件,如果返回false表示不消费该事件,只是处理方法内业务逻辑,之后事件继续传递
* */
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {//判断按钮是否为返回键
if (isFullScreen) {//如果是全屏就退出全屏
changeScreen();
return false;
} else {//如果不是全屏,就开始退出app
exit();//开始退出,做一个判断用户是否想退出
return false;
}
}
return super.onKeyDown(keyCode, event);
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//2s后如果用户没有再次点击回退键,就将用户是否想退出的布尔值变为false,标识用户不想退出
isWantExit = false;
}
};
private void exit() {
if (!isWantExit) {
isWantExit = true;//用户表示我想退出
Toast.makeText(this, "你真的想退出吗", Toast.LENGTH_SHORT).show();
//增加异步处理的延迟
mHandler.sendEmptyMessageDelayed(0, 2000);
} else {//表示真的想退出了
finish();
System.exit(0);//把app占用的线程杀死,彻底退出 app
}
}
/*
* 工具类方法
* */
public static int px2dp(Context context, float pxValue) {
float density = context.getResources().getDisplayMetrics().density;//获得当前屏幕,获得屏幕原型,获得屏幕密度
return (int) (pxValue / density + 0.5f);
}
public static int dp2px(Context context, float dpValue) {
float density = context.getResources().getDisplayMetrics().density;//获得当前屏幕,获得屏幕原型,获得屏幕密度
return (int) (dpValue * density + 0.5f);
}
}

本文介绍了使用VideoView和MediaController开发Android视频播放器的实例,详细讲解了如何实现播放、暂停、快进和快退功能。在创建的VideoView项目中,重点阐述了布局设计、生命周期管理和权限设置,同时分享了三个Android Studio的实用快捷键。


被折叠的 条评论
为什么被折叠?



