首页 > 系统 > Android > 正文

Android编程实现WebView全屏播放的方法(附源码下载)

2019-10-24 20:33:42
字体:
来源:转载
供稿:网友
这篇文章主要介绍了Android编程实现WebView全屏播放的方法,结合实例形式较为详细的分析了Android实现WebView全屏播放的布局与功能相关技巧,需要的朋友可以参考下
 

本文实例讲述了Android编程实现WebView全屏播放的方法。分享给大家供大家参考,具体如下:

最近因为项目要用webview加载html5的视频,开始不能全屏播,做了很久才做出来!那按我的理解说下怎么实现全屏吧。

首先写布局文件activity_main.xml:
 

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  2.  xmlns:tools="http://schemas.android.com/tools" 
  3.  android:id="@+id/container" 
  4.  android:layout_width="fill_parent" 
  5.  android:layout_height="fill_parent" 
  6.  android:orientation="vertical"
  7.  <FrameLayout 
  8.   android:id="@+id/video_view" 
  9.   android:layout_width="fill_parent" 
  10.   android:layout_height="fill_parent" 
  11.   android:visibility="gone" 
  12.   ></FrameLayout> 
  13.  <Button 
  14.   android:id="@+id/video_landport" 
  15.   android:layout_width="fill_parent" 
  16.   android:layout_height="wrap_content" 
  17.   android:text="全屏不显示该按扭,点击切换横屏" 
  18.   android:gravity="center" 
  19.   /> 
  20.  <WebView 
  21.   android:id="@+id/video_webview" 
  22.   android:layout_width="fill_parent" 
  23.   android:layout_height="fill_parent" 
  24.   /> 
  25.  </LinearLayout> 
?

原理:实现全屏的时候把webview里的视频放到一个View(布局里的video_view控件)里面,然后把webview隐藏掉!这样就实现了全屏播放的!
现在具体来看看怎么实现的:

