Android视频直播全屏实现
/**
* 添加直播组件
*/
@SuppressLint("JavascriptInterface")
private void addPlayerLive(final SubjectActivityModule.SubjectActivityBean bean) {
playerLiveBean = bean.getPlayerLive();
View view = mInflater.inflate(R.layout.layout_subject_player, null);
playerWebView = view.findViewById(R.id.wv_survey);
String url = "file:///android_asset/apps/H5FF48005/www/view/artical/iframe.html";
// String url = playerLiveBean.getPlaySrc();
ImageView iv_default = view.findViewById(R.id.iv_default);
WebChromeClient wvcc = new WebChromeClient();
WebSettings webSettings = playerWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
playerWebView.addJavascriptInterface(this, "android");
webSettings.setUseWideViewPort(true); // 关键点
webSettings.setAllowFileAccess(true); // 允许访问文件
webSettings.setSupportZoom(true); // 支持缩放
webSettings.setDomStorageEnabled(true); //启用或禁用DOM缓存。
webSettings.setLoadWithOverviewMode(true);
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 不加载缓存内容
playerWebView.setVisibility(View.INVISIBLE);
playerWebView.setWebChromeClient(wvcc);
WebViewClient wvc = new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
playerWebView.loadUrl(url);
return true;
} @Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
iv_default.setVisibility(View.GONE);
playerWebView.setVisibility(View.VISIBLE);
}
};
playerWebView.setWebViewClient(wvc); playerWebView.setWebChromeClient(new WebChromeClient() { /*** 视频播放相关的方法 **/ @Override
public View getVideoLoadingProgressView() {
FrameLayout frameLayout = new FrameLayout(SubjectActivityDetailsActivity.this);
frameLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
return frameLayout;
} @Override
public void onShowCustomView(View view, CustomViewCallback callback) {
showCustomView(view, callback);
} @Override
public void onHideCustomView() {
hideCustomView();
} @Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
// if (newProgress==100){
// iv_default.setVisibility(View.GONE);
// playerWebView.setVisibility(View.VISIBLE);
// }
}
}); // 加载Web地址
playerWebView.loadUrl(url);
ll_container.addView(view);
setPlayerWebViewHeight(view);
} private void setPlayerWebViewHeight(View view) {
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, (int) (UIUtils.getScreenWidth(this) * 0.5625));
view.setLayoutParams(layoutParams);
} /**
* 视频播放全屏
**/
private void showCustomView(View view, WebChromeClient.CustomViewCallback callback) {
// if a view already exists then immediately terminate the new one
if (customView != null) {
callback.onCustomViewHidden();
return;
} setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); getWindow().getDecorView(); FrameLayout decor = (FrameLayout) getWindow().getDecorView();
fullscreenContainer = new FullscreenHolder(this);
fullscreenContainer.addView(view, COVER_SCREEN_PARAMS);
decor.addView(fullscreenContainer, COVER_SCREEN_PARAMS);
customView = view;
setStatusBarVisibility(false);
customViewCallback = callback;
} /**
* 隐藏视频全屏
*/
private void hideCustomView() {
if (customView == null || playerWebView == null) {
return;
}
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
setStatusBarVisibility(true);
FrameLayout decor = (FrameLayout) getWindow().getDecorView();
decor.removeView(fullscreenContainer);
fullscreenContainer = null;
customView = null;
customViewCallback.onCustomViewHidden();
playerWebView.setVisibility(View.VISIBLE);
} /**
* 全屏容器界面
*/
static class FullscreenHolder extends FrameLayout { public FullscreenHolder(Context ctx) {
super(ctx);
setBackgroundColor(ctx.getResources().getColor(android.R.color.black));
} @Override
public boolean onTouchEvent(MotionEvent evt) {
return true;
}
} private void setStatusBarVisibility(boolean visible) {
int flag = visible ? 0 : WindowManager.LayoutParams.FLAG_FULLSCREEN;
getWindow().setFlags(flag, WindowManager.LayoutParams.FLAG_FULLSCREEN);
} @Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
/** 回退键 事件处理 优先级:视频播放全屏-网页回退-关闭页面 */
if (customView != null) {
hideCustomView();
} else if (playerWebView != null && playerWebView.canGoBack()) {
playerWebView.goBack();
} else {
finish();
}
return true;
default:
return super.onKeyUp(keyCode, event);
}
} /**
* 供h5调用 返给h5视频播放地址
*/
@JavascriptInterface
public String getPlayerLiveSrc() {
if (playerLiveBean == null || TextUtils.isEmpty(playerLiveBean.getPlaySrc())) {
return "";
}
return playerLiveBean.getPlaySrc();
}
Android视频直播全屏实现的更多相关文章
- Android 视频直播 SDK
Android 视频直播 SDK接入说明 一.名词解释 分辨率:用于计算机视频处理的图像,以水平和垂直方向上所能显示的像素数来表示分辨率.常见视频分辨率的有1080P即1920x1080,720P即1 ...
- audio与video控件/标签的隐藏,iso/Android下自动全屏播放,短暂黑屏问题
(一)audio音频标签 <audio src="xxx.mp3"></audio> (二)video视频标签 <video src="xx ...
- 阻止 iPhone 视频自动全屏
最近一年都在做直播,遭video 全屏的问题困扰了很久.下面将阻止 ios视频自动全屏的办法写出来.添加 playsinline 和 webkit-playsinline="true&quo ...
- 如何禁止 iPhone Safari video标签视频自动全屏?
最近做一个移动端微信页面项目,在微信页面中有视频播放,但是需要禁止IOS的自动全屏播放(前提必须使用video标签).如: <video id="post" autoplay ...
- android开发:全屏和退出全屏
android开发:全屏和退出全屏 from://http://blog.csdn.net/dyllove98/article/details/8831933 2013-04-21 20:31 413 ...
- 可嵌入图片视频jQuery全屏滑块
分享一款可嵌入图片视频jQuery全屏滑块.这是一款可定制的滑块幻灯片代码,支持键盘箭头切换.效果图如下: 在线预览 源码下载 实现的代码. html代码: <script type ...
- Chrome浏览器中使用 iframe 嵌入网页导致视频不能全屏的问题解决方法
今天无意中测试了下在 iframe 中嵌入视频, 发现全屏按钮在 Chrome 浏览器中居然无效, 试了好几个视频网站的视频都不能全屏, 但在其他浏览器中似乎都很正常, 应该是 Chrome 60 新 ...
- Android 设置ImageView全屏
Android 设置ImageView全屏代码如下: <ImageView android:id="@+id/iv_image" android:scaleType=&quo ...
- Android WebView 总结 —— 使用HTML5播放视频及全屏方案
在APP开发的过程中,会碰到需要在WebView中播放视频的需求,下面讲解一下如何在WebView中使用html5播放视频. 1.让视频在各个Android版本能够正常播放 在AndroidManif ...
随机推荐
- MVP架构的一个小例子
主角: MVP是一种编程的架构模式,M=Model,负责提供数据:V=View,负责显示数据:P=Presenter,负责处理数据. 应用例子: csharp写的一个qq机器人. 一.Model层 获 ...
- 第四章、Django之模型层---创建模型
目录 第四章.Django之模型层---创建模型 一.写models.py 第四章.Django之模型层---创建模型 一.写models.py from django.db import model ...
- 三次样条插值 cubic spline interpolation
什么是三次样条插值 插值(interpolation)是在已知部分数据节点(knots)的情况下,求解经过这些已知点的曲线, 然后根据得到的曲线进行未知位置点函数值预测的方法(未知点在上述已知点自变量 ...
- RecyclerView item独占一行实现
核心代码: GridLayoutManager manager = new GridLayoutManager(context, 4); manager.setSpanSizeLookup() cla ...
- Mysql 指定字段数据排序 以及django的实现
业务场景: mysql 查询 select * from dormitory_applysettleorder order by FIELD(status,40) desc django 实现: or ...
- 配置Linux内核
- JS中数组初始化以及赋值
.指定长度,然后初始化 ); ;index < ;index++){ vArray[index] = index; } 2.不指定长度,然后初始化 var vArray = new Array( ...
- vim技巧总结
自动补齐CTRL+N/CTRL+P vim 自动补全 颜色设置 hi Pmenu ctermfg=black ctermbg=gray guibg=#444444 hi PmenuSel ctermf ...
- linux——实际工作中如何使用linux
实际工作中,linux系统都不会在我们自己的电脑上,linux系统安装在机房的服务器上,我们操作linux不可能跑到机房去,所以我们需要有一个工具,能在公司通过网络远程连接到机房的linux服务器上 ...
- linux——目录说明
1) bin -> usr/bin : 这个目录存放最经常使用的命令 2) boot : 这个目录存放启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件 3) dev: de ...