2011-12-05 4 views
15

नीचे मेरी कोड के साथ, मैं एक कुकी को बचाने के लिए सक्षम किया गया है, लेकिन जैसे ही मैं अनुप्रयोग को बंद के रूप में कुकी गायब हो जाता है।एक एंड्रॉइड वेबव्यू में कुकी को हमेशा से कैसे सहेजना है?

यह कैसे होता है और मैं इसे कैसे हल कर सकता हूं?

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

    } 
} 
+0

CookieSyncManager अब हटाई गई है, CookieManager का उपयोग करें। http: // stackoverflow।कॉम/प्रश्न/30502411/कुकीज़yncmanager-is-now-deprecated-what-can-i-use-इसके बजाय –

+0

@Rahul Sahni मैंने कोशिश की लेकिन अगर ऐप बंद करें और फिर से खोलें तो मुझे लॉगिन करना होगा और सभी कुकीज़ खो जाएंगी! क्या आप मुझे बता सकते हैं कि समस्या क्या हो सकती है? – user1788736

उत्तर

35

आप CookieSyncManager बताने के लिए के बाद यह प्रश्न में पृष्ठ के लोड होते सिंक करने के लिए है। अपने नमूना कोड में, onCreate विधि पूरी तरह से कार्यान्वित होने से पहले WebView पृष्ठ लोड करने की कोशिश करता है, तो समन्वयन की प्रक्रिया (जो एसिंक्रोनस रूप से होता है) शायद पूरा पेज लोड होने से पहले होगा।

इसके बजाय, CookieSyncManager बता WebViewClient में onPageFinished सिंक करने के लिए। आपको वह चाहिए जो आप चाहते हैं।

CookieSyncManager Documentation यह कैसे ठीक से करने के लिए के लिए एक अच्छा पढ़ा है।

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 बताने के लिए जगह में इस के साथ कहीं और सिंक करने के लिए की जरूरत नहीं होगी:

यहाँ कैसे आप के लिए यह करने के लिए अपने WebViewClient कार्यान्वयन की स्थापना कर सकता है। मैंने इसका परीक्षण नहीं किया है, इसलिए अगर यह काम करता है तो मुझे बताएं।

+0

मैं पूरी तरह से नया हूं ... क्या आप मुझे कुछ वास्तविक कोड दे सकते हैं? इससे एक टन मदद मिलेगी! – Joe

+1

वहां आप जाते हैं। इसे एक घुमाव दीजिये। – lyricsboy

+2

आप रॉक! यह पूरी तरह से काम किया ... शुद्ध प्रतिभा! धन्यवाद दोस्त! – Joe

4

.sync() एक imediate सिंक के लिए मजबूर करने के लिए है, और पृष्ठ लोड कारण कैश के साथ यह सिंक रैम के बाद बुलाया जाना चाहिए, ताकि कुकी यह कॉल करने से पहले राम में होना चाहिए।

सिस्टम स्वचालित रूप से हर 5 mintues यह सिंक अगर आप इस योजना के

onCreate: 
CookieSyncManager.createInstance(context) 

onResume: 
CookieSyncManager.getInstance().startSync() 

onPause: 
CookieSyncManager.getInstance().stopSync() 

का उपयोग मुझे लगता है कि आप 5 mintues इंतजार कर रहे थे नहीं था इसलिए प्रणाली कुकी बचाने के।

+0

मुझे क्या करना चाहिए यदि मैं एंड्रॉइड 6 पर 5 मिनट इंतजार किए बिना तुरंत कुकीज़ सिंक करना चाहता हूं? – user1788736

0

जो लोग CookieManager वर्ग के साथ कोई समस्या का सामना कर रहे कुकी बनाने के लिए के लिए जारी रहती है अनुप्रयोग बंद करने के बाद भी, वे CookieManager की flush() समारोह कोशिश करनी चाहिए।

कृपया ध्यान दें कि मैं इस प्रयास नहीं किया है, इसलिए यदि यह तो काम करता है मुझे भी बताएं।

एंड्रॉयड प्रलेखन

void flush()

के अनुसार यह सुनिश्चित करता है वर्तमान में getCookie एपीआई के माध्यम से सुलभ सभी कुकीज़ स्थायी संग्रह में लिखे गए हैं। यह कॉल कॉलर को तब तक अवरुद्ध कर देगा जब तक यह नहीं किया जाता है और I/O निष्पादित कर सकता है।

इसके अलावा CookieSyncManager documnentation में यह लिखा है कि:

इस वर्ग एपीआई स्तर 21 में पदावनत किया गया था WebView अब स्वचालित रूप से आवश्यक के रूप में कुकीज़ सिंक करता है। अब आपको कुकी SyncManager बनाने या उपयोग करने की आवश्यकता नहीं है। सिंक को मैन्युअल रूप से मजबूर करने के लिए आप कुकी मैनेजर विधि फ्लश() का उपयोग कर सकते हैं जो सिंक() के लिए एक तुल्यकालिक प्रतिस्थापन है। CookieSyncManger link

+0

@ user1788736 उम्मीद है कि यह आपकी मदद करता है –

संबंधित मुद्दे