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

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

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

首先写布局文件activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/container"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:orientation="vertical">
 <FrameLayout
  android:id="@+id/video_view"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:visibility="gone"
  ></FrameLayout>
 <Button
  android:id="@+id/video_landport"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="全屏不显示该按扭,点击切换横屏"
  android:gravity="center"
  />
 <WebView
  android:id="@+id/video_webview"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  />
 </LinearLayout>

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

先放代码MainActivity.java:

public class MainActivity extends Activity {
 private FrameLayout videoview;// 全屏时视频加载view
 private Button videolandport;
 private WebView videowebview;
 private Boolean islandport = true;//true表示此时是竖屏,false表示此时横屏。
 private View xCustomView;
 private xWebChromeClient xwebchromeclient;
 private String url = "http://look.appjx.cn/mobile_api.php?mod=news&id=12604";
 private WebChromeClient.CustomViewCallback  xCustomViewCallback;
 @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);
  initwidget();
  initListener();
  videowebview.loadUrl(url);
 }
 private void initListener() {
  // TODO Auto-generated method stub
  videolandport.setOnClickListener(new Listener());
 }
 private void initwidget() {
  // TODO Auto-generated method stub
  videoview = (FrameLayout) findViewById(R.id.video_view);
  videolandport = (Button) findViewById(R.id.video_landport);
  videowebview = (WebView) findViewById(R.id.video_webview);
  WebSettings ws = videowebview.getSettings();
  /**
   * setAllowFileAccess 启用或禁止WebView访问文件数据 setBlockNetworkImage 是否显示网络图像
   * setBuiltInZoomControls 设置是否支持缩放 setCacheMode 设置缓冲的模式
   * setDefaultFontSize 设置默认的字体大小 setDefaultTextEncodingName 设置在解码时使用的默认编码
   * setFixedFontFamily 设置固定使用的字体 setJavaSciptEnabled 设置是否支持Javascript
   * setLayoutAlgorithm 设置布局方式 setLightTouchEnabled 设置用鼠标激活被选项
   * setSupportZoom 设置是否支持变焦
   * */
  ws.setBuiltInZoomControls(true);// 隐藏缩放按钮
  ws.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);// 排版适应屏幕
  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);
  xwebchromeclient = new xWebChromeClient();
  videowebview.setWebChromeClient(xwebchromeclient);
  videowebview.setWebViewClient(new xWebViewClientent());
 }
 class Listener implements OnClickListener {
  @Override
  public void onClick(View v) {
   // TODO Auto-generated method stub
   switch (v.getId()) {
   case R.id.video_landport:
    if (islandport) {
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
     videolandport.setText("全屏不显示该按扭,点击切换横屏");
    }else {
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
     videolandport.setText("全屏不显示该按扭,点击切换竖屏");
    }
    break;
   default:
    break;
   }
  }
 }
  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
   if (keyCode == KeyEvent.KEYCODE_BACK) {
    if (inCustomView()) {
     hideCustomView();
     return true;
    }else {
    videowebview.loadUrl("about:blank");
//     mTestWebView.loadData("", "text/html; charset=UTF-8", null);
    MainActivity.this.finish();
     Log.i("testwebview", "===>>>2");
   }
   }
   return true;
  }
  /**
  * 判断是否是全屏
  * @return
  */
  public boolean inCustomView() {
    return (xCustomView != null);
   }
   /**
   * 全屏时按返加键执行退出全屏方法
   */
   public void hideCustomView() {
    xwebchromeclient.onHideCustomView();
   }
 /**
  * 处理Javascript的对话框、网站图标、网站标题以及网页加载进度等
  * @author
  */
 public class xWebChromeClient extends WebChromeClient {
  private Bitmap xdefaltvideo;
  private View xprogressvideo;
  @Override
  //播放网络视频时全屏会被调用的方法
  public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback)
  {
   if (islandport) {
   }
   else{
//    ii = "1";
//    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
   }
   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
   videowebview.setVisibility(View.GONE);
   //如果一个视图已经存在,那么立刻终止并新建一个
   if (xCustomView != null) {
    callback.onCustomViewHidden();
    return;
   }
   videoview.addView(view);
   xCustomView = view;
   xCustomViewCallback = callback;
   videoview.setVisibility(View.VISIBLE);
  }
  @Override
  //视频播放退出全屏会被调用的
  public void onHideCustomView() {
   if (xCustomView == null)//不是全屏播放状态
    return;
   // Hide the custom view.
   setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
   xCustomView.setVisibility(View.GONE);
   // Remove the custom view from its container.
   videoview.removeView(xCustomView);
   xCustomView = null;
   videoview.setVisibility(View.GONE);
   xCustomViewCallback.onCustomViewHidden();
   videowebview.setVisibility(View.VISIBLE);
   //Log.i(LOGTAG, "set it to webVew");
  }
  //视频加载添加默认图标
  @Override
  public Bitmap getDefaultVideoPoster() {
   //Log.i(LOGTAG, "here in on getDefaultVideoPoster");
   if (xdefaltvideo == null) {
    xdefaltvideo = BitmapFactory.decodeResource(
      getResources(), R.drawable.videoicon);
   }
   return xdefaltvideo;
  }
  //视频加载时进程loading
  @Override
  public View getVideoLoadingProgressView() {
   //Log.i(LOGTAG, "here in on getVideoLoadingPregressView");
   if (xprogressvideo == null) {
    LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
    xprogressvideo = inflater.inflate(R.layout.video_loading_progress, null);
   }
   return xprogressvideo;
  }
  //网页标题
   @Override
   public void onReceivedTitle(WebView view, String title) {
   (MainActivity.this).setTitle(title);
   }
