android webview全屏视频,Android WebView中HTML5视频全屏的实现

项目中遇到的问题,activity中有webview控件来加载对应的HTML5网页,其中视频可以正常播放,但是当点击全屏时会出现有声音但是画面卡住的异常现象。结合网上前辈的代码片段,自己也尝试了下改进下,终于解决。

实现全屏需要复写WebChromeClient两个回调方法,其中关键就是WebView控件的父节点Layout需要实例化,并在两个回调方法中对WebView进行remove和add,即ViewGroup对View的remove和add操作。

关键代码如下,其中注意onPause()和onResume中对于Activity处于pause和resume状态下媒体暂停和继续播放的处理,还有onKeyUp()和onBackPressed()对于全屏状态下点击back键的处理:

public class TestActivity extends Activity {

private MyWebView mWebView;

private RelativeLayout rl_footLayout;

private View myView = null;

private CustomViewCallback myCallback = null;

private MyWebChromeClient myChromeClient;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main_activity);

rl_footLayout = (RelativeLayout) findViewById(R.id.layout_interactive_detail);

mWebView = (MyWebView) findViewById(R.id.interactive_activity_mywebview);

}

@Override

protected void onDestroy() {

super.onDestroy();

if (mWebView != null) {

mWebView.setVisibility(View.GONE);

mWebView.destroy();

}

}

@Override

protected void onResume() {

super.onResume();

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {

try {

mWebView.getClass().getMethod("onResume")

.invoke(mWebView, (Object[]) null);

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvocationTargetException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchMethodException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

private void loadUrl(String Url) {

if (TextUtils.isEmpty(Url)) {

Url = "http://www.xxx.com";

}

mWebView.loadUrl(Url);

mWebView.addJavascriptInterface(new ProxyBridge(this), "ClientProxy");

myChromeClient = new MyWebChromeClient();

mWebView.setWebChromeClient(myChromeClient);

}

@Override

public boolean onKeyUp(int keyCode, KeyEvent event) {

if (keyCode == KeyEvent.KEYCODE_BACK) {

if (mWebView.canGoBack()) {

this.onBackPressed();

if (myView != null) {

mWebView.goBack();

}

} else {

return super.onKeyUp(keyCode, event);

}

return true;

}

return super.onKeyUp(keyCode, event);

}

@Override

protected void onPause() {

super.onPause();

// TODO Auto-generated method stub

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) {

try {

mWebView.getClass().getMethod("onPause")

.invoke(mWebView, (Object[]) null);

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvocationTargetException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchMethodException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

/**

* 复写该类两个方法,使HTML5上视频可以全屏播放

*

* @author wwei

*

*/

private class MyWebChromeClient extends WebChromeClient {

@Override

public void onHideCustomView() {

// TODO Auto-generated method stub

// super.onHideCustomView();

if (myView == null) {

return;

}

rl_footLayout.removeView(myView);

rl_footLayout.addView(mWebView);

quitFullScreen();

myView = null;

myCallback.onCustomViewHidden();

}

@Override

public void onShowCustomView(View view, CustomViewCallback callback) {

// TODO Auto-generated method stub

// super.onShowCustomView(view, callback);

if (myView != null) {

callback.onCustomViewHidden();

return;

}

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(

RelativeLayout.LayoutParams.MATCH_PARENT,

RelativeLayout.LayoutParams.WRAP_CONTENT);

layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);

view.setLayoutParams(layoutParams);

enterFullScreen();

rl_footLayout.removeView(mWebView);

rl_footLayout.addView(view);

myView = view;

myCallback = callback;

}

}

@Override

public void onBackPressed() {

if (myView == null) {

super.onBackPressed();

} else {

myChromeClient.onHideCustomView();

}

}

private void enterFullScreen() {

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

}

private void quitFullScreen() {

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

WindowManager.LayoutParams attrs = getWindow().getAttributes();

attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);

getWindow().setAttributes(attrs);

getWindow()

.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值