android开发新手我正在尝试应用此处描述的网络身份验证方法:https ://sites.google.com/site/oauthgoog/oauth-practices/mobile-apps-for-complex-login-systems/samplecode
以下是结果代码:
public class LoginActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_PROGRESS);
WebView webview = new WebView(this);
webview.getSettings().setJavaScriptEnabled(true);
webview.setWebChromeClient(new WebChromeClient() {
// Show loading progress in activity's title bar.
@Override
public void onProgressChanged(WebView view, int progress) {
setProgress(progress * 100);
}
});
webview.setWebViewClient(new WebViewClient() {
// When start to load page, show url in activity's title bar
@Override
public void onPageStarted(WebView view, String url,
Bitmap favicon) {
setTitle(url);
}
@Override
public void onPageFinished(WebView view, String url) {
CookieSyncManager.getInstance().sync();
// Get the cookie from cookie jar.
String cookie = CookieManager.getInstance().getCookie(url);
if (cookie == null) {
return;
}
// Cookie is a string like NAME=VALUE [; NAME=VALUE]
String[] pairs = cookie.split(";");
for (int i = 0; i < pairs.length; ++i) {
String[] parts = pairs[i].split("=", 2);
// If token is found, return it to the calling activity.
parts[0] = parts[0].trim();
if (parts.length == 2 && parts[0].equalsIgnoreCase("MY_PRIVATE_TOKEN")) {
Intent result = new Intent();
result.putExtra("token", parts[1]);
setResult(RESULT_OK, result);
finish();
}
}
}
});
String queryStringAndroidId = "?aid="+Secure.getString(this.getContentResolver(),Secure.ANDROID_ID);
setContentView(webview);
String urlToLoginPage =getString(R.string.web_login_page).concat(queryStringAndroidId);
webview.loadUrl(urlToLoginPage);
}
}
我的问题是onPageFinished方法。当 webview 第一次显示时,这个方法被调用,这是我没想到的。如果身份验证 cookie 已经存在,则活动将立即关闭。据我了解,这个方法应该只在 web 视图中显示另一个页面时才被调用(除了我调用的第一个页面),我错了吗?有人可以阐明这种行为吗?多谢。
顺便说一句,我看到了这个解决方案:onPageFinished 在渲染网页时没有正确触发,但我不喜欢这样的复飞。我相当理解为什么该方法会在我不期望的情况下触发。谢谢。