以下のコードで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 Documentation は、これを適切に行う方法についての良い読み物です。
これを行うために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()は即時同期を強制するものであり、ページの読み込み後にRAMをキャッシュと同期させるために呼び出す必要があるため、呼び出す前にcookieをRAMに配置する必要があります。
このスキームを使用する場合、システムは5分ごとに自動的に同期します
onCreate:
CookieSyncManager.createInstance(context)
onResume:
CookieSyncManager.getInstance().startSync()
onPause:
CookieSyncManager.getInstance().stopSync()
5分待っていなかったので、システムはCookieを保存しました。
CookieManager
クラスの問題に直面していて、アプリを閉じた後でもCookieを永続させる場合は、CookieManager
のflush()
関数を試してください。
私はこれを試したことがないことに注意してください、それでそれがうまくいくなら、私にも知らせてください。
Androidドキュメントに従って
GetCookie APIを介して現在アクセス可能なすべてのCookieが永続ストレージに書き込まれるようにします。この呼び出しは、完了するまで呼び出し元をブロックし、I/Oを実行する可能性があります。
また、CookieSyncManager
documnentationには次のように書かれています:
このクラスはAPIレベル21で廃止されました。WebViewは、必要に応じてCookieを自動的に同期するようになりました。 CookieSyncManagerを作成または使用する必要がなくなりました。同期を手動で強制するには、sync()の同期置換であるCookieManagerメソッドflush()を使用できます。 CookieSyncMangerリンク