0

我想执行以下流程:

  1. 打开 webview 并使用account1登录到 Gmail ,然后浏览一下。
  2. 以某种方式保存account1的当前会话和当前 url 。

  3. 为了使用account2登录,我需要处理account1的会话。

  4. 现在使用account2登录到 Gmail,然后浏览一下。

  5. 再次以某种方式保存account2的当前会话和当前 url 。

现在我想允许在用户操作时在account1account2会话之间切换。

因为我假设(并且可能是错误的)会话是由 url、url 参数及其 cookie 确定的,所以我已经为每个帐户保存了所有内容,并且在切换时我做了以下操作:

// url == url + params
CookieManager.getInstance().removeAllCookies();
CookieManager.getInstance().setCookie(url, cookie);
webview.loadUrl(url);

这没有用。所以我尝试在加载 url 之前使用 Javascript 注入 cookie,这也不起作用,我的意思是没有任何会话可用,我已经返回到 Gmail 登录屏幕。

我怎样才能做到这一点?我错过了什么?

4

1 回答 1

1

试试这个方法

public List<Cookie>  sync(String url) {

        CookieManager cookieManager = CookieManager.getInstance();
        if (cookieManager == null)
            return null;

        RFC2109Spec cookieSpec = new RFC2109Spec();
        String rawCookieHeader = null;
        try {
            URL parsedURL = new URL(url);
            rawCookieHeader = cookieManager.getCookie(parsedURL.getHost());
            if (rawCookieHeader == null)
                return null;
            int port = parsedURL.getPort() == -1 ? parsedURL.getDefaultPort() : parsedURL.getPort();

            CookieOrigin cookieOrigin = new CookieOrigin(parsedURL.getHost(), port, "/", false);
            List<Cookie> cookies = cookieSpec.parse(new BasicHeader("set-cookie", rawCookieHeader), cookieOrigin);
            return cookies;
        } catch (Exception e) {

        }
        return null;
    }


    public void sync(List<Cookie> cookies,String url) {
        if (cookies != null) {

            CookieManager cookieManager = CookieManager.getInstance();
            cookieManager.setAcceptCookie(true);
            for (Cookie cookie : cookies) {

                Cookie sessionInfo = cookie;
                String cookieString = sessionInfo.getName() + "=" + sessionInfo.getValue() + "; domain=" + sessionInfo.getDomain();
                cookieManager.setCookie(url, cookieString);
                CookieSyncManager.getInstance().sync();
            }
        }
    }

如何使用

webview.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return super.shouldOverrideUrlLoading(view, url);
                sync(url); // store list of cookies in Global variable return by this function. 
            }
        });

        //before loading/swithich account

        //sync(yourglobalvariable of list of cookis, url of respective account);
        sync(cookies,urlAccount1);
        webview.loadUrl(url);
于 2013-09-24T04:23:12.727 回答