android webview的使用

浏览器控件是每个开发环境都具备的,这为马甲神功提供了用武之地,windows的有webbrowserandroidios都有webview。只是其引擎不同,相对于微软的webbrowserandroidioswebview的引擎都是webkit,对Html5提供支持。本篇主要介绍androidwebview之强大。

使用之前需在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)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值