我想检测我的webview何时加载某个页面,例如,不正确的登录页面。我已尝试使用onLoadResource
和shouldOverrideUrlLoading
,但我无法工作,而且我认为更好的方法是在网络视图开始时解析HTML加载页面,如果在HTML中找到某个字符串,则执行任何操作。
有没有办法做到这一点?我尝试过使用TagSoup,但我不知道如何将它与我的webview联系起来。这是我的代码现在的样子:
String fullpost = "pass=" + passwordt + "&user=" + usernamet + "&uuid=" + UUID;
String url = "mydomain.com";
mWebview.postUrl(url, EncodingUtils.getBytes(fullpost, "BASE64"));
mWebview.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView mWebview, String url) {
String webUrl = mWebview.getUrl();
if (webUrl.contains("/loginf")) {
MainActivity.this.mWebview.stopLoading();
MainActivity.this.setContentView(R.layout.preweb);
}
}
});
基本上,postUrl是通过用户点击布局中的按钮启动的,这是启动WebView的原因,然后我将setContentView
调用到包含webview的布局。
从那里,如果登录信息正确,则网页转到XXX,如果不正确,则转到YYY。所以,我想立即检测(并在每个页面上加载),如果加载了YYY,则//domagic
。希望有道理。作为从url
到XXX或YYY的页面重定向是自动的,不是由用户发起的,shouldOverrideUrlLoading
不起作用,我无法弄清楚如何使用{{1我完全迷失了。
我当前的想法是将所有内容加载到一个单独的线程中,然后使用WebView显示内容(这样我可以解析HTML),但我不确定它是如何工作的,甚至不知道如何这样做。
任何人都有任何想法或建议吗?
答案 0 :(得分:0)
我想我已经阅读了一种获取webview内容文本字符串的方法。然后,您可以使用jsoup来解析它。 [neh,甚至不需要jsoup;只是indexOf字符串检查]
我建议您考虑使用HTTP客户端处理登录。它为您提供了灵活性,似乎是更合适的方式。我一直在使用loopj库来获取和发布请求。它允许更简单的代码。对我来说,无论如何,相对Android新手。这是我项目中的一些代码,可以帮助您思考。我遗漏了进度条和Cookie管理等内容。
private void loginFool() {
String urlString = "http://www.example.com/login/";
// username & password
RequestParams params = new RequestParams();
params.put("username", username.getText().toString());
params.put("password", password.getText().toString());
// send the request
loopjClient.post(urlString, params, new TextHttpResponseHandler() {
@Override
public void onStart() {
// called before request is started
//System.err.println("Starting...");
}
@Override
public void onSuccess(int statusCode, Header[] headers, String responseString) {
// called when response HTTP status is "200 OK"
// see if 'success' was a failed login...
int idx = responseString.indexOf("Please try again!");
if(idx > -1) {
makeMyToast("Sorry, login failed!");
}
// or actual success-ful login
else {
// manage cookies here
// put extractData in separate thread
final String responseStr = responseString;
new Thread(new Runnable() {
public void run(){
extractData(responseStr);
selectData(defaultPrefs.getInt("xyz_display_section", 0));
// start the next activity
Intent intent = new Intent(MainActivity.this, PageViewActivity.class);
startActivity(intent);
finish();
}
}).start();
}
}
@Override
public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) {
// called when response HTTP status is "4XX" (eg. 401, 403, 404)
makeMyToast("Whoops, network error!");
}
@Override
public void onFinish() {
// done
}
});
}
你可以看到,在响应处理程序的onSuccess回调中,我可以测试一个字符串,看看登录是否失败,并且在onFailure回调中,我给出了一个网络错误信息。
我没有足够的经验知道此类登录后登录的Web服务器百分比。
loopj客户端接收并管理cookie。如果您要通过webview访问网站的页面,则需要将loopj客户端的cookie复制到webview。我从一些在线帖子中拼凑了代码来做到这一点:
// get cookies from the generic http session, and copy them to the webview
CookieSyncManager.createInstance(getApplicationContext());
CookieManager.getInstance().removeAllCookie();
CookieManager cookieManager = CookieManager.getInstance();
List<Cookie> cookies = xyzCookieStore.getCookies();
for (Cookie eachCookie : cookies) {
String cookieString = eachCookie.getName() + "=" + eachCookie.getValue();
cookieManager.setCookie("http://www.example.com", cookieString);
//System.err.println(">>>>> " + "cookie: " + cookieString);
}
CookieSyncManager.getInstance().sync();
// holy crap, it worked; I am automatically logged in, in the webview
编辑:而且,我应该包括类变量定义和初始化:
private AsyncHttpClient loopjClient = new AsyncHttpClient();
private PersistentCookieStore xyzCookieStore;
xyzCookieStore = new PersistentCookieStore(this);
loopjClient.setCookieStore(Utility.xyzCookieStore);