WebView用到最多的就是loadurl,一句代碼皆大歡喜,但是沒辦法触菜,需求來了我們就得動(dòng)手解決逻澳。
1.web頁(yè)面是需要加密信息才能顯示,這時(shí)候需要我們帶參數(shù)過去驗(yàn)證
例如需要登錄信息才能瀏覽犬绒,2個(gè)方法
a.保證WebView頁(yè)面的session與登錄接口返回的session值一致
清除web瀏覽器中的session
CookieSyncManager.createInstance(getContext());
CookieSyncManager.getInstance().startSync();
CookieManager.getInstance().removeSessionCookie();
給http設(shè)置攔截器 可以捕獲request和response信息,從而我們可以獲得我們需要的session值
OkHttpClient.Builder clientBuilder =new OkHttpClient.Builder();
clientBuilder.addInterceptor(new HttpLoggingInterceptor());
重寫攔截器的Response? intercept(Chain chain)方法
Request request = chain.request();
Response response = chain.proceed(request);
response.header("Set-Cookie")即獲得 session值
設(shè)置session
try {
? ? CookieSyncManager.createInstance(context);
? ? CookieManager cookieManager = CookieManager.getInstance();
? ? cookieManager.setAcceptCookie(true);
? ? cookieManager.removeSessionCookie();// 移除
? ? cookieManager.removeAllCookie();
? ? String oldCookie = cookieManager.getCookie(url);
? ? URL aURL =new URL(url);
? ? StringBuilder sbCookie =new StringBuilder();
? ? sbCookie.append(PreferencesHelper.getData("COOKIE"));
? ? //webview在使用cookie前會(huì)前判斷保存cookie的domain和當(dāng)前要請(qǐng)求的domain是否相同兑凿,相同才會(huì) 發(fā)送cookie
? //注意凯力,是getHost()茵瘾,不是getAuthority(),
? ? sbCookie.append(String.format(";domain=%s", aURL.getHost()));
? ? String cookieValue = sbCookie.toString();
? ? cookieManager.setCookie(url, cookieValue);
? ? CookieSyncManager.getInstance().sync();
? ? String newCookie = cookieManager.getCookie(url);
? ? webView.loadUrl(url);
}catch (Exception e) {
}
b.使用Webview.postUrl();傳遞驗(yàn)證參數(shù)
SearchBodyBean bean =new SearchBodyBean();
bean.sid = PreferencesHelper.getData(Constan.SID);
bean.userName = PreferencesHelper.getData(Constan.ACOUNT);
?bean.token = AESUtil.shaEncrypt(bean.userName + bean.sid + Constan.AES_KEY);
?webView.postUrl(url, new Gson().toJson(bean).toString().getBytes());
這個(gè)方式比較簡(jiǎn)單,但是要注意出現(xiàn)特殊字符導(dǎo)致數(shù)據(jù)缺失的問題咐鹤,出現(xiàn)較多的有數(shù)據(jù)中存在“+”號(hào)拗秘,到后臺(tái)了,“+”號(hào)全部都不見了祈惶。
由于數(shù)據(jù)是加密過的BASE64雕旨,會(huì)不時(shí)出現(xiàn)一些符合,如
webview.postUrl("www.testurl.com","data=abcdefg");
加密過后變成了捧请。
webview.postUrl("www.testurl.com","data=dhfakjsdfhksdhf+dfasjkdhf+adsfkhasld");
傳到后臺(tái)解析:
key:data
value:dhfakjsdfhksdhf dfasjkdhf adsfkhasld
解決方案如下
try {
postData? = URLEncoder.encode(data.toString(),"utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
URLEncoder就對(duì)字符進(jìn)行了比較好的處理了凡涩。
最后。疹蛉。活箕。。
webView.postUrl(“www.testurl.com”,("data="+postData).getBytes());
2 WebView高度顯示不全或者無法滑出最底部
這個(gè)問題的根本原因是我們給出WebView控件的寬高和加載完頁(yè)面之后頁(yè)面實(shí)際的寬高有出入氧吐,這里讓我感覺webview這個(gè)控件有點(diǎn)缺陷讹蘑。沒關(guān)系我們還是有辦法解決。
還原場(chǎng)景的布局
這里的在點(diǎn)擊Webview內(nèi)部鏈接時(shí)會(huì)用JS調(diào)用頁(yè)面隱藏顯示頭布局和底部布局筑舅,設(shè)置weight希望webview自己控制高度.但是實(shí)際上會(huì)出現(xiàn)隱藏頭尾的時(shí)候頁(yè)面顯示不全座慰,或者回退顯示頭尾時(shí),頁(yè)面在最下面無法滑動(dòng)出來(發(fā)現(xiàn)實(shí)際上webview的高度還是全屏翠拣,被底布局遮擋)版仔,馬丹,這個(gè)問題困擾了我一天误墓,實(shí)際解決卻很簡(jiǎn)單蛮粮,不多廢話,說方案谜慌。
在頁(yè)面加載完成之后重新按當(dāng)前需求設(shè)置webview的高度然想。是不是很簡(jiǎn)單!其實(shí)只是我們不知道哪里出了問題而已欣范。