Android WebView实现全屏播放视频

作者:红日666 时间:2023-04-12 17:12:39 

介绍

最近项目开发中用到了WebView播放视频的功能,总结了开发中犯过的错误,这些错误在开发是及容易遇到的,所以我这里总结了一下,希望大家看到后不要再犯类似的错误,尽可能提高开发效率:

这个Demo我这里也参考了网上写的一个比较好的一个Demo,经过总结修改,写出来的。

主要代码

以下是相应代码:

MainActivity:


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;
}
}

activity_main.xml:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   android:orientation="vertical" >

<FrameLayout
       android:id="@+id/video_fullView"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:visibility="gone" >
   </FrameLayout>

<WebView
       android:id="@+id/webView"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_marginTop="20sp" />

</LinearLayout>

video_loading_progress.xml:


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/progress_indicator"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_centerInParent="true"
   android:orientation="vertical" >

<ProgressBar
       android:id="@android:id/progress"
       style="?android:attr/progressBarStyleLarge"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center" />

<TextView
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center"
       android:paddingTop="5dip"
       android:text="正在玩命加载视频中。。。"
       android:textColor="?android:attr/textColorPrimary"
       android:textSize="14sp" />

</LinearLayout>

AndroidManifest.xml:


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.androidwebviewdemo"
   android:versionCode="1"
   android:versionName="1.0" >

<uses-sdk
       android:minSdkVersion="8"
       android:targetSdkVersion="17" />

<uses-permission android:name="android.permission.INTERNET" />
   <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
   <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
   <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
   <uses-permission android:name="android.permission.ACCESS_GPS" />
   <uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
   <uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
   <application
       android:allowBackup="true"
       android:hardwareAccelerated="true"
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@style/AppTheme" >

<!-- android:configChanges="orientation|keyboardHidden" -->
       <!-- 默认竖屏,点击全屏后再横屏,
        那么activity必须配置android:configChanges="orientation|screenSize"
这样一来,旋转屏幕,只会调用onConfigurationChanged,不会创建新activity。
不然的话,代码中设置横屏的时候,都会新建一个Activity,
那样就没办法实现点击就横屏全屏了。 -->
       <activity
           android:name="com.androidwebviewdemo.MainActivity"
           android:configChanges="orientation|screenSize"
           android:label="@string/app_name" >
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
       </activity>
   </application>

</manifest>

来源:https://blog.csdn.net/u012440207/article/details/39580175

标签:Android,WebView,播放,视频
0
投稿

猜你喜欢

  • Android App开发中ViewPager组件的入门使用教程

    2023-04-30 21:45:34
  • 详解java封装实现Excel建表读写操作

    2023-12-24 11:17:20
  • SpringMVC使用MultipartResolver实现文件上传

    2023-02-19 08:34:38
  • C#简单快速的json组件fastJSON使用介绍

    2022-08-13 01:47:50
  • C#使用foreach语句简单遍历数组的方法

    2022-02-07 08:40:24
  • 一文精通Java 多线程之全方位解读

    2022-10-23 19:15:51
  • Java实现矩阵加减乘除及转制等运算功能示例

    2023-07-05 04:49:53
  • java反射拼接方法名动态执行方法实例

    2022-12-07 00:44:28
  • 深入讲解C#编程中嵌套类型和匿名类型的定义与使用

    2022-12-12 20:48:05
  • Java通过What、Why、How了解弱引用

    2021-11-01 00:06:20
  • Java concurrency之公平锁(二)_动力节点Java学院整理

    2023-11-24 21:14:54
  • java合并多个文件的实例代码

    2023-07-28 12:56:02
  • SpringCloud网关Gateway架构解析

    2023-03-17 00:18:42
  • Java去除字符串中空格的方法详解

    2022-10-16 23:42:13
  • StreamAPI多次消费一个stream代码实例

    2023-10-15 19:44:09
  • 详解android 用webview加载网页(https和http)

    2021-12-29 11:14:30
  • WPF+ASP.NET SignalR实现后台通知功能的示例代码

    2021-10-11 04:49:45
  • C#实现自由组合本地缓存、分布式缓存和数据查询

    2021-06-13 00:56:11
  • Android Studio Menu选择菜单的建立方法

    2023-07-28 03:46:31
  • SpringCloud如何搭建一个多模块项目

    2022-10-22 13:33:39
  • asp之家 软件编程 m.aspxhome.com