WebView开发总结

本文总结了WebView的开发经验,包括创建与JavaScript交互的映射类,放置JS代码到asset目录或通过网络加载,以及解决混淆后点击无反应的问题,需要在proguard配置文件中进行特定设置。
摘要由CSDN通过智能技术生成



public class MainActivity extends Activity {

	private WebView webview;
	private ActionBar actionbar;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		actionbar = getActionBar();
		webview = (WebView) this.findViewById(R.id.webview);
		ImageView imagev = (ImageView) this.findViewById(R.id.refresh);
		 
        webview.getSettings().setJavaScriptEnabled(true); 
       
//		webview.loadUrl("http://baidu.com");

        
//      测试 js和WebView交互
//      webview.loadUrl("http://192.168.0.102:8080/myweb/js");
//      webview.loadUrl("file:///android_asset/text.html");
        
//      设置cookies 测试
        webview.loadUrl("http://192.168.0.102:8080/myweb/requestlogin");
		
		webview.setWebChromeClient(new WebChromeClient() {
			
			//可以设置seekbar 进度
			@Override
			public void onProgressChanged(WebView view, int newProgress) {
				// TODO Auto-generated method stub
				super.onProgressChanged(view, newProgress);
				
				
			}
			
			@Override
			public void onReceivedTitle(WebView view, String title) {
				actionbar.setTitle(title);
				super.onReceivedTitle(view, title);
			}

		});
		
		//设置下载监听事件
		webview.setDownloadListener(new MyDownLoadListener());
		
		webview.setWebViewClient(new WebViewClient() {
                     public void onReceivedError(WebView view,int errorCode,
<span style="white-space:pre">					</span>String description, String failingUrl) {
			//设置错误页面  友好提示
			super.onReceivedError(view, errorCode, description, failingUrl);
		}
			
			@Override
		public void onPageFinished(WebView view, String url) {
			
			super.onPageFinished(view, url);
			String user=null,pass=null;
			CookieSyncManager.createInstance(MainActivity.this);
			CookieManager cookieManager = CookieManager.getInstance();
		        String CookieStr = cookieManager.getCookie(url);

		 	
			  CookieManager cm=CookieManager.getInstance();
			  cm.setAcceptCookie(true);
			  cm.setCookie("http://192.168.0.102:8080/myweb", CookieStr);
			//  cm.removeAllCookie();
			  CookieSyncManager.getInstance().sync();
		        
		            
		           
			}
			@Override
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				view.loadUrl(url);//不采用系统浏览器 用webview
				return super.shouldOverrideUrlLoading(view, url);
			}

		});
		imagev.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				webview.reload();

			}
		});
		



	}
	
	private class MyDownLoadListener implements DownloadListener{

		@Override
		public void onDownloadStart(String url, String userAgent,
				
				String contentDisposition, String mimetype, long contentLength) {
			 if(url.contains(".apk"))
			new HttpThread(url).start();
			
		}
		
		
		
		
	}
	 @Override 
	  
	    public boolean onKeyDown(int keyCode, KeyEvent event) {  
	        if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {  
	            webview.goBack();
	            return true;  
	        }else {
				this.finish();
			}
	        return false;  
	    }  



}
拦截.apk 的url  新开下载线程
public class HttpThread extends Thread {
  private URL url;
  private String mPath;
  private static String fileName;
	public HttpThread (String urll){
		fileName=urll.substring(urll.lastIndexOf("/")+1, urll.length()-4);
	
		try {
			this.url=new URL(urll);
			
		} catch (MalformedURLException e) {
		   
			e.printStackTrace();
		}
	}
	
	@Override
	public void run() {
		
		HttpURLConnection connect;
		
		try {
			connect = (HttpURLConnection) url.openConnection();

			connect.setDoOutput(true);
		    connect.setDoInput(true);
			connect.setConnectTimeout(5000);
			int code=connect.getResponseCode();
            if(code==200){
			InputStream  input=connect.getInputStream();
			 
			OutputStream output=new FileOutputStream(getExternalSdCardPath());
			BufferedInputStream bufferedinput=new BufferedInputStream(input);
				
				int len=0;
				byte[] buff=new byte[1024];
				while ((len=bufferedinput.read(buff))!=-1) {
					output.write(buff, 0, len);

				}
				if(input!=null)input.close();
				if(output!=null)output.close();
				if(bufferedinput!=null)bufferedinput.close();
                connect.disconnect();
			
			}
	
			
			
		} catch (ProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
		
		

	}

    public static File getExternalSdCardPath() throws IOException {
    	File sdCardFile=null;
        if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
             sdCardFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+fileName+".apk");
            if(!sdCardFile.exists()){
            	
            	sdCardFile.createNewFile();
            	
            }
           
           Log.e("sdkakaka", sdCardFile.getAbsolutePath());
          
            return sdCardFile;
        }
		return null;
    }
}


