Android WebView 视频播放解决
来源:互联网 发布:mac强制删除程序 编辑:程序博客网 时间:2024/05/16 09:37
最近项目中遇到WebView 播放视频需求(H5 video 标签),那么问题来了视频无法全屏播放等。
对于这种视频播放问题有多种方案可以解决,例如:
1.实现一个网络视频播放器来播放网络视频(这个方案如果不利用开源的框架,实现起来费时费力)
2.自定义WebView实现利用H5的Video标签来播放视频(可以解决基本的视频播放需求,但是可能很多效果难以实现,比如手势控制等)
下面介绍第二种解决方案:
需要我们自定义WebView 来实现。
分步指南
- 新建一个Activity 来播放视频( PlayVideoWebViewActivity)
这个activity的布局非常简单,就是一个简单的 WebView,布局文件如下:<FrameLayout 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> <WebView android:id="@+id/video_webview" android:layout_width="fill_parent" android:layout_height="fill_parent"/> <ImageView android:id="@+id/goback" android:layout_width="45dp" android:layout_height="45dp" /></FrameLayout>
可以看到布局文件中除了一个WebView 还有一个 FrameLayout id/video_view,这个FrameLayout 其实就是我们用来解决全屏播放的。 - 初始化View
private void initwidget() {// TODO Auto-generated method stub videoview = (FrameLayout) findViewById(R.id.video_view); videowebview = (WebView) findViewById(R.id.video_webview); back = (ImageView) findViewById(R.id.goback) ; back.setOnClickListener(new Listener()); 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); mWebchromeclient = new mWebChromeClient(); videowebview.setWebChromeClient(mWebchromeclient); videowebview.setWebViewClient(new xWebViewClientent());}
- 下面重点来了
自定义 mWebChromeClient 继承 WebChromeClient。实现对全屏操作的处理,及默认播放图标,Html 页面标题等。/** * 处理Javascript的对话框、网站图标、网站标题以及网页加载进度等 * * @author **/ public class mWebChromeClient extends WebChromeClient {private Bitmap xdefaltvideo; private View xprogressvideo; @Override //播放网络视频时全屏会被调用的方法 public void onShowCustomView(View view, WebChromeClient.CustomViewCallback callback) { 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); }// //视频加载添加默认图标// @Override// public Bitmap getDefaultVideoPoster() {// //Log.i(LOGTAG, "here in on getDefaultVideoPoster");// if (xdefaltvideo == null) {// xdefaltvideo = BitmapFactory.decodeResource(getResources(), R.drawable.seach_icon);// }// return xdefaltvideo;// } //视频加载时进程loading// @Override// public View getVideoLoadingProgressView() {// //Log.i(LOGTAG, "here in on getVideoLoadingPregressView");// if (xprogressvideo == null) {// LayoutInflater inflater = LayoutInflater.from(PlayVideoWebViewActivity.this);// xprogressvideo = inflater.inflate(R.layout.video_loading_progress, null);// }// return xprogressvideo;// } //网页标题 @Override public void onReceivedTitle(WebView view, String title) { (PlayVideoWebViewActivity.this).setTitle(title); } }
- 实现横竖屏切换
/** * * 当横竖屏切换时会调用该方法 * * @author */@Overridepublic 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; }}
- 添加按键监听,实现音量+/-,实现全屏模式下返回退出全屏,实现退出播放操作等。
@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) { AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); int currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); if (keyCode == KeyEvent.KEYCODE_BACK) {if (inCustomView()) { hideCustomView(); return true; } else {videowebview.loadUrl("about:blank"); videowebview = null; this.finish(); } }if (keyCode == KeyEvent.KEYCODE_VOLUME_UP){//音量+ mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume+1, 1); }if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN){//音量- mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume-1, 1); }return true;}
/** * 判断是否是全屏 * * @return */public boolean inCustomView() { return (xCustomView != null);}/** * 全屏时按返加键执行退出全屏方法 */public void hideCustomView() { mWebchromeclient.onHideCustomView();}
上面可以看到返回退出播放时webview加载了一个空白页面,这样做的目的是如果不加载空白页面,会出现界面退出了但是声音还存在,也就没有回收资源。 - 实现全屏,去掉应用标题及手机状态栏
@Overrideprotected 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_play_video_web_view); //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); initwidget(); url = getIntent().getStringExtra("url"); videowebview.loadUrl(url);}
完整类文件http://download.csdn.net/detail/qq1805812268/9515793
号外:1.该Activity要允许横屏
<activity android:name=".guide.activity.PlayVideoWebViewActivity" android:configChanges="orientation|keyboardHidden|screenSize" >
2.硬件加速android:hardwareAccelerated="true"
1 0
- Android WebView 视频播放解决
- ANDROID webview解决视频无法播放问题
- android webview 播放视频
- android webview播放视频
- android webview视频播放
- 解决Android中WebView视频无法播放的问题
- Android WebView 播放视频总结
- android webview无法播放视频
- 解决webView无法播放视频的问题
- Android用Webview播放视频问题
- Android webview全屏播放HTML5中的视频
- Android的WebView如何播放视频
- Android使用WebView全屏播放网页视频
- Android的WebView中如何播放视频
- android在webView中播放腾讯视频
- Android webview 播放视频、文字复制
- Android WebView无法播放腾讯视频问题
- android webview 播放视频 全屏问题
- poj 2831(次小生成树)
- Selenium2Library与HttpLibrary.HTTP
- nginx location优先级详解
- View机制深入学习(五) 事件处理机制一
- (6)分片技术
- Android WebView 视频播放解决
- 基于分布式计算模型AKKA的数据并发处理【Lync聊天记录 -www.msucplus.com】
- 设计模式:10)责任链模式
- hive使用技巧(四)——巧用MapJoin解决数据倾斜问题
- 留存的网址
- docker - 资源限制
- 没有上司的晚会 树形动态规划
- eclipse迁移到Android Studio 问题记录
- Hadoop 2.3.0-cdh5.0.0 HA集群搭建(yum 安装)