webView全屏播放的问题
来源:互联网 发布:淘宝商品被删除怎么办 编辑:程序博客网 时间:2024/05/23 15:34
上篇讲到webview加载视频的问题,这篇文章讲讲webView全屏播放的问题
首先,贴activity在mainfast 中的声明:
<activity
android:name=".ui.offersInfo.OffersInfoActivity"
android:configChanges="orientation|keyboardHidden"
android:hardwareAccelerated="true"/>
需要注意的是
android:configChanges="orientation|keyboardHidden"
是防止横竖屏是界面重建的,
android:hardwareAccelerated="true"
是硬件加速。
以下贴出 mainActivity 中的代码:
public class OffersInfoActivity extends BaseActivity{
@BindView(R.id.wv)
WebView mWebView;
@BindView(R.id.video_fullView)
FrameLayout mVideoFullView;// 全屏时视频加载view
@BindView(R.id.receive)
AppCompatButton receive;
private View mCustomView;
private WebChromeClient.CustomViewCallback mCustomViewCallback;
private MyWebChromeClient mWebchromeclient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_offers_info)
ButterKnife.bind(this);
initViews();
initData();
setListener();
}
@Override
public int getContentViewId() {
return R.layout.activity_offers_info;
}
@Override
protected void initViews() {
WebSettings webSettings = mWebView.getSettings();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
webSettings.setDefaultTextEncodingName("utf-8") ;//这句话去掉也没事。。只是设置了编码格式
webSettings.setJavaScriptEnabled(true); //这句话必须保留。。不解释
webSettings.setDomStorageEnabled(true);//这句话必须保留。。否则无法播放优酷视频网页。。其他的可以
//重写一下,实现全屏播放
mWebchromeclient=new MyWebChromeClient();
mWebView.setWebChromeClient(mWebchromeclient);
mWebView.setWebViewClient(new WebViewClient(){//不写的话自动跳到默认浏览器了。。跳出APP了。。怎么能不写?
public boolean shouldOverrideUrlLoading(WebView view, String url) {//这个方法必须重写。否则会出现优酷视频周末无法播放。周一-周五可以播放的问题
if(url.startsWith("intent")||url.startsWith("youku")){
return true;
}else{
return super.shouldOverrideUrlLoading(view, url);
}
}
});
//加载html文件内容,注 s 为 String类型
mWebView.loadDataWithBaseURL(null, s, "text/html", "utf-8", null);
}
@Override
protected void initData() {
}
@Override
protected void setListener() {
}
@Override
protected void onDestroy() {
if (mWebView != null) {
mWebView.destroy();
}
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
mWebView.onResume();
mWebView.resumeTimers();
//设置为横屏
if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
@Override
protected void onPause() {
super.onPause();
mWebView.onPause();
mWebView.pauseTimers();
}
@OnClick({R.id.title_back, R.id.title_right, R.id.receive})
public void onViewClicked(View view) {
ViewsUtils.preventViewMultipleClick(view, 1000);
switch (view.getId()) {
case R.id.title_back:
if (inCustomView()) {
hideCustomView();
return;
} else {
mWebView.loadUrl("about:blank");
AppActivityManager.getInstance().finishActivity();
}
break;
case R.id.title_right://分享
dialog.show();
break;
case R.id.receive:
mPresenter.onReceive();
break;
}
}
/**判断是否是全屏**/
public boolean inCustomView() {
return (mCustomView != null);
}
/**全屏时按返加键执行退出全屏方法**/
public void hideCustomView() {
mWebchromeclient.onHideCustomView();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (inCustomView()) {
hideCustomView();
return true;
} else {
mWebView.loadUrl("about:blank");
AppActivityManager.getInstance().finishActivity();
}
}
return false;
}
private class MyWebChromeClient extends WebChromeClient {
// 播放网络视频时全屏会被调用的方法
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
mWebView.setVisibility(View.INVISIBLE);
// 如果一个视图已经存在,那么立刻终止并新建一个
if (mCustomView != null) {
callback.onCustomViewHidden();
return;
}
mVideoFullView.addView(view);
mCustomView = view;
mCustomViewCallback = callback;
mVideoFullView.setVisibility(View.VISIBLE);
}
// 视频播放退出全屏会被调用的
@Override
public void onHideCustomView() {
if (mCustomView == null){// 不是全屏播放状态
return;
}
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
mCustomView.setVisibility(View.GONE);
mVideoFullView.removeView(mCustomView);
mCustomView = null;
mVideoFullView.setVisibility(View.GONE);
mCustomViewCallback.onCustomViewHidden();
mWebView.setVisibility(View.VISIBLE);
}
}
}
注意,以上只是截取部分activity中需要全屏展示的webview加载视频的主要代码,复制到项目中时需要稍作修改,其实需要全屏加载,只涉及到
mWebchromeclient=new MyWebChromeClient();
mWebView.setWebChromeClient(mWebchromeclient);
的处理,MyWebChromeClient 继承自 WebChromeClient ,里面需要重写
onShowCustomView
和
onHideCustomView
方法,然后在这两个方法中对Webview和 mVideoFullView 进行处理。
最后,贴出 activity_layout.xml 的代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:background="@color/color_ffffff"
android:orientation="vertical"
tools:context="com.inm.ui.offersInfo.OffersInfoActivity">
<FrameLayout
android:id="@+id/video_fullView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" >
</FrameLayout>
<WebView
android:id="@+id/wv"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_0"
android:layout_weight="1">
</WebView>
以上即是对webView的全屏处理,注意,我代码中注释掉了 MyWebChromeClient 类中关于设置横竖屏的代码,也就是说我的webView全屏是在竖屏情况下的,若大家需要在实现全屏的情况下是横屏,则需要在它的基础上继续研究。
首先,贴activity在mainfast 中的声明:
<activity
android:name=".ui.offersInfo.OffersInfoActivity"
android:configChanges="orientation|keyboardHidden"
android:hardwareAccelerated="true"/>
需要注意的是
android:configChanges="orientation|keyboardHidden"
是防止横竖屏是界面重建的,
android:hardwareAccelerated="true"
是硬件加速。
以下贴出 mainActivity 中的代码:
public class OffersInfoActivity extends BaseActivity{
@BindView(R.id.wv)
WebView mWebView;
@BindView(R.id.video_fullView)
FrameLayout mVideoFullView;// 全屏时视频加载view
@BindView(R.id.receive)
AppCompatButton receive;
private View mCustomView;
private WebChromeClient.CustomViewCallback mCustomViewCallback;
private MyWebChromeClient mWebchromeclient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_offers_info)
ButterKnife.bind(this);
initViews();
initData();
setListener();
}
@Override
public int getContentViewId() {
return R.layout.activity_offers_info;
}
@Override
protected void initViews() {
WebSettings webSettings = mWebView.getSettings();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
}
webSettings.setDefaultTextEncodingName("utf-8") ;//这句话去掉也没事。。只是设置了编码格式
webSettings.setJavaScriptEnabled(true); //这句话必须保留。。不解释
webSettings.setDomStorageEnabled(true);//这句话必须保留。。否则无法播放优酷视频网页。。其他的可以
//重写一下,实现全屏播放
mWebchromeclient=new MyWebChromeClient();
mWebView.setWebChromeClient(mWebchromeclient);
mWebView.setWebViewClient(new WebViewClient(){//不写的话自动跳到默认浏览器了。。跳出APP了。。怎么能不写?
public boolean shouldOverrideUrlLoading(WebView view, String url) {//这个方法必须重写。否则会出现优酷视频周末无法播放。周一-周五可以播放的问题
if(url.startsWith("intent")||url.startsWith("youku")){
return true;
}else{
return super.shouldOverrideUrlLoading(view, url);
}
}
});
//加载html文件内容,注 s 为 String类型
mWebView.loadDataWithBaseURL(null, s, "text/html", "utf-8", null);
}
@Override
protected void initData() {
}
@Override
protected void setListener() {
}
@Override
protected void onDestroy() {
if (mWebView != null) {
mWebView.destroy();
}
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
mWebView.onResume();
mWebView.resumeTimers();
//设置为横屏
if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
@Override
protected void onPause() {
super.onPause();
mWebView.onPause();
mWebView.pauseTimers();
}
@OnClick({R.id.title_back, R.id.title_right, R.id.receive})
public void onViewClicked(View view) {
ViewsUtils.preventViewMultipleClick(view, 1000);
switch (view.getId()) {
case R.id.title_back:
if (inCustomView()) {
hideCustomView();
return;
} else {
mWebView.loadUrl("about:blank");
AppActivityManager.getInstance().finishActivity();
}
break;
case R.id.title_right://分享
dialog.show();
break;
case R.id.receive:
mPresenter.onReceive();
break;
}
}
/**判断是否是全屏**/
public boolean inCustomView() {
return (mCustomView != null);
}
/**全屏时按返加键执行退出全屏方法**/
public void hideCustomView() {
mWebchromeclient.onHideCustomView();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (inCustomView()) {
hideCustomView();
return true;
} else {
mWebView.loadUrl("about:blank");
AppActivityManager.getInstance().finishActivity();
}
}
return false;
}
private class MyWebChromeClient extends WebChromeClient {
// 播放网络视频时全屏会被调用的方法
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
mWebView.setVisibility(View.INVISIBLE);
// 如果一个视图已经存在,那么立刻终止并新建一个
if (mCustomView != null) {
callback.onCustomViewHidden();
return;
}
mVideoFullView.addView(view);
mCustomView = view;
mCustomViewCallback = callback;
mVideoFullView.setVisibility(View.VISIBLE);
}
// 视频播放退出全屏会被调用的
@Override
public void onHideCustomView() {
if (mCustomView == null){// 不是全屏播放状态
return;
}
// setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
mCustomView.setVisibility(View.GONE);
mVideoFullView.removeView(mCustomView);
mCustomView = null;
mVideoFullView.setVisibility(View.GONE);
mCustomViewCallback.onCustomViewHidden();
mWebView.setVisibility(View.VISIBLE);
}
}
}
注意,以上只是截取部分activity中需要全屏展示的webview加载视频的主要代码,复制到项目中时需要稍作修改,其实需要全屏加载,只涉及到
mWebchromeclient=new MyWebChromeClient();
mWebView.setWebChromeClient(mWebchromeclient);
的处理,MyWebChromeClient 继承自 WebChromeClient ,里面需要重写
onShowCustomView
和
onHideCustomView
方法,然后在这两个方法中对Webview和 mVideoFullView 进行处理。
最后,贴出 activity_layout.xml 的代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:background="@color/color_ffffff"
android:orientation="vertical"
tools:context="com.inm.ui.offersInfo.OffersInfoActivity">
<FrameLayout
android:id="@+id/video_fullView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" >
</FrameLayout>
<WebView
android:id="@+id/wv"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_0"
android:layout_weight="1">
</WebView>
以上即是对webView的全屏处理,注意,我代码中注释掉了 MyWebChromeClient 类中关于设置横竖屏的代码,也就是说我的webView全屏是在竖屏情况下的,若大家需要在实现全屏的情况下是横屏,则需要在它的基础上继续研究。
0 0
- webView全屏播放的问题
- android webview 播放视频 全屏问题
- webview全屏播放html5的视频
- WebView实现全屏播放的一种方法
- 关于Android中使用WebView播放网络视频不能全屏的问题
- android webview: 视频全屏播放按返回页面被放大的问题
- Android用Webview播放优酷视频全屏问题
- WebView 加载网页内部video 横向全屏播放问题
- WebView全屏播放h5视频
- WebView播放视频的问题
- android 4.0以上WebView不能全屏播放视频的解决办法
- android 4.0以上WebView不能全屏播放视频的解决办法
- Android中加载WebView的H5全屏视频播放
- Android webview全屏播放HTML5中的视频
- WebView播放html5视频和全屏。
- Android WebView “曲线救国” 实现全屏播放
- Android使用WebView全屏播放网页视频
- android webView 全屏播放网络视频
- 530 Error: A secure connection is requiered(such as ssl).
- [LeetCode]136. Single Number
- HDU 4804 Campus Design(状压DP)
- 学生成绩管理系统(转载)
- POJ NOI0105-40 数1的个数
- webView全屏播放的问题
- 嵌入式编程与PC编程有何区别
- Java 常用设计模式-代理模式Proxy
- 第38题
- 39. Combination Sum-dfs
- POJ 1076 Bowl 笔记
- Spring学习笔记之通过Spring和JDBC征服数据库
- scala数组的使用
- 求素数