当前位置:  开发笔记 > 编程语言 > 正文

Android上的WebView和Cookies

如何解决《Android上的WebView和Cookies》经验,为你挑选了4个好方法。

我在appspot上有一个应用程序,可以通过常规浏览器正常工作,但是当通过Android WebView使用时,它无法设置和读取cookie.我不是想在这个Web应用程序BTW"外面"获取cookie,一旦WebView访问了URL,所有处理,ID等都可以保留在那里,我所需要的只是该应用程序内的会话管理.第一个屏幕也加载正常,所以我知道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]);
  }
  .. 
}

有任何想法吗?



1> 小智..:

如果您使用的是Android Lollipop,即SDK 21,那么:

CookieManager.getInstance().setAcceptCookie(true);

不行.你需要使用:

CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true);

我遇到了同样的问题,上面的一行充当了魅力.


CookieManager cookieManager = CookieManager.getInstance(); if(Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP){cookieManager.setAcceptThirdPartyCookies(webView,true); } else {cookieManager.setAcceptCookie(true); }
setAcceptThirdPartyCookies有2个参数.使用:CookieManager.getInstance().setAcceptThirdPartyCookies(myWebview,true);

2> Pentium10..:

从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()也是异步发生的,因此请不要在活动关闭时执行此操作.

最后这样的事情应该有效:

// 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]);


此外,如果使用WebView引用存储在本地文件系统上的资产,则需要在Build.VERSION.SDK_INT> = 12时调用CookieManager.setAcceptFileSchemeCookies(true).此调用必须优先于CookieSyncManager或CookieManager的首次实例化.

3> burak bayram..:

我弄清楚发生了什么.

当我通过服务器端操作(url访问)加载页面,并在Webview中查看从该操作返回的html时,第一个操作/页面在该Webview内运行.但是,当您单击Web应用程序中作为操作命令的任何链接时,这些操作将启动新的浏览器.这就是为什么cookie信息丢失,因为您为Webview设置的第一个cookie信息消失了,我们这里有一个单独的程序.

您必须拦截Webview上的点击,以便浏览永远不会离开应用程序,所有内容都保留在同一Webview中.

  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]);

这解决了这个问题.


实际上,当覆盖`shouldOverrideUrlLoading`以使你的`WebView`处理所有URL链接时,它应该只是'返回false`.不需要`view.loadUrl(url);`.返回true实际上意味着你想要**系统覆盖处理(可能是为了启动浏览器).因此,如果您希望在Webview中打开链接,只需返回false.资料来源:http://developer.android.com/guide/webapps/webview.html#HandlingNavigation
对或错,第三方不应该对答案的代码进行根本性的改变.如果您同意,请发表您自己的回答或提出批评意见.
错误.错误.错误.Turbo是对的:你绝对不应该在这个回调中调用view.loadUrl().

4> 小智..:

我的问题是cookie不在同一会话"内"工作. -

布拉克:我遇到了同样的问题.启用Cookie修复了该问题.

CookieManager.getInstance().setAcceptCookie(true);

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有