ti-enxame.com

Como salvar um cookie em uma visualização na web Android $ para sempre?

Com o meu código abaixo, consegui salvar um cookie, mas assim que fecho o aplicativo, o cookie desaparece.

Como isso é causado e como posso resolvê-lo?

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

   }
}
19
Joe

Você precisa informar ao CookieSyncManager para sincronizar após carregar a página em questão. No seu código de exemplo, o método onCreate é executado completamente antes que o WebView tente carregar a página; portanto, o processo de sincronização (que ocorre de forma assíncrona) provavelmente será concluído antes do carregamento da página.

Em vez disso, diga ao CookieSyncManager para sincronizar onPageFinished no WebViewClient. Isso deve te dar o que você quer.

A documentação do CookieSyncManager é uma boa leitura de como fazer isso corretamente.

Aqui está como você pode configurar sua implementação do WebViewClient para fazer isso por você:

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

Você não precisaria dizer ao CookieSyncManager para sincronizar em outro lugar com isso no local. Eu não testei isso, então deixe-me saber se funciona.

40
lyricsboy

.sync () é forçar uma sincronização imediata e deve ser chamada após o carregamento da página causar sincronização RAM com cache, portanto, o cookie deve estar em ram antes de chamá-la.

O sistema sincroniza automaticamente a cada 5 minutos, se você usar este esquema

onCreate: 
CookieSyncManager.createInstance(context)

onResume:
CookieSyncManager.getInstance().startSync()

onPause:
CookieSyncManager.getInstance().stopSync()

Eu acho que você não esperou 5 minutos, então o sistema salva o cookie.

4
Dionis L

Para aqueles que estão enfrentando problemas com a classe CookieManager para fazer com que o cookie persista mesmo após o fechamento do aplicativo, eles devem tentar a função flush() de CookieManager.

Observe que eu não tentei isso, por isso, se funcionar, informe-me também.

De acordo com Android

descarga nula ()

Garante que todos os cookies atualmente acessíveis por meio da API getCookie sejam gravados no armazenamento persistente. Essa chamada bloqueará o chamador até que seja concluída e possa executar E/S.

Também na documentação CookieSyncManager está escrito que:

Essa classe foi descontinuada no nível 21. da API. O WebView agora sincroniza automaticamente os cookies conforme necessário. Você não precisa mais criar ou usar o CookieSyncManager. Para forçar manualmente uma sincronização, você pode usar o método CookieManager flush (), que é um substituto síncrono para sync (). link CookieSyncManger

2
Rahul Sahni