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;
         }
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值