先放代码MainActivity.java:
 

  1. public class MainActivity extends Activity { 
  2.  private FrameLayout videoview;// 全屏时视频加载view 
  3.  private Button videolandport; 
  4.  private WebView videowebview; 
  5.  private Boolean islandport = true;//true表示此时是竖屏,false表示此时横屏。 
  6.  private View xCustomView; 
  7.  private xWebChromeClient xwebchromeclient; 
  8.  private String url = "http://look.appjx.cn/mobile_api.php?mod=news&id=12604"
  9.  private WebChromeClient.CustomViewCallback  xCustomViewCallback; 
  10.  @Override 
  11.  protected void onCreate(Bundle savedInstanceState) { 
  12.   super.onCreate(savedInstanceState); 
  13.   requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉应用标题 
  14.   getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
  15.     WindowManager.LayoutParams.FLAG_FULLSCREEN); 
  16.   setContentView(R.layout.activity_main); 
  17.   initwidget(); 
  18.   initListener(); 
  19.   videowebview.loadUrl(url); 
  20.  } 
  21.  private void initListener() { 
  22.   // TODO Auto-generated method stub 
  23.   videolandport.setOnClickListener(new Listener()); 
  24.  } 
  25.  private void initwidget() { 
  26.   // TODO Auto-generated method stub 
  27.   videoview = (FrameLayout) findViewById(R.id.video_view); 
  28.   videolandport = (Button) findViewById(R.id.video_landport); 
  29.   videowebview = (WebView) findViewById(R.id.video_webview); 
  30.   WebSettings ws = videowebview.getSettings(); 
  31.   /** 
  32.    * setAllowFileAccess 启用或禁止WebView访问文件数据 setBlockNetworkImage 是否显示网络图像 
  33.    * setBuiltInZoomControls 设置是否支持缩放 setCacheMode 设置缓冲的模式 
  34.    * setDefaultFontSize 设置默认的字体大小 setDefaultTextEncodingName 设置在解码时使用的默认编码 
  35.    * setFixedFontFamily 设置固定使用的字体 setJavaSciptEnabled 设置是否支持Javascript 
  36.    * setLayoutAlgorithm 设置布局方式 setLightTouchEnabled 设置用鼠标激活被选项 
  37.    * setSupportZoom 设置是否支持变焦 
  38.    * */ 
  39.   ws.setBuiltInZoomControls(true);// 隐藏缩放按钮 
  40.   ws.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);// 排版适应屏幕 
  41.   ws.setUseWideViewPort(true);// 可任意比例缩放 
  42.   ws.setLoadWithOverviewMode(true);// setUseWideViewPort方法设置webview推荐使用的窗口。setLoadWithOverviewMode方法是设置webview加载的页面的模式。 
  43.   ws.setSavePassword(true); 
  44.   ws.setSaveFormData(true);// 保存表单数据 
  45.   ws.setJavaScriptEnabled(true); 
  46.   ws.setGeolocationEnabled(true);// 启用地理定位 
  47.   ws.setGeolocationDatabasePath("/data/data/org.itri.html5webview/databases/");// 设置定位的数据库路径 
  48.   ws.setDomStorageEnabled(true); 
  49.   xwebchromeclient = new xWebChromeClient(); 
  50.   videowebview.setWebChromeClient(xwebchromeclient); 
  51.   videowebview.setWebViewClient(new xWebViewClientent()); 
  52.  } 
  53.  class Listener implements OnClickListener { 
  54.   @Override 
  55.   public void onClick(View v) { 
  56.    // TODO Auto-generated method stub 
  57.    switch (v.getId()) { 
  58.    case R.id.video_landport: 
  59.     if (islandport) { 
  60.      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
  61.      videolandport.setText("全屏不显示该按扭,点击切换横屏"); 
  62.     }else { 
  63.      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  
  64.      videolandport.setText("全屏不显示该按扭,点击切换竖屏"); 
  65.     } 
  66.     break
  67.    default
  68.     break
  69.    } 
  70.   } 
  71.  } 
  72.   @Override 
  73.   public boolean onKeyDown(int keyCode, KeyEvent event) { 
  74.    if (keyCode == KeyEvent.KEYCODE_BACK) { 
  75.     if (inCustomView()) { 
  76.      hideCustomView(); 
  77.      return true
  78.     }else { 
  79.     videowebview.loadUrl("about:blank"); 
  80. //     mTestWebView.loadData("", "text/html; charset=UTF-8", null); 
  81.     MainActivity.this.finish(); 
  82.      Log.i("testwebview""===>>>2"); 
  83.    } 
  84.    } 
  85.    return true
  86.   } 
  87.   /** 
  88.   * 判断是否是全屏 
  89.   * @return 
  90.   */ 
  91.   public boolean inCustomView() { 
  92.     return (xCustomView != null); 
  93.    } 
  94.    /** 
  95.    * 全屏时按返加键执行退出全屏方法 
  96.    */ 
  97.    public void hideCustomView() { 
  98.     xwebchromeclient.onHideCustomView(); 
  99.    } 
  100.  /** 
  101.   * 处理Javascript的对话框、网站图标、网站标题以及网页加载进度等 
  102.   * @author 
  103.   */ 
  104.  public class xWebChromeClient extends WebChromeClient { 
  105.   private Bitmap xdefaltvideo; 
  106.   private View xprogressvideo; 
  107.   @Override 
  108.   //播放网络视频时全屏会被调用的方法 
  109.   public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) 
  110.   { 
  111.    if (islandport) { 
  112.    } 
  113.    else
  114. //    ii = "1"; 
  115. //    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  
  116.    } 
  117.    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);  
  118.    videowebview.setVisibility(View.GONE); 
  119.    //如果一个视图已经存在,那么立刻终止并新建一个 
  120.    if (xCustomView != null) { 
  121.     callback.onCustomViewHidden(); 
  122.     return
  123.    }    
  124.    videoview.addView(view); 
  125.    xCustomView = view; 
  126.    xCustomViewCallback = callback; 
  127.    videoview.setVisibility(View.VISIBLE); 
  128.   } 
  129.   @Override 
  130.   //视频播放退出全屏会被调用的 
  131.   public void onHideCustomView() { 
  132.    if (xCustomView == null)//不是全屏播放状态 
  133.     return;       
  134.    // Hide the custom view. 
  135.    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  
  136.    xCustomView.setVisibility(View.GONE); 
  137.    // Remove the custom view from its container. 
  138.    videoview.removeView(xCustomView); 
  139.    xCustomView = null
  140.    videoview.setVisibility(View.GONE); 
  141.    xCustomViewCallback.onCustomViewHidden(); 
  142.    videowebview.setVisibility(View.VISIBLE); 
  143.    //Log.i(LOGTAG, "set it to webVew"); 
  144.   } 
  145.   //视频加载添加默认图标 
  146.   @Override 
  147.   public Bitmap getDefaultVideoPoster() { 
  148.    //Log.i(LOGTAG, "here in on getDefaultVideoPoster");  
  149.    if (xdefaltvideo == null) { 
  150.     xdefaltvideo = BitmapFactory.decodeResource( 
  151.       getResources(), R.drawable.videoicon); 
  152.    } 
  153.    return xdefaltvideo; 
  154.   } 
  155.   //视频加载时进程loading 
  156.   @Override 
  157.   public View getVideoLoadingProgressView() { 
  158.    //Log.i(LOGTAG, "here in on getVideoLoadingPregressView"); 
  159.    if (xprogressvideo == null) { 
  160.     LayoutInflater inflater = LayoutInflater.from(MainActivity.this); 
  161.     xprogressvideo = inflater.inflate(R.layout.video_loading_progress, null); 
  162.    } 
  163.    return xprogressvideo;  
  164.   } 
  165.   //网页标题 
  166.    @Override 
  167.    public void onReceivedTitle(WebView view, String title) { 
  168.    (MainActivity.this).setTitle(title); 
  169.    } 
  170. //   @Override 
  171. //  //当WebView进度改变时更新窗口进度 
  172. //   public void onProgressChanged(WebView view, int newProgress) { 
  173. //    (MainActivity.this).getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress*100); 
  174. //   }   
  175.  } 
  176.  /** 
  177.   * 处理各种通知、请求等事件 
  178.   * @author 
  179.   */ 
  180.  public class xWebViewClientent extends WebViewClient { 
  181.    @Override 
  182.    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
  183.     Log.i("webviewtest""shouldOverrideUrlLoading: "+url); 
  184.     return false
  185.    } 
  186.  } 
  187.  /** 
  188.   * 当横竖屏切换时会调用该方法 
  189.   * @author 
  190.   */ 
  191.  @Override 
  192.  public void onConfigurationChanged(Configuration newConfig) { 
  193.   Log.i("testwebview""=====<<< onConfigurationChanged >>>====="); 
  194.    super.onConfigurationChanged(newConfig); 
  195.    if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){ 
  196.     Log.i("webview"" 现在是横屏1"); 
  197.     islandport = false
  198.    }else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){ 
  199.     Log.i("webview"" 现在是竖屏1"); 
  200.     islandport = true
  201.    } 
  202.  } 
?

代码里面我写了好多注释,相信大家都能看得懂,当然本人是菜鸟,可能有些地方理解错了!知道的可以跟我说。然后我在里面加了一个功能,就是点击webview上面按钮切换横竖屏!还有就是当点击全屏播放的时候强制横屏全屏播放,点击返回时回到竖屏!我这里没有用手机重力感应切换横竖屏!代码里面还加了个播放进度的布局文件,大家在源码里可以看到!

最后说下AndroidManifest.xml设置;

访问网络权限加上这句

复制代码代码如下:
<uses-permission android:name="android.permission.INTERNET"/>

当切换横竖屏时为了不重新调用onCreate等方法,要加个这句:
复制代码代码如下:
android:configChanges="orientation|keyboardHidden|screenSize"

差不多这样就可以实现全屏播放了,如果有看不懂的问题可以问我,

 

完整实例代码代码点击此处本站下载。

希望本文所述对大家Android程序设计有所帮助。



注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表