Android使用WebView实现全屏切换播放网页视频功能

首先写布局文件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;
      }
  }
}

  最后说下AndroidManifest.xml设置;
访问网络权限加上这句

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

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

android:configChanges="orientation|keyboardHidden|screenSize"

总结

以上所述是小编给大家介绍的Android使用WebView实现全屏切换播放网页视频功能,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

(0)

相关推荐

  • Android使用WebView播放flash的方法

    本文实例讲述了Android使用WebView播放flash及判断是否安装flash插件的方法.分享给大家供大家参考.具体实现方法如下: 一.问题: 最近帮一个同学做一个项目,断断续续的一些知识点记录一下.一个页面中有一个WebView,用来播放swf,如果系统中未安装flash插件,必须提示用户到market中安装. 二.解决方法: 下面做一个demo,效果图如下: 图1: 图2: 图3: 首先布局文件,很简单: 复制代码 代码如下: <RelativeLayout xmlns:android

  • 详解android 用webview加载网页(https和http)

    1.Android 加载https请求的网页的时候 打不开 当load有ssl层的https页面时,如果这个网站的安全证书在Android无法得到认证,WebView就会变成一个空白页,而并不会像PC浏览器中那样跳出一个风险提示框.因此,我们必须针对这种情况进行处理.(这个证书限于2.1版本以上的Android 系统才可以) wv.setWebViewClient(new WebViewClient(){ @override public void onReceivedSslError(WebV

  • Android studio点击跳转WebView详解

    本文实例为大家分享了Android studio点击跳转WebView的具体代码,供大家参考,具体内容如下 代码文件 import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.

  • Android WebView与JS交互全面详解(小结)

    Android 和 H5 都是移动开发应用的非常广泛.市面上很多App都是使用Android开发的,但使用Android来开发一些比较复杂附属类,提示性的页面是得不偿失的.而H5具有开发速度快,更新不用依赖于App的更新,只需要服务端更新相应的页面即可,所以,App和H5页面相结合就显得尤为重要.而android和H5都不可能每次都是独立存在的,而是相互影响也相互的调用,获取信息等,例如,H5页面要获取App中的用户的基本信息,或者App端要操作H5页面等,下面来看看这两是怎么交互的 目录 1.

  • Android Webview与ScrollView的滚动兼容及留白处理的方法

    本文介绍了Webview与ScrollView的滚动兼容及留白处理,分享给大家,具体如下: 背景 开发中我们经常会遇到使用网页来显示图文内容,而且往往我们会遇到webview嵌套在scrollview的这种情况,这就开始让人蛋疼了!"为嘛,我的webview加载出来的网页只显示很小一点,其他都不显示了?" "当我重新刷新页面后,为什么webview会出现留白的情况?" ----------------- 天啊,难道就不能好好的吗?! 为了解决项目中这些蛋疼的问题,试

  • Android关于WebView中无法定位的问题解决

    之前碰到个问题,使用webview的时候无法定位,最近19大没法墙,只能去百度逛逛,发现有人说要这么做 WebSettings settings = wbContent.getSettings(); settings.setJavaScriptEnabled(true); settings.setJavaScriptCanOpenWindowsAutomatically(true); settings.setGeolocationEnabled(true); settings.setDomSto

  • Android开发实现webview中img标签加载本地图片的方法

    本文实例讲述了Android开发实现webview中img标签加载本地图片的方法.分享给大家供大家参考,具体如下: 在网上查了很多教程,感觉很麻烦,各种方法,最后实践很简单,主要是两步: WebSettings webSettings=webView.getSettings(); //允许webview对文件的操作 webSettings.setAllowUniversalAccessFromFileURLs(true); webSettings.setAllowFileAccess(true)

  • 详解android webView独立进程通讯方式

    为什么需要将webView放在独立进程 webView 加载网页的时候可能占用大量内存,导致应用程序OOM. webView 在访问结束的时候可以直接杀死该进程,防止内存泄漏. webView 在崩溃的时候不影响主进程. webView独立进程需要注意什么 由于进程之间内存是独立的,所以导致了Appcation, 静态类需要在新的进程重新创建. 内存中的数据不共享,需要跨进程通讯. 如何声明一个独立进程 在默认情况下,同一应用的所有组件都在相同的进程中运行. 在Manifest中可以设置各组件

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

    本文实例讲述了Android编程实现WebView全屏播放的方法.分享给大家供大家参考,具体如下: 最近因为项目要用webview加载html5的视频,开始不能全屏播,做了很久才做出来!那按我的理解说下怎么实现全屏吧. 首先写布局文件activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.

  • Android编程使WebView支持HTML5 Video全屏播放的解决方法

    本文实例讲述了Android编程使WebView支持HTML5 Video全屏播放的解决方法.分享给大家供大家参考,具体如下: 1)需要在AndroidManifest.xml文件中声明需要使用HardwareAccelerate, 可以细化到Activity级别,如果不需要的View可以声明不要用加速,但是需要在代码中做,具体如下: a. 如果要声明整个应用都要加速: 复制代码 代码如下: <application ... android:hardwareAccelerated ="tr

  • Android如何让WebView中的HTML5页面实现视频全屏播放

    前言 本文主要是将最近工作中遇到的一个问题进行总结分享,主要介绍的是如何让WebView中H5页面全屏播放视频.关于这个问题,做一下简单分析,希望对大家有所帮助,下面话不多说了,来看看详细的介绍吧. 效果图 运行效果 其实很简单,就是配置问题.关键地方配好了,基本没什么问题了. 硬件加速 设置WebView 在清单需要配置的AndroidManifest.xml <application android:allowBackup="true" android:icon="

  • Android webview如何加载HTML,CSS等语言的示例

    前言 这个题目可能取得不大好,想了很久没想出更合适的了.在android开发webview的时候,有的时候后台不一定给的就是一个url,而是把一些HTML,css,js语言代码给你,然后你自行组装出webview能够识别的语言,并加载到页面当中. 加载html无非有三种情况:一.存放在assets文件夹下的html文件:二.直接加载某个指定的网页. 三.从网络上解析得到的html代码,注意此处是代码,即字符串格式. 示例 /** * body : <div class="main-wrap

随机推荐