MediaController是如何依附在VideoView上的
2016-05-04 23:23
691 查看
很多做视频播放器的朋友们非常想用自带的VideoView来显示视频,用MediaController做为控制视频播放的组件,但是将这两个类全部copy过来之后会出现诸如之下很多问题:
1.“com.android.internal.policy.PolicyManager”是系统隐藏类,不允许在应用程序中直接引用。
这时候采用反编译方式,骗过系统编译器即可,反编译代码如下。
public static Window getPolicyWindow(Context context) {
Window window = null;
try {
Class<?> policyManagerClass = Class
.forName("com.android.internal.policy.PolicyManager");
Class<?>[] parMakeNewWindow = { Context.class };
Class<?>[] parConstructor = {};
Method makeNewWindow = policyManagerClass.getDeclaredMethod(
"makeNewWindow", parMakeNewWindow);
Object[] args = { context };
window = (Window) makeNewwindows.invoke(null, args);
} catch (ClassNotFoundException e) {
LogHelper.e(TAG, "getPolicyWindow, ", e);
} catch (NoSuchMethodException e) {
LogHelper.e(TAG, "getPolicyWindow, ", e);
} catch (IllegalAccessException e) {
LogHelper.e(TAG, "getPolicyWindow, ", e);
} catch (InvocationTargetException e) {
LogHelper.e(TAG, "getPolicyWindow, ", e);
}
return window;
}
2. 视频显示页面VideoView 很明显与 视频播放控制相关按钮MediaController实现了彻底分离,但这两个类是如何协同作用的呢?或者说MediaController是如何依附在VideoView上,并点击其中按钮就能控制VideoView中所播放的视频的播放与暂停呢?
为了更好的解决这个问题,我画了2个时序图,希望能够帮助你理解它们之间的关系(注意其中的注释)。
1. 控制组件位于FrameLayout中.
2. FrameLayout位于Window中 (通过mWindow.setContentView(this)).
3. 控制组件的显示与隐藏 是通过mDecor对象(就是包含控制组件的View)是否添加到WindowManager中来完成(通过mWindowManager.removeView(mDecor)
或mWindowManager.addView(mDecor)).
两个类的职责:
1. VideoView功能如下:
(1) 视频容器。 MediaPlayer 的各种Listener在此监听
(2) 控制显示的视频的大小
(3) 控制MediaController中控制组件的显示与否
2. MediaController功能如下:所有的页面控制逻辑都放置在此
(1) 手势监听(单击,双击等)
(2) 播放,上一首,下一首按钮的功能实现
(3) SeekBar的更新
注意事项:
注意VideoView中的onMeasure(int
widthMeasureSpec, int heightMeasureSpec);
有时候无法设置全屏显示视频,显示的视频的大小受该方法控制。该方法负责控制SurfaceView的整体大小,视频是被填充在它里面,视频最大也就是SurfaceView的大小。
1.“com.android.internal.policy.PolicyManager”是系统隐藏类,不允许在应用程序中直接引用。
这时候采用反编译方式,骗过系统编译器即可,反编译代码如下。
public static Window getPolicyWindow(Context context) {
Window window = null;
try {
Class<?> policyManagerClass = Class
.forName("com.android.internal.policy.PolicyManager");
Class<?>[] parMakeNewWindow = { Context.class };
Class<?>[] parConstructor = {};
Method makeNewWindow = policyManagerClass.getDeclaredMethod(
"makeNewWindow", parMakeNewWindow);
Object[] args = { context };
window = (Window) makeNewwindows.invoke(null, args);
} catch (ClassNotFoundException e) {
LogHelper.e(TAG, "getPolicyWindow, ", e);
} catch (NoSuchMethodException e) {
LogHelper.e(TAG, "getPolicyWindow, ", e);
} catch (IllegalAccessException e) {
LogHelper.e(TAG, "getPolicyWindow, ", e);
} catch (InvocationTargetException e) {
LogHelper.e(TAG, "getPolicyWindow, ", e);
}
return window;
}
2. 视频显示页面VideoView 很明显与 视频播放控制相关按钮MediaController实现了彻底分离,但这两个类是如何协同作用的呢?或者说MediaController是如何依附在VideoView上,并点击其中按钮就能控制VideoView中所播放的视频的播放与暂停呢?
为了更好的解决这个问题,我画了2个时序图,希望能够帮助你理解它们之间的关系(注意其中的注释)。
1. 控制组件位于FrameLayout中.
2. FrameLayout位于Window中 (通过mWindow.setContentView(this)).
3. 控制组件的显示与隐藏 是通过mDecor对象(就是包含控制组件的View)是否添加到WindowManager中来完成(通过mWindowManager.removeView(mDecor)
或mWindowManager.addView(mDecor)).
两个类的职责:
1. VideoView功能如下:
(1) 视频容器。 MediaPlayer 的各种Listener在此监听
(2) 控制显示的视频的大小
(3) 控制MediaController中控制组件的显示与否
2. MediaController功能如下:所有的页面控制逻辑都放置在此
(1) 手势监听(单击,双击等)
(2) 播放,上一首,下一首按钮的功能实现
(3) SeekBar的更新
注意事项:
注意VideoView中的onMeasure(int
widthMeasureSpec, int heightMeasureSpec);
有时候无法设置全屏显示视频,显示的视频的大小受该方法控制。该方法负责控制SurfaceView的整体大小,视频是被填充在它里面,视频最大也就是SurfaceView的大小。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories