如何在Android webview中永久保存cookie



使用下面的代码,我已经能够保存一个cookie,但是一旦我关闭应用程序,cookie就会消失。

这是如何引起的,我该如何解决?

package com.jkjljkj
import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.webkit.CookieSyncManager;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
public class Activity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        CookieSyncManager.createInstance(getBaseContext());
        // Let's display the progress in the activity title bar, like the
        // browser app does.

        getWindow().requestFeature(Window.FEATURE_PROGRESS);
        WebView webview = new WebView(this);
        setContentView(webview);

        webview.getSettings().setJavaScriptEnabled(true);
        final Activity activity = this;
        webview.setWebChromeClient(new WebChromeClient() {
        public void onProgressChanged(WebView view, int progress) {
             // Activities and WebViews measure progress with different scales.
             // The progress meter will automatically disappear when we reach 100%
             activity.setProgress(progress * 1000);
        }
      });
      webview.setWebViewClient(new WebViewClient() {
         public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
              //Users will be notified in case there's an error (i.e. no internet connection)
              Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
         }
      });
      CookieSyncManager.getInstance().startSync();
      CookieSyncManager.getInstance().sync();
     //This will load the webpage that we want to see
      webview.loadUrl("http://");
   }
}

你必须告诉CookieSyncManager在加载页面后同步。在您的示例代码中,onCreate方法在WebView尝试加载页面之前完全执行,因此同步过程(异步发生)可能会在加载页面之前完成。

告诉CookieSyncManager在WebViewClient中同步onPageFinished。这应该能让你得到你想要的。

CookieSyncManager文档是一个很好的阅读如何正确地做到这一点。

下面是你如何设置你的WebViewClient实现来为你做这件事:

webview.setWebViewClient(new WebViewClient() {
    public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
        //Users will be notified in case there's an error (i.e. no internet connection)
        Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
    }
    public void onPageFinished(WebView view, String url) {
        CookieSyncManager.getInstance().sync();
    }
);

你不需要告诉CookieSyncManager在其他地方同步。我还没有测试过这个,所以让我知道它是否有效。

.sync()是强制立即同步,必须在页面加载后调用,因为它会同步内存和缓存,所以cookie必须在调用它之前在内存中。

如果您使用此方案,系统将自动每5分钟同步一次

onCreate: 
CookieSyncManager.createInstance(context)
onResume:
CookieSyncManager.getInstance().startSync()
onPause:
CookieSyncManager.getInstance().stopSync()

我认为你没有等待5分钟,所以系统保存cookie。

对于CookieManager类在关闭应用程序后仍然无法使cookie持续存在的问题,可以尝试CookieManagerflush()功能。

请注意,我还没有尝试过,所以如果它工作,请让我知道。

根据android文档

空白冲洗()

确保当前通过getCookie API可访问的所有cookie都被写入持久存储。此调用将阻塞调用方,直到调用完成并执行I/o。

同样在CookieSyncManager文档中,它是这样写的:

该类在API级别21中已弃用。现在,WebView会根据需要自动同步cookie。您不再需要创建或使用CookieSyncManager。要手动强制同步,您可以使用CookieManager方法flush(),它是sync()的同步替代品。CookieSyncManger链接

适用于API 20+

        myWebView.setWebViewClient(new WebViewClient(){
            public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl){
                Toast.makeText(MainActivity.this, "Oh no! " + description, Toast.LENGTH_SHORT).show();
            }
            public void onPageFinished(WebView webView, String url){
                CookieManager.getInstance().flush();
            }
        }
        
        );

适用于API 20+

myWebView.setWebViewClient(new WebViewClient(){
         ......
            public void onPageFinished(WebView webView, String url){
                CookieManager.getInstance().flush();
            }
         ......
        }
        
        );

相关内容

  • 没有找到相关文章

最新更新