2010-04-02 163 views
34

我在appspot上有一個應用程序,它可以通過常規瀏覽器正常工作,但是當通過Android WebView使用時,它無法設置和讀取Cookie。我並不試圖在這個Web應用程序「外部」獲取cookie,一旦WebView訪問URL,所有處理,ID等都可以停留在那裏,我需要的只是該應用程序內部的會話管理。第一個屏幕也加載正常,所以我知道WebView +服務器的交互性沒有被破壞。Android上的WebView和餅乾

我看着WebSettings類,沒有像setEnableCookies這樣的調用。

我負載網址是這樣的:

public class MyActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);  
    WebView webview = new WebView(this); 
    setContentView(webview);  
    webview.loadUrl([MY URL]); 
    } 
    .. 
} 

任何想法?

+2

您是否100%確定這不是默認關閉JavaScript? – 2010-04-02 12:35:07

+2

我剛查過,事實並非如此。感謝您的意見。 – 2010-04-02 12:58:34

回答

32

我想通了,這是怎麼回事。

當我通過服務器端動作(url訪問)加載頁面,並查看從Webview中的該動作返回的HTML時,該第一個動作/頁面將在該Webview中運行。但是,當您點擊網絡應用中的任何操作命令鏈接時,這些操作將啓動一個新的瀏覽器。這就是爲什麼cookie信息因爲您爲Webview設置的第一個cookie信息消失而丟失的原因,因此我們在此處有一個單獨的程序。

您必須攔截Webview上的點擊,以便瀏覽從不離開應用程序,所有內容都保持在同一Webview中。

WebView webview = new WebView(this);  
    webview.setWebViewClient(new WebViewClient() { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) 
     { 
     view.loadUrl(url); //this is controversial - see comments and other answers 
     return true; 
     } 
    });     
    setContentView(webview);  
    webview.loadUrl([MY URL]); 

解決了這個問題。

+33

實際上,當重寫'shouldOverrideUrlLoading'來讓你的'WebView'處理所有的URL鏈接時,它應該簡單地'返回false'。不需要'view.loadUrl(url);'。返回true實際上意味着您**希望**系統覆蓋處理(可能啓動瀏覽器)。所以如果你想在你的webview中打開鏈接,只需返回false。資料來源:http://developer.android.com/guide/webapps/webview.html#HandlingNavigation – 2012-07-12 00:49:14

+3

錯誤。錯誤。錯誤。 Turbo是正確的:你絕對不應該在這個回調中調用view.loadUrl()。 – 2013-11-26 19:11:43

+4

對或錯,第三方不應對答案的代碼進行根本性更改。如果您同意,請發佈您自己的答案或提出批評意見。 – 2014-05-13 17:42:32

38

Android documentation

CookieSyncManager用於同步RAM和永久存儲之間的瀏覽器cookie 店。爲了獲得最佳性能, 瀏覽器cookie被保存在RAM中。一個單獨的線程在一個定時器的驅動下保存了Cookie 。

要使用CookieSyncManager,主機應用程序必須調用 以下應用程序啓動時:

CookieSyncManager.createInstance(context) 

要設置同步,主機應用程序必須調用

CookieSyncManager.getInstance().startSync() 

在Activity.onResume(),並致電

CookieSyncManager.getInstance().stopSync() 

在Activity.onPause()中。

爲了獲得即時的同步,而不是等待計時器來觸發,該 主機可以在調用

CookieSyncManager.getInstance().sync() 

同步間隔爲5分鐘,那麼你將要強制同步 手動反正,例如onPageFinished(WebView,String)。注意 甚至sync()是異步發生的,所以不要這樣做,就像您的 活動正在關閉一樣。

最後這樣的事情應該工作:

// use cookies to remember a logged in status 
CookieSyncManager.createInstance(this); 
CookieSyncManager.getInstance().startSync(); 
WebView webview = new WebView(this); 
webview.getSettings().setJavaScriptEnabled(true); 
setContentView(webview);  
webview.loadUrl([MY URL]); 
+0

嘗試過這一點,但我並不想將cookie從webview中取出。 Cookie可以在兩個獨立的Webview loadUrl調用之間消失,沒關係。我的問題是在同一個會話中「cookies」不起作用。 – 2010-04-02 13:05:43

+0

檢查出這也是:http://stackoverflow.com/questions/1652850/android-webview-cookie-problem – Pentium10 2010-04-02 13:10:02

+4

另外,你需要調用\t \t \t CookieManager.setAcceptFileSchemeCookies(true)當Build.VERSION.SDK_INT> = 12,如果你使用WebView來引用存儲在本地文件系統上的資產。這個調用必須優先於CookieSyncManager或CookieManager的第一個實例化。 – 2012-12-05 13:25:51

7

我的問題是餅乾不工作「在」同一屆會議。 -

布拉克:我有同樣的問題。啓用cookie可解決問題。

CookieManager.getInstance().setAcceptCookie(true); 
+0

嗨路西法我試過這個,但我不能在cookie中存儲郵件ID和密碼的詳細信息。 webview是否存儲細節?請幫助我。當我第一次輸入id和pwd時,應該保存這些細節,當我要用相同的userid和pwd登錄時,這些細節應該存儲在cookie中,並且應該顯示,然後我必須選擇該id。有沒有可能在webview中存儲食物的細節?感謝和提前問候。 – 2012-06-13 04:55:06

+0

我也跟着這個鏈接http://stackoverflow.com/questions/5404274/make-android-webview-not-store-cookies-or-passwords – 2012-06-13 05:01:43

+0

這個建議解決了我的問題與應用程序重新啓動Android 2.2.1之間丟失的cookie – zasadnyy 2012-10-23 07:45:28

1

CookieManager.getInstance().setAcceptCookie(true);通常情況下,如果你的網頁流量已初始化

它應該工作或試試這個:

CookieSyncManager.createInstance(this); 
CookieManager cookieManager = CookieManager.getInstance(); 
cookieManager.removeAllCookie(); 
cookieManager.setAcceptCookie(true); 
55

如果您使用的是Android棒棒糖即SDK 21,則:

CookieManager.getInstance().setAcceptCookie(true); 

將不起作用。你需要使用:

CookieManager.getInstance().setAcceptThirdPartyCookies(true); 

我遇到了同樣的問題,上面的行工作作爲魅力。

+4

這個答案需要更多upvotes – Melllvar 2015-07-08 23:14:32

+0

我使用minSdk 16,targetsdk 23,這是行不通的,即使當我用setAcceptCookie(true)。 – kommradHomer 2015-10-13 07:34:43

+0

您正在測試的設備的操作系統版本是什麼? – 2015-10-14 08:31:56