这两天负责修改了几个关于在webview中打开公司移动站的bug。本身不是很难解,网上查查都有,但是也有必要记录下来作为备忘。
Webview中上传文件
这里的效果类似在pc端上传文件效果,点击打开一个文件选择器,上传文件图片之类的。
openFileChooser()
方法的重载是因为在不同系统中调用的方法参数不一样,具体看注释。
ValueCallback mUploadMessage
作为成员变量的目的是我们要在打开的系统文件选择器finish()
后在onActivityResult()
时调用。
具体实现代码如下:
private void initWebView(){
webView.setWebChromeClient(new MyWebChromeClient());
}
private ValueCallback mUploadMessage;
private class MyWebChromeClient extends WebChromeClient {
public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) {
mUploadMessage = uploadMsg;
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setType(TextUtils.isEmpty(acceptType) ? "image/*" : acceptType);
MobileSiteActivity.this.startActivityForResult(
Intent.createChooser(intent, ToolBox.getString(R.string.web_activity_please_chooser)),
MobileSiteActivity.FILECHOOSER_RESULTCODE);
}
public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
openFileChooser(uploadMsg, acceptType, null);
}
public void openFileChooser(ValueCallback uploadMsg) {
openFileChooser(uploadMsg, null);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (FILECHOOSER_RESULTCODE == requestCode) {
if (null == mUploadMessage) return;
Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
return;
}
}
WebView当中网页中的地图为白色,不显示地图
这个问题其实就是你没有打开Javascript支持。打开就好啦~
webView.setJavascriptEnabled(true);
WebView中跳转系统拨号键盘
举一反三,既然要打开系统拨号键盘,那邮箱,地图也可以支持。
webView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (url.startsWith("mailto:") || url.startsWith("geo:") || url.startsWith("tel:")) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
view.loadUrl(url);
return true;
}
});
WebView中支持下载
这里要给WebView设置一个下载监听,监听会回调给你下载地址,这里可以打开系统浏览器去激活下载,用DownloadManger直接去下载也可以,我选择的是第一种方式,这种方式我认为比较符合用户习惯哈。
webView.setDownloadListener(new MyWebViewDownLoadListener());
private class MyWebViewDownLoadListener implements DownloadListener {
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition,
String mimetype, long contentLength) {
if (null != url) {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
}
}