web-dev-qa-db-ja.com

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://");

   }
}
19
Joe

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に他の場所でこれと同期するように指示する必要はありません。私はこれをテストしていないので、うまくいくかどうか知らせてください。

40
lyricsboy

.sync()は即時同期を強制するものであり、ページの読み込み後にRAMをキャッシュと同期させるために呼び出す必要があるため、呼び出す前にcookieをRAMに配置する必要があります。

このスキームを使用する場合、システムは5分ごとに自動的に同期します

onCreate: 
CookieSyncManager.createInstance(context)

onResume:
CookieSyncManager.getInstance().startSync()

onPause:
CookieSyncManager.getInstance().stopSync()

5分待っていなかったので、システムはCookieを保存しました。

4
Dionis L

CookieManagerクラスの問題に直面していて、アプリを閉じた後でもCookieを永続させる場合は、CookieManagerflush()関数を試してください。

私はこれを試したことがないことに注意してください、それでそれがうまくいくなら、私にも知らせてください。

Androidドキュメントに従って

void flush()

GetCookie APIを介して現在アクセス可能なすべてのCookieが永続ストレージに書き込まれるようにします。この呼び出しは、完了するまで呼び出し元をブロックし、I/Oを実行する可能性があります。

また、CookieSyncManager documnentationには次のように書かれています:

このクラスはAPIレベル21で廃止されました。WebViewは、必要に応じてCookieを自動的に同期するようになりました。 CookieSyncManagerを作成または使用する必要がなくなりました。同期を手動で強制するには、sync()の同期置換であるCookieManagerメソッドflush()を使用できます。 CookieSyncMangerリンク

2
Rahul Sahni