2011-12-05 27 views
15

Với mã của tôi dưới đây, tôi đã có thể lưu một cookie, nhưng ngay khi tôi đóng ứng dụng, cookie sẽ biến mất.Làm thế nào để lưu cookie trong một webview Android mãi mãi?

Điều này gây ra như thế nào và tôi có thể giải quyết nó như thế nào?

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 hiện không còn được dùng nữa, sử dụng CookieManager. http: // stackoverflow.com/questions/30502411/cookiesyncmanager-is-now-deprecated-what-can-i-use-thay vì –

+0

@Rahul Sahni Tôi đã thử nhưng nếu đóng ứng dụng và mở lại, tôi phải đăng nhập lại và tất cả cookie bị mất! Bạn có thể cho tôi biết những gì có thể là vấn đề? – user1788736

Trả lời

35

Bạn phải nói với các CookieSyncManager để đồng bộ hóa sau nó đã nạp trang trong câu hỏi. Trong mã mẫu của bạn, phương thức onCreate thực thi hoàn toàn trước khi WebView cố tải trang, do đó quá trình đồng bộ hóa (xảy ra không đồng bộ) có thể sẽ hoàn tất trước khi trang được tải.

Thay vào đó, yêu cầu CookieSyncManager đồng bộ hóa trênPageFinished trong WebViewClient. Điều đó sẽ giúp bạn có được những gì bạn muốn.

CookieSyncManager Documentation là cách tốt để biết cách thực hiện điều này đúng cách.

Đây là cách bạn có thể thiết lập thực hiện WebViewClient của bạn để làm điều này cho bạn:

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(); 
    } 
); 

Bạn sẽ không cần phải nói với CookieSyncManager để đồng bộ ở nơi khác với điều này tại chỗ. Tôi đã không thử nghiệm này, vì vậy hãy cho tôi biết nếu nó hoạt động.

+0

Tôi hoàn toàn mới ... Bạn có thể cho tôi một số mã thực tế không? Điều đó sẽ giúp một tấn! – Joe

+1

Có bạn đi. Cho nó một whirl. – lyricsboy

+2

Bạn đá! Điều đó làm việc hoàn hảo ... thiên tài thuần khiết! Cảm ơn anh bạn! – Joe

4

.sync() là bắt buộc đồng bộ hóa imediate và phải được gọi sau khi tải trang vì nó đồng bộ RAM với bộ nhớ cache, vì vậy cookie phải nằm trong ram trước khi gọi.

Hệ thống tự động đồng bộ hóa nó mỗi 5 mintues nếu bạn sử dụng chương trình này

onCreate: 
CookieSyncManager.createInstance(context) 

onResume: 
CookieSyncManager.getInstance().startSync() 

onPause: 
CookieSyncManager.getInstance().stopSync() 

Tôi nghĩ rằng bạn không đợi 5 mintues vì ​​vậy hệ thống lưu cookie.

+0

Tôi nên làm gì Nếu tôi muốn đồng bộ hóa cookie ngay lập tức mà không cần chờ 5 phút trên android 6? – user1788736

0

Đối với những người đang gặp sự cố với lớp học CookieManager để làm cho cookie tồn tại ngay cả sau khi đóng ứng dụng, họ nên thử chức năng flush() của CookieManager.

Xin lưu ý rằng tôi chưa thử điều này, vì vậy nếu nó hoạt động thì vui lòng cho tôi biết.

Theo tài liệu android

void flush()

Đảm bảo tất cả các cookie hiện truy cập thông qua API getCookie được ghi vào lưu trữ liên tục. Cuộc gọi này sẽ chặn người gọi cho đến khi nó được thực hiện và có thể thực hiện I/O.

Cũng trong CookieSyncManager documnentation nó được viết rằng:

Lớp này được tán thành trong mức API 21. Các WebView bây giờ tự động đồng bộ hóa các tập tin cookie khi cần thiết. Bạn không cần tạo hoặc sử dụng CookieSyncManager nữa. Để buộc đồng bộ hóa một cách thủ công, bạn có thể sử dụng phương thức flush() là phương thức thay thế đồng bộ cho đồng bộ(). CookieSyncManger link

+0

@ user1788736 hy vọng điều này sẽ giúp bạn –

Các vấn đề liên quan