浏览器控件是每个开发环境都具备的,这为马甲神功提供了用武之地,windows的有webbrowser,android和ios都有webview。只是其引擎不同,相对于微软的webbrowser,android及ios的webview的引擎都是webkit,对Html5提供支持。本篇主要介绍android的webview之强大。
使用之前需在Androidmanifest中获取权限:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
主Activity代码:
public class MyActivity extends Activity implements OnClickListener{
private WebView webView;
private TextView back,bar_title,refresh;
private final String baidu_url = "http://m.baidu.com/?from=844b&vit=fps&pu=sz%401321_480&t_noscript=jump";
private final String down_url = "http://m.shouji.360tpcdn.com/150910/c5aa2b551cd6c292b3ec414441d5ac82/InternetRadio.all_3803.apk";
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
back = (TextView) findViewById(R.id.back);
bar_title = (TextView) findViewById(R.id.bar_title);
refresh = (TextView) findViewById(R.id.refresh);
back.setOnClickListener(this);
refresh.setOnClickListener(this);
webView = (WebView) findViewById(R.id.webView);
webView.loadUrl(baidu_url);
// webView.loadUrl(down_url); //加载下载的url,DownloadListener会监听到
//设置自己程序的webview客户端处理,防止调到浏览器处理
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Toast.makeText(MyActivity.this,url,Toast.LENGTH_SHORT).show();
Log.e("override_url",url);
view.loadUrl(url);
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { //处理错误页面
super.onReceivedError(view, errorCode, description, failingUrl);
view.loadUrl("file:///android_asset/error.html");//加载assets下的error.html
}
});
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onReceivedTitle(WebView view, String title) { //获取标题
super.onReceivedTitle(view, title);
bar_title.setText(title);
}
});
webView.setDownloadListener(new DownloadListener() {
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
Log.e("down_url", url);
if(url.endsWith(".apk")) {
//调用系统浏览器去下载apk
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
//其他方式,自己写开个线程下载
}
}
});
}
@Override
public void onClick(View v) {
if(v == back){ //处理回退
if(webView.canGoBack()){
webView.goBack();
}else{
finish();
}
}else if(v == refresh){ //处理刷新
webView.reload();
}
}
@Override
public void onBackPressed() { //处理物理返回键
if(webView.canGoBack()){
webView.goBack();
webView.canGoForward();
webView.goForward();
}else{
super.onBackPressed();
}
}
}
本例中webview.loadUrl(down_url)时,DownloadListener会监听到,你可以调用浏览器进行下载或自己实现下载。
效果图:
2.webview设置cookie
关键代码:
private void syncCookie(String cookie){
CookieSyncManager.createInstance(this);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.setCookie(cookie_url, cookie);
CookieSyncManager.getInstance().sync();
}
在本例中模拟登陆获取cookie,服务器中相应的servlet是判断有无cookie,无cookie则设置cookie返回,有cookie则重定向到首页。
客户端代码获取cookie:
new AsyncTask<String,Integer,String>(){
@Override
protected String doInBackground(String... params) {
HttpURLConnection url_con = null;
try {
URL url = new URL(params[0]);
url_con = (HttpURLConnection) url.openConnection();
url_con.connect();
} catch (IOException e) {
e.printStackTrace();
}
if(url_con == null){
Log.e("url_con","null");
}
String cookieVal =url_con.getHeaderField("Set-Cookie");
return cookieVal;
}
@Override
protected void onPostExecute(String s) {
Log.e("cookieVal", s);
Intent intent = new Intent(GetCookieActivity.this,WebviewCookieActivity.class);
intent.putExtra("cookie",s);
startActivity(intent);
super.onPostExecute(s);
}
}.execute("http://192.168.1.103:8080/webviewcookie/LoginServlet");
服务器端:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", -1);
response.setHeader("Pragma", "no-cache");
// 如果用户第一次访问 ---- 判断请求中有没有cookie信息
Cookie[] cookies = request.getCookies(); // 获得请求中所有cookie信息
response.setContentType("text/html;charset=utf-8");
if(cookies == null){
Cookie cookie = new Cookie("login", "kedou");
response.addCookie(cookie);
response.getWriter().println("登陆");
}else{
for(Cookie c: cookies){
if("login".equals(c.getName())){
response.sendRedirect("/webviewcookie/HomeServlet");
}else{
Cookie cookie = new Cookie("login", "kedou");
response.addCookie(cookie);
response.getWriter().println("登陆");
}
}
}
}
客户端+服务器端源码:http://yunpan.cn/cm7Qk4JVMuRXT (提取码:64d5)