Android编程实现WebView全屏播放的方法(附源码)
本文实例讲述了Android编程实现WebView全屏播放的方法。分享给大家供大家参考,具体如下:
最近因为项目要用webview加载html5的视频,开始不能全屏播,做了很久才做出来!那按我的理解说下怎么实现全屏吧。
首先写布局文件activity_main.xml:
<LinearLayoutxmlns: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:
publicclassMainActivityextendsActivity{
privateFrameLayoutvideoview;//全屏时视频加载view
privateButtonvideolandport;
privateWebViewvideowebview;
privateBooleanislandport=true;//true表示此时是竖屏,false表示此时横屏。
privateViewxCustomView;
privatexWebChromeClientxwebchromeclient;
privateStringurl="http://look.appjx.cn/mobile_api.php?mod=news&id=12604";
privateWebChromeClient.CustomViewCallbackxCustomViewCallback;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
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);
}
privatevoidinitListener(){
//TODOAuto-generatedmethodstub
videolandport.setOnClickListener(newListener());
}
privatevoidinitwidget(){
//TODOAuto-generatedmethodstub
videoview=(FrameLayout)findViewById(R.id.video_view);
videolandport=(Button)findViewById(R.id.video_landport);
videowebview=(WebView)findViewById(R.id.video_webview);
WebSettingsws=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=newxWebChromeClient();
videowebview.setWebChromeClient(xwebchromeclient);
videowebview.setWebViewClient(newxWebViewClientent());
}
classListenerimplementsOnClickListener{
@Override
publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
switch(v.getId()){
caseR.id.video_landport:
if(islandport){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
videolandport.setText("全屏不显示该按扭,点击切换横屏");
}else{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
videolandport.setText("全屏不显示该按扭,点击切换竖屏");
}
break;
default:
break;
}
}
}
@Override
publicbooleanonKeyDown(intkeyCode,KeyEventevent){
if(keyCode==KeyEvent.KEYCODE_BACK){
if(inCustomView()){
hideCustomView();
returntrue;
}else{
videowebview.loadUrl("about:blank");
//mTestWebView.loadData("","text/html;charset=UTF-8",null);
MainActivity.this.finish();
Log.i("testwebview","===>>>2");
}
}
returntrue;
}
/**
*判断是否是全屏
*@return
*/
publicbooleaninCustomView(){
return(xCustomView!=null);
}
/**
*全屏时按返加键执行退出全屏方法
*/
publicvoidhideCustomView(){
xwebchromeclient.onHideCustomView();
}
/**
*处理Javascript的对话框、网站图标、网站标题以及网页加载进度等
*@author
*/
publicclassxWebChromeClientextendsWebChromeClient{
privateBitmapxdefaltvideo;
privateViewxprogressvideo;
@Override
//播放网络视频时全屏会被调用的方法
publicvoidonShowCustomView(Viewview,WebChromeClient.CustomViewCallbackcallback)
{
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
//视频播放退出全屏会被调用的
publicvoidonHideCustomView(){
if(xCustomView==null)//不是全屏播放状态
return;
//Hidethecustomview.
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
xCustomView.setVisibility(View.GONE);
//Removethecustomviewfromitscontainer.
videoview.removeView(xCustomView);
xCustomView=null;
videoview.setVisibility(View.GONE);
xCustomViewCallback.onCustomViewHidden();
videowebview.setVisibility(View.VISIBLE);
//Log.i(LOGTAG,"setittowebVew");
}
//视频加载添加默认图标
@Override
publicBitmapgetDefaultVideoPoster(){
//Log.i(LOGTAG,"hereinongetDefaultVideoPoster");
if(xdefaltvideo==null){
xdefaltvideo=BitmapFactory.decodeResource(
getResources(),R.drawable.videoicon);
}
returnxdefaltvideo;
}
//视频加载时进程loading
@Override
publicViewgetVideoLoadingProgressView(){
//Log.i(LOGTAG,"hereinongetVideoLoadingPregressView");
if(xprogressvideo==null){
LayoutInflaterinflater=LayoutInflater.from(MainActivity.this);
xprogressvideo=inflater.inflate(R.layout.video_loading_progress,null);
}
returnxprogressvideo;
}
//网页标题
@Override
publicvoidonReceivedTitle(WebViewview,Stringtitle){
(MainActivity.this).setTitle(title);
}
//@Override
////当WebView进度改变时更新窗口进度
//publicvoidonProgressChanged(WebViewview,intnewProgress){
//(MainActivity.this).getWindow().setFeatureInt(Window.FEATURE_PROGRESS,newProgress*100);
//}
}
/**
*处理各种通知、请求等事件
*@author
*/
publicclassxWebViewCliententextendsWebViewClient{
@Override
publicbooleanshouldOverrideUrlLoading(WebViewview,Stringurl){
Log.i("webviewtest","shouldOverrideUrlLoading:"+url);
returnfalse;
}
}
/**
*当横竖屏切换时会调用该方法
*@author
*/
@Override
publicvoidonConfigurationChanged(ConfigurationnewConfig){
Log.i("testwebview","=====<<<onConfigurationChanged>>>=====");
super.onConfigurationChanged(newConfig);
if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){
Log.i("webview","现在是横屏1");
islandport=false;
}elseif(newConfig.orientation==Configuration.ORIENTATION_PORTRAIT){
Log.i("webview","现在是竖屏1");
islandport=true;
}
}
}
代码里面我写了好多注释,相信大家都能看得懂,当然本人是菜鸟,可能有些地方理解错了!知道的可以跟我说。然后我在里面加了一个功能,就是点击webview上面按钮切换横竖屏!还有就是当点击全屏播放的时候强制横屏全屏播放,点击返回时回到竖屏!我这里没有用手机重力感应切换横竖屏!代码里面还加了个播放进度的布局文件,大家在源码里可以看到!
最后说下AndroidManifest.xml设置;
访问网络权限加上这句
<uses-permissionandroid:name="android.permission.INTERNET"/>
当切换横竖屏时为了不重新调用onCreate等方法,要加个这句:
android:configChanges="orientation|keyboardHidden|screenSize"
差不多这样就可以实现全屏播放了,如果有看不懂的问题可以问我,
完整实例代码代码点击此处本站下载。
希望本文所述对大家Android程序设计有所帮助。