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;
}
}
/**
* 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中。