文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2022-06-06 09:35

关注

本文实例讲述了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();
  
  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;
  }
  
  public boolean inCustomView() {
    return (xCustomView != null);
   }
   
   public void hideCustomView() {
    xwebchromeclient.onHideCustomView();
   }
 
 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);
//   }  
 }
 
 public class xWebViewClientent extends WebViewClient {
   @Override
   public boolean shouldOverrideUrlLoading(WebView view, String url) {
    Log.i("webviewtest", "shouldOverrideUrlLoading: "+url);
    return false;
   }
 }
 
 @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程序设计有所帮助。

您可能感兴趣的文章:Android如何让WebView中的HTML5页面实现视频全屏播放Android编程使WebView支持HTML5 Video全屏播放的解决方法Android使用WebView播放flash的方法Android WebView与JS交互全面详解(小结)详解android 用webview加载网页(https和http)Android webview如何加载HTML,CSS等语言的示例Android Webview与ScrollView的滚动兼容及留白处理的方法Android关于WebView中无法定位的问题解决Android开发实现webview中img标签加载本地图片的方法Android studio点击跳转WebView详解详解android webView独立进程通讯方式Android使用WebView实现全屏切换播放网页视频功能


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