2013-03-13 338 views
0

我有一些http請求。其中一個從它的響應中檢索並解析cookie。我通過CookieSyncManager和CookieManager通過以下代碼保存此Cookie:CookieManager.getCookie()返回null

CookieSyncManager.createInstance(context); 
      CookieManager cookieManager = CookieManager.getInstance(); 
      cookieManager.removeSessionCookie(); 
      cookieManager.removeAllCookie(); 
      String cookieString = cookie.getName() + "=" + cookie.getValue(); 
      Log.e(getClass().toString(), cookieString); 
      cookieManager.setCookie(START_PAYMENT_URL, cookieString); 
      CookieSyncManager.getInstance().sync(); 
      Log.e(getClass().toString(), "Get cookie: " + cookieManager.getCookie(START_PAYMENT_URL)); 

兩個Log.e調用都寫入相同的cookie。所以一切都很好。

我有不同的活動,其中包含WebView。我需要用一些POST參數和授權cookie調用postUrl(String url)方法。我以爲Cookie是在CookieManager中,一切都應該很好。好。它是。但僅限於4.x設備。

在2.x設備上,WebView使postUrl無cookie。

這裏是活動的代碼包含web視圖:

 @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.payment_webview); 

     final String billId = getIntent().getStringExtra(INTENT_BILL_ID); 

     final WebView webView = (WebView) findViewById(R.id.payment_webview); 

     webView.getSettings().setJavaScriptEnabled(true); 

     webView.setWebViewClient(new WebViewClient() { 
      @Override 
      public boolean shouldOverrideUrlLoading(WebView view, String url) { 
       Log.e(getClass().toString(), url); 
       view.loadUrl(url); 
       return false; 
      } 
     }); 

     String postData = "id_bill=" + billId; 
     Log.d(TAG, "Requesting payment URL " + START_PAYMENT_URL + " with post data: " + postData); 
     Log.d(TAG, CookieManager.getInstance().getCookie(START_PAYMENT_URL)); 
     webView.postUrl(START_PAYMENT_URL, EncodingUtils.getBytes(postData, "BASE64")); 
    } 

CookieManager.getInstance()的getCookie(START_PAYMENT_URL)返回null上2.x設備和4.x的設備Cookie值。

如何解決這個問題?

回答

0

好像我想出了什麼問題。

我只是刪除

cookieManager.removeSessionCookie(); 
cookieManager.removeAllCookie(); 

,而我保存的cookies。

我想這個問題是CookieManager的所有方法異步工作。可能刪除在cookieManager.setCookie(START_PAYMENT_URL, cookieString);之後調用的cookie方法,即使它們在它之前調用過。所以CookieManager保存cookie,然後刪除cookie方法調用。