这是因为 WebView 有自己的 CookieStore,称为 android.net.CookieManager。你创建了一个 java.net.Cookiemanager 的实例。
他们彼此不认识。您必须在两者之间交换 cookie。
1.) 创建您自己的 java.net.CookieManager 实例,获取 android.net.CookieManager 实例:
public class MyCookieManager extends CookieManager {
private android.webkit.CookieManager webkitCookieManager = null;
/**
* Constructor
* @param cookieManager android.webkit.CookieManager
* @param cookiePolicy CookiePolicy
*/
public MyCookieManager (android.webkit.CookieManager cookieManager, CookiePolicy cookiePolicy) {
super(null, cookiePolicy);
this.webkitCookieManager = cookieManager;
//Cookies are allowed
this.webkitCookieManager.setAcceptCookie(true);
}
/**
* @param uri URI
* @param responseHeaders Map<String, List<String>>
*/
@Override
public void put(URI uri, Map<String, List<String>> responseHeaders) {
if (responseHeaders == null) {
return;
}
for (String headerKey : responseHeaders.keySet()) {
if ( headerKey == null || "Set-Cookie".equalsIgnoreCase(headerKey) == false) {
continue;
}
for (String headerValue : responseHeaders.get(headerKey)) {
webkitCookieManager.setCookie(uri.toString(), headerValue);
}
}
}
/**
* @param uri URI
* @param requestHeaders Map<String, List<String>>
* @return Map<String, List<String>>
*/
@Override
public Map<String, List<String>> get(URI uri, Map<String, List<String>> requestHeaders) {
if (requestHeaders == null) {
return null;
}
Map<String, List<String>> res = new java.util.HashMap<String, List<String>>();
// get cookies from Webview CookieManager
String cookie = webkitCookieManager.getCookie(uri.toString());
if (cookie == null) {
cookie = "";
}
res.put("Cookie", Arrays.asList(cookie));
return res;
}
}
2.) 在您的应用程序类中是这样的:
public class ApplicationWrapper extends Application {
private MyCookieManager manager = null;
@Override
public void onCreate() {
//some work...
this.initCookieManager();
//some more work...
}
private void initCookieManager () {
this.manager = new MyCookieManager(
CookieManager.getInstance(),
java.net.CookiePolicy.ACCEPT_ALL);
CookieHandler.setDefault(this.manager);
}
}