Webview上传文件

来源:互联网 发布:淘宝好看的鞋子店铺 编辑:程序博客网 时间:2024/06/05 18:00

  • 情景
  • 实现
      • 重写WebChromeClient 方法
      • 处理选择返回值
      • Webview上传文件没有反应

情景

需要在Webview中打开系统文件选择目录。即网页元素为: < input tyoe=”file” />,点击按钮应该打开系统的文件选择。

实现

1.重写WebChromeClient 方法

在 Webview.setWebChromeClient() 方法传入的参数 WebChromeClient 重写 openFileChooser() 或者 onShowFileChooser() …,返回true,处理情景中的点击事件,可以是打开系统文件、打开相机,比如下面的例子。

注意:这里的重写方法具体参照不同的SDK版本,下例只是适配了API 16+ 、API 21+,低版本应该现在也很少了。

    /**       * 提供接口HTML调用系统相册 API 16+       *       * @author fengzhen       * @version v1, 2017/4/5 18:10       */      public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {          asw_file_message = uploadMsg;          Intent chooserIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);          startActivityForResult(chooserIntent, asw_file_req);      }      /**       * 提供接口HTML调用系统相册 API 21+       *       * @author fengzhen       * @version v1, 2017/4/5 18:10       */      public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {          asw_file_path = filePathCallback;          // 直接调用系统相册          Intent chooserIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);          startActivityForResult(chooserIntent, asw_file_req);          return true;      }  });

2.处理选择返回值

在onActivityResult()方法中处理返回值。

  @Override  protected void onActivityResult(int requestCode, int resultCode, Intent data) {      super.onActivityResult(requestCode, resultCode, data);      if (resultCode != Activity.RESULT_OK) return;      switch (requestCode) {          case asw_file_req:           // 结果处理              break;      }  }

3.Webview上传文件没有反应

单纯像上面那样处理,如果用户在文件选择按下返回键,会出现不能够再次进入文件选择的问题,需要在onActivityResult()添加如下代码:

    /**      * 文件选择界面取消选择图片,解决返回之后不能选择图片的问题      */     if (requestCode == asw_file_req && resultCode == RESULT_CANCELED) {         if (asw_file_path != null) {             asw_file_path.onReceiveValue(null);             asw_file_path = null;         }         if (asw_file_message != null) {             asw_file_message.onReceiveValue(null);             asw_file_message = null;         }     }
原创粉丝点击