0

私は自分のwebviewにそのCookieを記憶させようとしています。私の問題は、しばらくしてから削除されてしまうことです。Android webviewのCookieは、しばらくしてクリア/ガベージコレクションされます - Cookieのカスタムストレージパスを設定できますか?

いくつかの調査をした後、私はjavaの内部HttpClientがCookieManagerを使用し、CookieStoreがガベージコレクションを取得することを発見しました。 HttpClientは私のネットワークコードの一部で使用されています(私が書いたものではありません)。 これが私の問題の原因だと確信しています。

私の質問は、WebブラウザからHttpClientで使用されている以外の場所にCookieを保存する方法はありますか?私はそうのようなカスタムパスを設定しようとした

webview.setWebViewClient(new WebViewClient() { 
       @Override 
       public void onPageFinished(WebView view, String url) { 
        if (getCustomActivity() != null) { 
         CookieSyncManager.createInstance(getCustomActivity()).sync(); 
        } 
       } 
      }); 
      webview.getSettings().setAppCachePath("/data/data/"+getActivity().getPackageName()+"/webview_cookies/"); 
      webview.loadUrl(url, true); 

しかし運と

誰かが私を助けてくれることを願っています。 ご協力いただければ幸いです。

+0

[Android webviewでクッキーを永久に保存するにはどうすればいいですか?](https://stackoverflow.com/questions/8390156/how-to-save-a-cookie-in-an-android-webview-永遠に) –

答えて

0

私は最終的に満足している解決策を見つけました。基本的には、CookieをShared Preferencesに保存してそこから取得しています。ここで

は、溶液(も標準WebViewの可能性がありAdvancedWebViewを拡張するビュークラス、)のための私の提案です:

public class PersistentCookiesWebView extends AdvancedWebView { 

    private static String  url       = "PersistentCookiesWebView"; 
    private static String  cookieKey     = ""; 
    private static final String COOKIE_STORAGE_KEY_PREFIX = "cskp_"; 
    private static final long COOKIE_MAX_STORAGE_BYTES = 500000; 

    public PersistentCookiesWebView(Context context) { 
     super(context); 
    } 

    public PersistentCookiesWebView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public PersistentCookiesWebView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    public void loadUrl(final String url, String cookieKey) { 
     this.url  = url; 
     this.cookieKey = cookieKey; 
     initializeWebView(new WebViewListener() { 
      @Override 
      public void onWebViewReady() { 
       PersistentCookiesWebView.super.loadUrl(url); 
      } 
     }); 
    } 

    @Override 
    public void loadUrl(final String url) { 
     this.url  = url; 
     this.cookieKey = getHostName(); 
     initializeWebView(new WebViewListener() { 
      @Override 
      public void onWebViewReady() { 
       PersistentCookiesWebView.super.loadUrl(url); 
      } 
     }); 
    } 

    @Override 
    public void loadUrl(final String url, final Map<String, String> additionalHttpHeaders) { 
     this.url  = url; 
     this.cookieKey = getHostName(); 
     initializeWebView(new WebViewListener() { 
      @Override 
      public void onWebViewReady() { 
       PersistentCookiesWebView.super.loadUrl(url, additionalHttpHeaders); 
      } 
     }); 
    } 

    @Override 
    public void loadUrl(final String url, final boolean preventCaching) { 
     this.url  = url; 
     this.cookieKey = getHostName(); 
     initializeWebView(new WebViewListener() { 
      @Override 
      public void onWebViewReady() { 
       PersistentCookiesWebView.super.loadUrl(url, preventCaching); 
      } 
     }); 
    } 

    @Override 
    public void loadUrl(final String url, final boolean preventCaching, final Map<String, String> additionalHttpHeaders) { 
     this.url  = url; 
     this.cookieKey = getHostName(); 
     initializeWebView(new WebViewListener() { 
      @Override 
      public void onWebViewReady() { 
       PersistentCookiesWebView.super.loadUrl(url, preventCaching, additionalHttpHeaders); 
      } 
     }); 
    } 

    protected void initializeWebView(final WebViewListener webViewListener) { 
     setWebViewClient(new WebViewClient() { 
      @Override 
      public void onPageFinished(WebView view, String url) { 
       super.onPageFinished(view, url); 
       CookieManager.getInstance().flush(); 
      } 
     }); 
     setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       saveCookies(null); 
       return false; 
      } 
     }); 
     fetchCookies(new CookieFetchListener() { 
      @Override 
      public void onCookiesFetched() { 
       webViewListener.onWebViewReady(); 
      } 
     }); 
    } 

    public void saveCookies(CookieSaveListener cookieSaveListener) { 

     String storageKey     = COOKIE_STORAGE_KEY_PREFIX + cookieKey; 
     String currentCookieString   = CookieManager.getInstance().getCookie(url) + ""; 
     ArrayList<String> currentCookieList = new ArrayList<String>(Arrays.asList(currentCookieString.split(";"))); 
     long cookieBytes     = 0; 
     String newCookies     = ""; 

     for(int i = currentCookieList.size() - 1; i >= 0; i--) { 
      String cookie = currentCookieList.get(i); 
      try { 
       cookieBytes = cookieBytes + cookie.getBytes().length; 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      if (cookieBytes < COOKIE_MAX_STORAGE_BYTES) { 
       newCookies = cookie + ";" + newCookies; 
      } else { 
       break; 
      } 
     } 
     PreferencesManager.putString(getContext(), storageKey, newCookies); 

     if (cookieSaveListener != null) { 
      cookieSaveListener.onCookiesSaved(); 
     } 
    } 

    private void fetchCookies(final CookieFetchListener cookieFetchListener) { 
     String storageKey     = COOKIE_STORAGE_KEY_PREFIX + cookieKey; 
     String currentCookieString   = CookieManager.getInstance().getCookie(url) + ""; 
     String storedCookiesString   = PreferencesManager.getString(getContext(), storageKey) + ""; 
     ArrayList<String> storedCookiesList = new ArrayList<String>(Arrays.asList(storedCookiesString.split(";"))); 

     for (String storedCookie : storedCookiesList) { 
      if(!currentCookieString.contains(storedCookie)) { 
       CookieManager.getInstance().setCookie(url, storedCookie); 
       CookieManager.getInstance().setCookie(cookieKey, storedCookie); 
      } 
     } 
     cookieFetchListener.onCookiesFetched(); 
     saveCookies(null); 
    } 

    private String getHostName() { 
     try { 
      URL aURL = new URL(url); 
      return aURL.getHost() + ""; 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
      return ""; 
     } 
    } 

    @Override 
    protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     Log.d(getClass().getSimpleName(), "Cookies attempting to save..."); 
     saveCookies(new CookieSaveListener() { 
      @Override 
      public void onCookiesSaved() { 
       Log.d(getClass().getSimpleName(), "Cookies saved!"); 
      } 
     }); 
    } 

    interface CookieFetchListener { 
     void onCookiesFetched(); 
    } 
    interface CookieSaveListener { 
     void onCookiesSaved(); 
    } 
    interface WebViewListener { 
     void onWebViewReady(); 
    } 
} 

私はこれは同様に他の人に役立ちます願っています。

関連する問題