package com.androidwebviewdemo; import android.app.Activity; import android.app.ProgressDialog; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.Window; import android.view.WindowManager; import android.webkit.WebChromeClient; import android.webkit.WebChromeClient.CustomViewCallback; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.FrameLayout; /** * 使用WebView播放视频时需要注意的地方: * 1、加网络访问权限(及其他所需要的权限); * 2、WebViewClient中方法shouldOverrideUrlLoading可用来实现点击webView页面的链接; * 3、WebView中播放视频需要添加webView.setWebChromeClient(new WebChromeClient()); * 4、视频竖屏时,点击全屏,想要切换到横屏全屏的状态,那么必须在Manifest.xml配置文件该Activity的 * 配置文件中添加android:configChanges="orientation|screenSize"语句。 * 5、如果视频不能播放,或者播放比较卡,可以采用硬件加速,即在Application,或所在的Activity的配置文件中添加 * android:hardwareAccelerated="true"即可。 * @author zhongyao */ public class MainActivity extends Activity { private WebView webView; private FrameLayout video_fullView; // 全屏时视频加载view private View xCustomView; private ProgressDialog waitdialog = null ; private CustomViewCallback xCustomViewCallback; private myWebChromeClient xwebchromeclient; @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); // 去掉应用标题 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_main); waitdialog = new ProgressDialog( this ); waitdialog.setTitle( "提示" ); waitdialog.setMessage( "视频页面加载中..." ); waitdialog.setIndeterminate( true ); waitdialog.setCancelable( true ); waitdialog.show(); webView = (WebView) findViewById(R.id.webView); video_fullView = (FrameLayout) findViewById(R.id.video_fullView); WebSettings ws = webView.getSettings(); ws.setBuiltInZoomControls( true ); // 隐藏缩放按钮 // ws.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);// 排版适应屏幕 ws.setUseWideViewPort( true ); // 可任意比例缩放 ws.setLoadWithOverviewMode( true ); // setUseWideViewPort方法设置webview推荐使用的窗口。setLoadWithOverviewMode方法是设置webview加载的页面的模式。 ws.setSavePassword( true ); ws.setSaveFormData( true ); // 保存表单数据 ws.setJavaScriptEnabled( true ); ws.setGeolocationEnabled( true ); // 启用地理定位 ws.setGeolocationDatabasePath( "/data/data/org.itri.html5webview/databases/" ); // 设置定位的数据库路径 ws.setDomStorageEnabled( true ); ws.setSupportMultipleWindows( true ); // 新加 xwebchromeclient = new myWebChromeClient(); webView.setWebChromeClient(xwebchromeclient); webView.setWebViewClient( new myWebViewClient()); webView.loadUrl( "http://look.appjx.cn/mobile_api.php?mod=news&id=12604" ); } public class myWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return false ; } @Override public void onPageFinished(WebView view, String url) { super .onPageFinished(view, url); waitdialog.dismiss(); } } public class myWebChromeClient extends WebChromeClient { private View xprogressvideo; // 播放网络视频时全屏会被调用的方法 @Override public void onShowCustomView(View view, CustomViewCallback callback) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); webView.setVisibility(View.INVISIBLE); // 如果一个视图已经存在,那么立刻终止并新建一个 if (xCustomView != null ) { callback.onCustomViewHidden(); return ; } video_fullView.addView(view); xCustomView = view; xCustomViewCallback = callback; video_fullView.setVisibility(View.VISIBLE); } // 视频播放退出全屏会被调用的 @Override public void onHideCustomView() { if (xCustomView == null ) // 不是全屏播放状态 return ; setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); xCustomView.setVisibility(View.GONE); video_fullView.removeView(xCustomView); xCustomView = null ; video_fullView.setVisibility(View.GONE); xCustomViewCallback.onCustomViewHidden(); webView.setVisibility(View.VISIBLE); } // 视频加载时进程loading @Override public View getVideoLoadingProgressView() { if (xprogressvideo == null ) { LayoutInflater inflater = LayoutInflater .from(MainActivity. this ); xprogressvideo = inflater.inflate( R.layout.video_loading_progress, null ); } return xprogressvideo; } } /** * 判断是否是全屏 * * @return */ public boolean inCustomView() { return (xCustomView != null ); } /** * 全屏时按返加键执行退出全屏方法 */ public void hideCustomView() { xwebchromeclient.onHideCustomView(); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } @Override protected void onResume() { super .onResume(); super .onResume(); webView.onResume(); webView.resumeTimers(); /** * 设置为横屏 */ if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } } @Override protected void onPause() { super .onPause(); webView.onPause(); webView.pauseTimers(); } @Override protected void onDestroy() { super .onDestroy(); super .onDestroy(); video_fullView.removeAllViews(); webView.loadUrl( "about:blank" ); webView.stopLoading(); webView.setWebChromeClient( null ); webView.setWebViewClient( null ); webView.destroy(); webView = null ; } @Override public boolean onKeyDown( int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { if (inCustomView()) { // webViewDetails.loadUrl("about:blank"); hideCustomView(); return true ; } else { webView.loadUrl( "about:blank" ); MainActivity. this .finish(); } } return false ; } } |