android之webview

 

最近做一个项目需要在线播放优酷,土豆 等视频,需要用到WebView.

期间遇到很多大大小小 问题:

1  无法全屏,一点击全屏就卡死白屏;

2  退出后 声音还没停止,以及程序最小化问题;

目前这两个问题算是解决了。

对于问题2 网上基本就这一个方法:

 

试了之后确实 问题解决了。

对于问题1,网上找了很久, 终于看到可以的;

附上源代码:

 


NetVideoActivity.java

 

package canton.tower.travel.VoiceAndVideo;

 

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import canton.tower.travel.R;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings.PluginState;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.Toast;

public class NetVideoActivity extends Activity {

	private FrameLayout mFullscreenContainer;
	private FrameLayout mContentView;
	private View mCustomView = null;
	private WebView mWebView;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.netvideolay);
		Intent intent = getIntent();
		Bundle bundle = intent.getExtras();
		String str_add = "";
		if(bundle==null)
			 str_add = "http://www.tudou.com/v/TM6mAN5rZNk/&resourceId=0_04_05_99/v.swf"; //
		else
		     str_add = bundle.getString("address");
		initViews();
		initWebView();


		Toast.makeText(this, "加载中,若无响应,请返回重试...", Toast.LENGTH_LONG).show();
		mWebView.loadUrl(str_add);
	}

	private void initViews() {
		mFullscreenContainer = (FrameLayout) findViewById(R.id.fullscreen_view);
		mContentView = (FrameLayout) findViewById(R.id.main_view);
		mWebView = (WebView) findViewById(R.id.webview);

	}

	private void initWebView() {
		WebSettings settings = mWebView.getSettings();
		settings.setJavaScriptEnabled(true);
		settings.setJavaScriptCanOpenWindowsAutomatically(true);
		settings.setPluginState(PluginState.ON);
		settings.setUseWideViewPort(false);
		settings.setAllowFileAccess(true);
		settings.setLoadWithOverviewMode(true);
		
		mWebView.setFitsSystemWindows(true);
		mWebView.setWebChromeClient(new MyWebChromeClient());
		mWebView.setWebViewClient(new MyWebViewClient());
	}
	
	class MyWebChromeClient extends WebChromeClient {
		
		private CustomViewCallback mCustomViewCallback;
		private int mOriginalOrientation = 1;
		@Override
		public void onShowCustomView(View view, CustomViewCallback callback) {
			// TODO Auto-generated method stub
			onShowCustomView(view, mOriginalOrientation, callback);
			super.onShowCustomView(view, callback);
			
		}

		public void onShowCustomView(View view, int requestedOrientation,
				WebChromeClient.CustomViewCallback callback) {
			if (mCustomView != null) {
				callback.onCustomViewHidden();
				return;
			}
			if (getPhoneAndroidSDK() >= 14) {
				mFullscreenContainer.addView(view);
				mCustomView = view;
				mCustomViewCallback = callback;
				mOriginalOrientation = getRequestedOrientation();
				mContentView.setVisibility(View.INVISIBLE);
				mFullscreenContainer.setVisibility(View.VISIBLE);
				mFullscreenContainer.bringToFront();

				setRequestedOrientation(mOriginalOrientation);
			}

		}

		public void onHideCustomView() {
			mContentView.setVisibility(View.VISIBLE);
			if (mCustomView == null) {
				return;
			}
			mCustomView.setVisibility(View.GONE);
			mFullscreenContainer.removeView(mCustomView);
			mCustomView = null;
			mFullscreenContainer.setVisibility(View.GONE);
			try {
				mCustomViewCallback.onCustomViewHidden();
			} catch (Exception e) {
			}
			// Show the content view.

			setRequestedOrientation(mOriginalOrientation);
		}

	}

	class MyWebViewClient extends WebViewClient {

		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			// TODO Auto-generated method stub
			view.loadUrl(url);
			return super.shouldOverrideUrlLoading(view, url);
		}

	}

	public static int getPhoneAndroidSDK() {
		// TODO Auto-generated method stub
		int version = 0;
		try {
			version = Integer.valueOf(android.os.Build.VERSION.SDK);
		} catch (NumberFormatException e) {
			e.printStackTrace();
		}
		return version;

	}
	private void callHiddenWebViewMethod(String name){
	    if( mWebView != null ){
	        try {
	            Method method = WebView.class.getMethod(name);
	            method.invoke(mWebView);
	        } catch (NoSuchMethodException e) {
	           // Log.e("No such method: " + name, e);
	        } catch (IllegalAccessException e) {
	           // Log.e("Illegal Access: " + name, e);
	        } catch (InvocationTargetException e) {
	            //Log.error("Invocation Target Exception: " + name, e);
	        }
	    }
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
	}
	@Override
	protected void onPause() {
		
		super.onPause();
		//mWebView.pauseTimers();
		Log.e("oo", "oo");
		if (isFinishing())
		{
			mWebView.loadUrl("about:blank");
			//setContentView(new FrameLayout(this));
		} 
		this.callHiddenWebViewMethod("onPause");
	}
	@Override
	public void onBackPressed() {
		mWebView.loadUrl("about:blank");
		mWebView.clearCache(true);
		mWebView.clearHistory();
	    System.gc();
 
	 	finish();
		 
		
		
	}
}


netvideolayout.xml

<FrameLayout  xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="fill_parent"  
       android:layout_height="fill_parent">
  
   <FrameLayout  
       android:id="@+id/fullscreen_view"  
       android:layout_width="fill_parent"  
       android:layout_height="fill_parent"  
       android:visibility="gone" />  
  
   <FrameLayout  
       android:id="@+id/main_view"  
       android:layout_width="fill_parent"  
       android:layout_height="fill_parent">  
  
       <WebView  
           android:id="@+id/webview"  
           android:layout_width="fill_parent"  
           android:layout_height="fill_parent" 
           android:scrollbars="none" />  
    </FrameLayout > 
    
</FrameLayout> 


 

最后在manifest.xml   application  标签里 添加 android:hardwareAccelerated="true"

 


仍存在一些问题:

1 全屏之后只能根据播放器的图标提示退出全屏, 不能按返回键退出;

2 还有一个比较蛋疼的问题, 在网络不稳定的情况下, 播放经常卡住, 一旦卡住,退出Activity 后再次进去 仍然白屏,要等待一段时间 才反应过来;

 


若哪位童鞋解决了问题,还麻烦告知,谢谢!

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值