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;
         }
     }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章