2019独角兽企业重金招聘Python工程师标准>>>
最近项目中需要用到webview来加载一个抽奖页面,抽奖页面访问需要带上cookie,并且在该抽奖页面点击分享会调用java里分享的方法,弹出一个popwindow分享界面,现在把这里面遇到的问题以及需要注意的问题共享一下,希望对遇到有同样问题的兄弟有所帮助。
首先说的是使用webview加载网页需要携带cookie的问题,直接上代码:
这是在请求登录成功后获取到所有的cookies,然后遍历cookies,将每个条目存储到自己application的strUserSession这个数组中。
Map<String, List<String>> mData = conn.getHeaderFields();
List<String> lCookies = mData.get("Set-Cookie");
if (lCookies != null && lCookies.size() > 0) {
if (MyApplication.strUserSession == null) {
MyApplication.strUserSession = new String[lCookies.size()];
for (int i = 0; i < lCookies.size(); i++) {
String[] sessionId = lCookies.get(i).split(";");
MyApplication.strUserSession[i] = sessionId[0];
}
}
接下来是webview加载网页时候携带cookie的方法:
public void synCookies(Context context) {
String strSessionData = "";
if (MyApplication.strUserSession != null
&& MyApplication.strUserSession.length > 0) {
if (MyApplication.strUserSession != null) {
for (int i = 0; i < MyApplication.strUserSession.length; i++) {
strSessionData = MyApplication.strUserSession[i];
}
}
}
CookieSyncManager.createInstance(context);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieManager.removeSessionCookie();// 移除
cookieManager.removeAllCookie();
cookieManager.setCookie(strUrl, strSessionData);// cookies是在HttpClient中获得的cookie
CookieSyncManager.getInstance().sync();
}
这里需要注意的是 cookieManager.setCookie(strUrl, strSessionData)这里设置的cookie不是获取所有的cookies集合,而是遍历后的单个cookie条目,还有 cookieManager.removeAllCookie()这个方法一定要有,这个解决了有的会出现第一次加载需要携带cookie的网页的时候会失败,第二次又正常的问题。这个方法的调用:
webview.getSettings().setJavaScriptEnabled(true);
synCookies(getApplicationContext());
webview.loadUrl(strUrl);
接下来就要说的是在webview所加载的网页中点击某个按钮,调用android里的代码问题,我们的需求是点击页面上的分享按钮,会调用android里的分享的方法,具体做法如下,在调用loadUrl之前调用这句,这句就将js与java关联起来了:
webview.addJavascriptInterface(this, "showShare");
然后这就是android里调用分享的方法,这里需要注意的是如果该方法里有耗时操作必须放在子线程,不然会阻塞程序崩溃:
public void showShareDialog() {
mHandler.post(new Runnable() {
@Override
public void run() {
showShare();
setShareContent();
}
});
}
最后只需要在js代码里加上这一句就可以调用android里的方法了:
window.showShare.showShareDialog();