如何在Android的Web视图永远保存一个cookie?

用我的代码下面,我已经能够保存一个cookie,但只要我closures应用程序的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 (ie 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://"); } } 

Solutions Collecting From Web of "如何在Android的Web视图永远保存一个cookie?"

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

相反,告诉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 (ie no internet connection) Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show(); } public void onPageFinished(WebView view, String url) { CookieSyncManager.getInstance().sync(); } ); 

你不需要告诉CookieSyncManager与其他地方同步。 我没有testing过,所以让我知道它是否工作。

.sync()是强制一个imediate同步,并且必须在页面加载之后调用它使RAM与caching同步,所以在调用它之前cookie必须在ram中。

系统每5分钟自动同步一次,如果你使用这个scheme

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

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

对于那些面临CookieManager类的问题,甚至在closures应用程序之后仍然保持cookie的情况下,他们应该尝试CookieManagerflush()函数。

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

根据android文档

void flush()

确保当前通过getCookie API访问的所有cookie都写入永久存储器。 这个调用将阻止调用者,直到完成并且可以执行I / O。

另外在CookieSyncManager文档中写道:

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