Как сохранить cookie в веб-браузере Android навсегда?
С моим кодом ниже я смог сохранить файл 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 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 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://");
}
}
Ответы
Ответ 1
Вы должны сообщить 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 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 для синхронизации в другом месте с этим. Я не проверял это, поэтому дайте мне знать, если это сработает.
Ответ 2
.sync() - принудительная синхронизация и должна быть вызвана после загрузки страницы, поэтому синхронизирует ОЗУ с кешем, поэтому cookie должен быть включен в операторе перед его вызовом.
Система автоматически синхронизирует его каждые 5 минут, если вы используете эту схему
onCreate:
CookieSyncManager.createInstance(context)
onResume:
CookieSyncManager.getInstance().startSync()
onPause:
CookieSyncManager.getInstance().stopSync()
Я думаю, вы не ждали 5 минут, поэтому система сохранит файл cookie.
Ответ 3
Для тех, кто сталкивается с проблемами класса CookieManager
, чтобы cookie сохранялся даже после закрытия приложения, они должны попробовать функцию flush()
CookieManager
.
Обратите внимание, что я не пробовал это, поэтому, если он работает, пожалуйста, сообщите мне об этом.
Согласно документации android
void flush()
Обеспечивает, чтобы все файлы cookie, доступные в настоящее время через API getCookie, записывались в постоянное хранилище. Этот вызов блокирует вызывающего абонента, пока он не будет выполнен, и может выполнять операции ввода-вывода.
Также в CookieSyncManager
documnentation написано, что:
Этот класс устарел на уровне API 21. WebView теперь автоматически синхронизирует файлы cookie по мере необходимости. Вам больше не нужно создавать или использовать CookieSyncManager. Чтобы вручную принудительно синхронизировать, вы можете использовать метод CookieManager flush(), который является синхронной заменой для sync(). Ссылка CookieSyncManger