首页  »   Web前端

WebView填坑——小效能篇

网友分享于:2015-04-24  浏览:0次
WebView填坑——小功能篇

这两天负责修改了几个关于在webview中打开公司移动站的bug。本身不是很难解,网上查查都有,但是也有必要记录下来作为备忘。

Webview中上传文件

这里的效果类似在pc端上传文件效果,点击打开一个文件选择器,上传文件图片之类的。
openFileChooser()方法的重载是因为在不同系统中调用的方法参数不一样,具体看注释。
ValueCallback<Uri> mUploadMessage作为成员变量的目的是我们要在打开的系统文件选择器finish()后在onActivityResult()时调用。
具体实现代码如下:


private void initWebView(){
    webView.setWebChromeClient(new MyWebChromeClient());
}

 private ValueCallback<Uri> mUploadMessage;
private class MyWebChromeClient extends WebChromeClient {

    // js上传文件的<input type="file" />事件捕获
    // Android > 4.1.1 调用这个方法
    public void openFileChooser(ValueCallback<Uri> 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);

    }

    // 3.0 + 调用这个方法
    public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) {
      openFileChooser(uploadMsg, acceptType, null);
    }

    // Android < 3.0 调用这个方法
    public void openFileChooser(ValueCallback<Uri> 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);// 设置支持javascript脚本

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);
      }
    }

  }

相关解决方案

最新解决方案