Как сохранить cookie в веб-браузере Android навсегда? - PullRequest
17 голосов
/ 05 декабря 2011

С моим кодом, приведенным ниже, я смог сохранить 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://");

   }
}

Ответы [ 3 ]

39 голосов
/ 05 декабря 2011

Вы должны указать CookieSyncManager синхронизировать после того, как загрузит соответствующую страницу.В вашем примере кода метод onCreate полностью выполняется до того, как WebView попытается загрузить страницу, поэтому процесс синхронизации (который происходит асинхронно), вероятно, завершится до загрузки страницы.

Вместо этого укажитеCookieSyncManager для синхронизации onPageFinished в WebViewClient.Это должно дать вам то, что вы хотите.

Документация 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 для синхронизации в другом месте с этим на месте.Я не проверял это, поэтому дайте мне знать, если это работает.

4 голосов
/ 22 декабря 2014

.sync () предназначен для принудительной немедленной синхронизации и должен вызываться после загрузки страницы, поскольку он синхронизирует ОЗУ с кешем, поэтому cookie должен находиться в оперативной памяти перед вызовом.

Система автоматически синхронизирует его каждые 5mintues, если вы используете эту схему

onCreate: 
CookieSyncManager.createInstance(context)

onResume:
CookieSyncManager.getInstance().startSync()

onPause:
CookieSyncManager.getInstance().stopSync()

Я думаю, что вы не ждали 5 минут, чтобы сохранить файл cookie.

1 голос
/ 20 декабря 2017

Для тех, кто сталкивается с проблемами в классе CookieManager, чтобы сохранить cookie даже после закрытия приложения, им следует попробовать функцию flush() CookieManager.

Обратите внимание, что я не пробовал это, поэтому, если это работает, то, пожалуйста, дайте мне знать.

Согласно документации Android

voidflush ()

Обеспечивает запись всех файлов cookie, доступных в настоящее время через API getCookie, в постоянное хранилище.Этот вызов блокирует вызывающего до тех пор, пока он не будет выполнен, и может выполнить ввод / вывод.

Также в CookieSyncManager documnentation написано, что:

Этот класс устарелна уровне API 21. Теперь WebView автоматически синхронизирует файлы cookie по мере необходимости.Вам больше не нужно создавать или использовать CookieSyncManager.Для принудительной синхронизации можно использовать метод CookieManager flush (), который является синхронной заменой sync (). CookieSyncManger ссылка

...