WebViewClient将数据返回到Activity onPageFinished

时间:2017-12-16 18:17:19

标签: android cookies webview

我需要从WebView收集浏览器cookie并将它们返回给另一个Activity。收集cookie已经可以使用但是在扩展WebViewClient的类中发生,我不知道如何从那里返回数据。

有2项活动; MainActivity和LoginActivity分别。 MainActivity有一个按钮,用于创建Intent并启动LoginActivity,它具有单个WebView。 OnCreate(),WebView将定向到网站的登录页面。当用户成功登录此站点时,它会将数据存储在浏览器cookie中 - 稍后我需要API调用的数据。如何将此数据返回给MainActivity?

WebView有一个带有重写OnPageFinished()方法的自定义WebViewClient,如果URL是预期的,将收集浏览器cookie,如下所示。

class TempWebViewClient extends WebViewClient {
    @Override
    public void onPageFinished(WebView view, String url) {
        // If page URL is the Home page (ie., you logged in successfully), collect cookies.
        if (url.equals("https://slate.sheridancollege.ca/d2l/m/home")) {
            String cookies = CookieManager.getInstance().getCookie(url);
            String[] cookies2 = cookies.split(";");
            String key1 = "";
            String key2 = "";

            // Find Keys placed in browser cookies.
            for (String c : cookies2) {
                String[] c2 = c.split("=");

                if (c2[0].equals(" phrase1")) {
                    key1 = c2[1];
                }
                if (c2[0].equals(" phrase2")) {
                    key = c2[1];
                }
            }
        }
    }
}

在我收到Cookie中的密钥之前,LoginActivity不应调用finish()(返回MainActivity)。鉴于我已经拥有的,我怎样才能实现这一目标?我不知道LoginActivity如何阻止返回MainActivity,直到它拥有来自其WebView的数据。

public class LoginActivty extends Activity {
    WebView webview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        setupViews();
        setContentView(webview);
    }
    public void setupViews() {
        StrictMode.ThreadPolicy policy = new 
        StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        CookieManager.getInstance().setAcceptCookie(true);
        webview = new WebView(this);
        webview.setWebViewClient(new TempWebViewClient());
        webview.getSettings().setJavaScriptEnabled(true);
        webview.loadUrl("website");
    }
}

1 个答案:

答案 0 :(得分:0)

在TempWebclient中创建登录活动的引用,以便在获取cookie后传递结果。

class TempWebViewClient extends WebViewClient {

  LoginActivty mDelegate;

  public TempWebViewClient(LoginActivty ref) {
         this.mDelegate = ref;
  }

  @Override
  public void onPageFinished(WebView view, String url) { 
   // perform task 
    String cookie;// get from CookieManager
    mDelegate.sendCookieAndFinish(cookie);
  }

}

在登录活动中创建功能

public class LoginActivty extends Activity {

    WebView webview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
     ....
    }
    public void setupViews() {
       ....
        // send activity reference to webclient
        webview.setWebViewClient(new TempWebViewClient(this)); 
    }

   public void sendCookieAndFinish(String cookie){
     setResult(ResultCode,ResultIntent); // set result for your main activity
    // store cookie to storage
    finish();
  }

}

从主要活动启动您的LoginActivity以获得结果