欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android WebView实现全屏播放视频

程序员文章站 2022-03-09 22:57:39
目录介绍主要代码介绍最近项目开发中用到了webview播放视频的功能,总结了开发中犯过的错误,这些错误在开发是及容易遇到的,所以我这里总结了一下,希望大家看到后不要再犯类似的错误,尽可能提高开发效率:...

介绍

最近项目开发中用到了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>

以上就是android webview实现全屏播放视频的详细内容,更多关于android webview播放视频的资料请关注其它相关文章!