//   @Override
//  //当WebView进度改变时更新窗口进度
//   public void onProgressChanged(WebView view, int newProgress) {
//    (MainActivity.this).getWindow().setFeatureInt(Window.FEATURE_PROGRESS, newProgress*100);
//   }
 }
 /**
  * 处理各种通知、请求等事件
  * @author
  */
 public class xWebViewClientent extends WebViewClient {
   @Override
   public boolean shouldOverrideUrlLoading(WebView view, String url) {
    Log.i("webviewtest", "shouldOverrideUrlLoading: "+url);
    return false;
   }
 }
 /**
  * 当横竖屏切换时会调用该方法
  * @author
  */
 @Override
 public void onConfigurationChanged(Configuration newConfig) {
  Log.i("testwebview", "=====<<< onConfigurationChanged >>>=====");
   super.onConfigurationChanged(newConfig);
   if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
    Log.i("webview", " 现在是横屏1");
    islandport = false;
   }else if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
    Log.i("webview", " 现在是竖屏1");
    islandport = true;
   }
 }
}

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

最后说下AndroidManifest.xml设置;

访问网络权限加上这句

代码如下:

<uses-permission android:name="android.permission.INTERNET"/>

当切换横竖屏时为了不重新调用onCreate等方法,要加个这句:

代码如下:

android:configChanges="orientation|keyboardHidden|screenSize"

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

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

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

时间: 2015-11-16

Android4.2中全屏或者取消标题栏的方法总结

先介绍去掉标题栏的方法: 第一种:也一般入门的时候经常使用的一种方法 requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏注意这句一定要写在setContentView()方法的前面,不然会报错的 第二种:在AndroidManifest.xml文件中定义 复制代码 代码如下: <application android:icon="@drawable/icon" android:label="@string/app_

android 设置全屏的两种方法

现在android的每一个项目都会需要设置为全屏,现在介绍两种设置为全屏的方式. 一.在配置文件中设置android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" 如: 二.在activity中设置 这两种方式都可以设置全屏,任选其一即可.

android activity设置无标题实现全屏

Activity设置全屏和无标题栏,要用到andorid.view.Window和Android.view.WindowManager. Window.FEATURE_NO_TITLE表示无标题栏. WindowManager.LayoutParams.FLAG_FULLSCREEN表示全屏. 具体用法如下: 1.设置全屏可以使用如下代码: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager

Android开发之全屏与非全屏的切换设置方法小结

本文实例讲述了Android开发之全屏与非全屏的切换设置方法.分享给大家供大家参考,具体如下: 静态方法 1. 代码方式 在Activity类OnCreate方法中设置,代码如下 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().se

android全屏去掉title栏的多种实现方法

1.实现应用中的所有activity都全屏 在manifest中直接加入 复制代码 代码如下: android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 2.实现单个activity全屏 复制代码 代码如下: requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.TYPE_STATUS_BAR

Android编程实现播放视频时切换全屏并隐藏状态栏的方法