设置cookie 新建了个简单的服务器代码交互



/**
 * Servlet implementation class requetlogin
 */
@WebServlet("/requestlogin")
public class requetlogin extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		 Cookie[]  requestcookies=request.getCookies();
		 String user=null,pass=null;
	
		//如果用户带cookie过来 验证是否正确 
	    if(requestcookies!=null) {
			for(Cookie c:requestcookies){
				
					if(c.getValue().equals("wangjuntao")){
						user=c.getValue();
						 System.out.print(user);	
					
					}
					if(c.getValue().equals("123456")){
						pass=c.getValue();
						 System.out.print(pass);
					}
					
				}
				
			}
		 
		    if(user!=null&&!"".equals(user)&&"wangjuntao".equals(user)&&"123456".equals(pass)){
		    	 System.out.print("success");
           request.getRequestDispatcher("/WEB-INF/page/welcome.jsp").forward(request, response);
		     return;
		    }
			
		
		//如果没带cookies 则跳转到  登录页面操作
		request.getRequestDispatcher("/WEB-INF/page/login.jsp").forward(request, response);
	}

}

requestlogin  处理如果带的cookies 是正确的 就跳转到欢迎页面  如果为null 也就是第一次登录 就跳到 login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>

 <form  method="post"  action="http://192.168.0.102:8080/myweb/login" >
  帐号:<input name="user" type="text" /><br/>
   密码<input name="pass" type="text"/><br/>

   <input  type="submit" value="登录"/><br/>
 </form>


</body>
</html>

提交登录 转自loginserlvet 处理请求  和   是否 回写cookies和跳转 欢迎页面

/**
 * Servlet implementation class login
 */
@WebServlet("/login")
public class login extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

	@SuppressWarnings("unused")
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		System.out.print("正在检验");
		Cookie[] requestcookies = request.getCookies();
		String user = null, pass = null;

		user = request.getParameter("user");
		pass = request.getParameter("pass");
	

		if (user != null && !"".equals(user) && "wangjuntao".equals(user)
				&& "123456".equals(pass)) {
			Cookie cookies1 = new Cookie("user", user);
			Cookie cookies2 = new Cookie("pass", pass);
			cookies1.setMaxAge(1*24*30*365);
			cookies1.setPath("/myweb");
			cookies2.setMaxAge(1*24*30*365);
			cookies2.setPath("/myweb");
			response.addCookie(cookies1);
			response.addCookie(cookies2);
			System.out.print("success");
			// response.sendRedirect("/WEB-INF/page/welcome.jsp");
			request.getRequestDispatcher("/WEB-INF/page/welcome.jsp").forward(
					request, response);
		}

	}

}

WebView 和Js交互

新建个和JS交互的映射类

public class WebViewInfo {
	public Context mContext;

	public WebViewInfo(Context c){
		
		mContext=c;
	}
	
	@JavascriptInterface
	public void show(String str){
		Log.e("toast", "sss");
		Toast.makeText(mContext, str, 1000).show();
		
	}

}


webview设置 两行代码即可

        webview.getSettings().setJavaScriptEnabled(true); 

//      webview.loadUrl("http://192.168.0.102:8080/myweb/js");
        webview.loadUrl("file:///android_asset/text.html");
        webview.addJavascriptInterface(new WebViewInfo(this), "js");


js代码  放到asset目录下  或者请求网络JS交互 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head>
<script type="text/javascript">

function text(){
	js.show("this my javascript");
	
   
	
}
</script>
<body>


   试试<input name="title" type="text" /><br/>

   文件:<input name="file" type="file"/><br/>
   <input  type="submit" value="提交"/><br/>
   <button οnclick="text()">toast </button>

</script>

</body>
</html>




如果打包完 会发现 点击 没反应  是混淆后的代码 找不到该类调用

在proguard.cfg文件里 加上

-keep public class com.example.webview.WebViewInfo{
public<methods>
}

测试在eclipse中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值