【问题标题】:WebViewClient return data to Activity onPageFinishedWebViewClient 将数据返回给 Activity onPageFinished
【发布时间】:2017-12-16 18:17:19
【问题描述】:

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

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

WebView 有一个自定义的 WebViewClient,其中重写了 OnPageFinished() 方法,如果 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");
    }
}

【问题讨论】:

  • 一种简单的方法,您可以使用一些默认值将 cookie 存储在 sharedPreference 中,并在登录后在 main Activity 或 startActivity 中检查结果,然后返回结果。
  • 问题在于时机;它看起来像一个多线程问题。我希望 LoginActivity 仅在获得 cookie 的密钥后返回 MainActivity。您的解决方案没有考虑时间。

标签: android cookies webview


【解决方案1】:

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

}

从 Main Activity 开始您的 LoginActivity 以获得结果

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    相关资源
    最近更新 更多