本文实例讲述了Android编程实现播放视频时切换全屏并隐藏状态栏的方法.分享给大家供大家参考,具体如下: 1. Demo示例: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (this.getResources().getConfiguration().ori

Android 全屏无标题栏的三种实现方法

一.通过Java代码 在setContentView之前执行: requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题栏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//隐藏状态栏 二.调用Android自带的Theme 直接在AndroidManifest.xml中需要全屏显

Android下Activity全屏显示实现方法

本文较为详细的讲述了Android下Activity全屏显示实现方法.分享给大家供大家参考.具体方法如下: 方法一: 使用xml的方法,在该项目的AndroidManifest.xml文件中,在需要全屏的Activity元素中添加属性: 复制代码 代码如下: android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 这样就可以实现这个Activity的全屏显示,如果只是不要标题栏,即需要保留系统自带的任务栏的话,则使用: 复制

Android 设置应用全屏的两种解决方法

在开发中我们经常需要把我们的应用设置为全屏,有两种方法,一中是在代码中设置,另一种方法是在配置文件里改! 一.在代码中设置: 复制代码 代码如下: package com.android.tutor;  import android.app.Activity;  import android.os.Bundle;  import android.view.Window;  import android.view.WindowManager;  public class OpenGl_Lesson

android 中去掉窗口全屏显示的简单方法

复制代码 代码如下: //去掉窗口        requestWindowFeature(Window.FEATURE_NO_TITLE);(一定要放在setContentView(R.layout.main)的前面)        //全屏显示        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

Android中3种全屏方法及3种去掉标题栏的方法

一.去掉标题栏的方法 第一种:入门的时候经常使用的一种方法 复制代码 代码如下: requestWindowFeature(Window.FEATURE_NO_TITLE);  //去掉标题栏注意这句一定要写在setContentView()方法的前面,不然会报错的 第二种:在AndroidManifest.xml文件中定义 复制代码 代码如下: <application android:icon="@drawable/icon" android:label="@str

android 中ProgressDialog实现全屏效果的示例

做项目的时候,直接用到了一个ProgressDialog,需要实现全屏的效果,如下图所示,功能跑起来的时候发现不是全屏,只是包裹了当前的内容,如下图所示,不过查找一些资料,把问题解决了. ProgressDialog 继承自AlertDialog,AlertDialog继承自Dialog,实现DialogInterface接口. ProgressDialog的创建方式有两种,一种是new Dialog ,一种是调用Dialog的静态方法Dialog.show(). // 方式一:new Dial

Android 4.0 设置全屏修改的解决方法

最近在做一个平板的应用,底部的BACK HOME 还有电池WIFI的那一条STATUS_BAR设置全屏后怎么也去不掉,查找资料后,发现一个比较好的方法,在此分享 第一种方式(程序代码): 在OnCreate里添加一行语句 复制代码 代码如下: getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); 在setContentView之前哦. 过时的一个方法: 复制代码 代码如下: getWi

Android中Fragment的分屏显示处理横竖屏显示的实现方法

演示效果如下: 另外在竖屏的时候是这样的效果: 布局文件如下: 可以看出有两个资源文件,一个是处理横屏一个是竖屏 第一个: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent&qu

Android中Activity启动默认不显示输入法解决方法

checkbox控件时导致Activity启动默认不显示输入法. 网上很多资料说要放一个空的Linearlayout,完全是在误导大众, 正确的方法如下: Android Manifest对Activity做如下设置: 复制代码 代码如下: android:windowSoftInputMode="stateHidden"

Android编程之界面实现全屏显示的方法(2种方法)

本文实例讲述了Android编程之界面实现全屏显示的方法.分享给大家供大家参考,具体如下: 在开发android的应用当中,我们会遇到将一些界面设置为全屏显示的格式,有两种实现的方法.其一是在Java代码中实现,其二是在配置文件中实现. 1. 在Java代码中设置 super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); //无title getWindow().setFlags(Wind

Android 实现全屏显示的几种方法整理

Android 实现全屏显示的几种方法整理 A.设置主题实现全屏 直接在AndroidManifest.xml文件中设定Activity主题为全屏模式 android:theme="@android:style/Theme.NoTitleBar.Fullscreen" B.代码实现全屏 代码实现需要分两步做,如下: 1.隐藏标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); 2.隐藏状态栏 getWindow().setFlags(Wi

C#中让控件全屏显示的实现代码(WinForm)

1.使用winapi "SetParent" 接口: 复制代码 代码如下: [DllImport("user32.dll", SetLastError = true)] static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); 复制代码 代码如下: control.Dock = DockStyle.None; control.Left = 0; control.Top = 0; c