WebViewClient将数据返回到Activity onPageFinished

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WebViewClient将数据返回到Activity onPageFinished相关的知识,希望对你有一定的参考价值。

我需要从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如何在它拥有来自WebView的数据之前阻止返回MainActivity。

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");
    }
}
答案

在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以获得结果

以上是关于WebViewClient将数据返回到Activity onPageFinished的主要内容,如果未能解决你的问题,请参考以下文章

如何从 webViewClient.shouldInterceptRequest() 返回 Http 错误响应?

WebViewClient 和 WebChromeClient 是互斥的吗?

Webview shouldInterceptRequest方法始终返回null

WebViewClient 不会打开在 shouldOverrideUrlLoading() 中处理的页面

如何从不在 Android 的 API 26 上的 WebView 获取 WebviewClient 实例?

Android WebViewClient url 重定向(Android URL 加载系统)