現(xiàn)在有一些App應(yīng)用采用android自帶的WebView控件,加載Html5實現(xiàn)混合開發(fā)。大家在開發(fā)中肯定遇到過很多坑,打算把一些問題進(jìn)行一下總結(jié),如下:
- 怎么實現(xiàn)java調(diào)用js?
- Android4.2下 WebView的addJavascriptInterface漏洞解決方案?
- Android4.4 支持文件上傳?
- WebView怎么實現(xiàn)下拉回彈效果?
- WebView怎么實現(xiàn)cookie管理?
所有的解決方法源碼WebViewH5Mutual
第一個問題
對于Android調(diào)用JS代碼的方法有2種:
???(1)通過WebView的loadUrl()
???(2)通過WebView的evaluateJavascript()
????evaluateJavascript方法是在android 4.4后才提供的方法,效率更高。執(zhí)行過程不會使頁面刷新,而loadUrl會刷新界面。
解決方法
????兩種方法混合使用,即Android 4.4以下使用loadUrl方法,Android 4.4以上使用evaluateJavascript方法。
public void callJs(String js, final ValueCallback<String> callback) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
mWebView.evaluateJavascript(js, new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
if (callback != null)
callback.onReceiveValue(value);
}
});
} else {
mWebView.loadUrl(js);
}
}
第二個問題
第三個問題
通過重寫WebChromeClient中的openFileChooser()方法。
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
LogUtils.i(TAG, "openFileChooser>=5.0");
if (AgentWebUtils.isOverriedMethod(mWebChromeClient, "onShowFileChooser", ChromePath + ".onShowFileChooser", WebView.class, ValueCallback.class, FileChooserParams.class)) {
return super.onShowFileChooser(webView, filePathCallback, fileChooserParams);
}
webview.setWebChromeClient(new WebChromeClient() {
// For Android < 3.0
public void openFileChooser(ValueCallback<Uri> valueCallback) {
***
}
// For Android >= 3.0
public void openFileChooser(ValueCallback valueCallback, String acceptType) {
***
}
//For Android >= 4.1
public void openFileChooser(ValueCallback<Uri> valueCallback,
String acceptType, String capture) {
***
}
// For Android >= 5.0
@Override
public boolean onShowFileChooser(WebView webView,
ValueCallback<Uri[]> filePathCallback,
WebChromeClient.FileChooserParams fileChooserParams) {
***
return true;
}
});
第四個問題
第五個問題
????通過CookieManager將cookie同步到WebView中。如果API是21以下的話,需要在CookieManager前調(diào)用CookieSyncManager.createInstance(context)方法。
public static boolean syncCookie(Context context, String url, String cookie) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
CookieSyncManager.createInstance(context);
}
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setCookie(url, cookie);//如果沒有特殊需求,這里只需要將session id以"key=value"形式作為cookie即可
String newCookie = cookieManager.getCookie(url);
return TextUtils.isEmpty(newCookie)?false:true;
}