Android上的WebView和Cookies
我有一个appspot上的应用程序,通过正常的浏览器工作正常,但是当通过Android WebView使用,它不能设置和读取Cookie。 我不是试图从这个Web应用程序“外部”获取cookie,一旦WebView访问URL,所有的处理,ID等都可以停留在那里,我所需要的只是在这个应用程序中的会话pipe理。 第一个屏幕也加载好,所以我知道WebView +服务器的交互性没有被破坏。
我看了WebSettings类,没有像setEnableCookies这样的调用。
我加载这样的url:
public class MyActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); WebView webview = new WebView(this); setContentView(webview); webview.loadUrl([MY URL]); } .. }
有任何想法吗?
如果您使用Android棒棒糖即SDK 21,则:
CookieManager.getInstance().setAcceptCookie(true);
将无法工作。 你需要使用:
CookieManager.getInstance().setAcceptThirdPartyCookies(true);
我遇到了同样的问题,上面的线路作为一个魅力。
从Android文档 :
CookieSyncManager
用于同步RAM和永久存储器之间的浏览器cookie存储。 为了获得最佳性能,浏览器cookie被保存在RAM中。 一个单独的线程在一个定时器的驱动下保存cookie。要使用
CookieSyncManager
,主应用程序必须在应用程序启动时调用以下内容:CookieSyncManager.createInstance(context)
要设置同步,主机应用程序必须调用
CookieSyncManager.getInstance().startSync()
在Activity.onResume()和调用
CookieSyncManager.getInstance().stopSync()
在Activity.onPause()中。
要获得即时同步而不是等待定时器触发,主机可以调用
CookieSyncManager.getInstance().sync()
同步时间间隔是5分钟,所以你会想手动强制同步,例如在onPageFinished(WebView,String)中。 请注意,即使sync()也是asynchronous发生的,所以不要在活动closures的时候这样做。
最后这样的事情应该工作:
// use cookies to remember a logged in status CookieSyncManager.createInstance(this); CookieSyncManager.getInstance().startSync(); WebView webview = new WebView(this); webview.getSettings().setJavaScriptEnabled(true); setContentView(webview); webview.loadUrl([MY URL]);
我知道发生了什么事。
当我通过服务器端动作(一个URL访问)加载一个页面,并查看在Webview中从该动作返回的HTML时,该第一个动作/页面将在该Webview中运行。 但是,当您在Web应用程序中单击任何操作命令的链接时,这些操作将启动一个新的浏览器 。 这就是为什么cookie信息会因为您为Webview设置的第一个cookie信息消失而丢失的原因,我们在这里有一个单独的程序。
您必须拦截Webview上的点击,以便浏览从不离开应用程序,一切都保持在同一个Web视图内。
WebView webview = new WebView(this); webview.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); //this is controversial - see comments and other answers return true; } }); setContentView(webview); webview.loadUrl([MY URL]);
这解决了这个问题。
我的问题是在同一个会话中“cookies”不工作。 –
布拉克:我有同样的问题。 启用cookie解决了这个问题。
CookieManager.getInstance().setAcceptCookie(true);
CookieManager.getInstance().setAcceptCookie(true);
通常它应该工作,如果你的webview已经初始化
或者试试这个:
CookieSyncManager.createInstance(this); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.removeAllCookie(); cookieManager.setAcceptCookie(true);