首页 > 系统 > Android > 正文

Android 解决WebView无法上传文件的问题

2019-12-12 02:32:47
字体:
来源:转载
供稿:网友

Android 解决WebView无法上传文件的问题

Android原生的WebView并不支持上传文件,需要我们自己实现相应的方法。于是我把工作中的相关代码记录下来。下次直接拿来用就行了。一点一滴都是经验。

1。需要定义三个变量

 private ValueCallback<Uri[]> uploadMessageAboveL;  private final static int FILE_CHOOSER_RESULT_CODE = 10000;  private ValueCallback<Uri> uploadMessage;

2.重写Activity相关方法

  private void openImageChooserActivity() {    Intent i = new Intent(Intent.ACTION_GET_CONTENT);    i.addCategory(Intent.CATEGORY_OPENABLE);    i.setType("image/*");    startActivityForResult(Intent.createChooser(i, "Image Chooser"), FILE_CHOOSER_RESULT_CODE);  }  @Override  protected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);    if (requestCode == FILE_CHOOSER_RESULT_CODE) {      if (null == uploadMessage && null == uploadMessageAboveL) return;      Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();      if (uploadMessageAboveL != null) {        onActivityResultAboveL(requestCode, resultCode, data);      } else if (uploadMessage != null) {        uploadMessage.onReceiveValue(result);        uploadMessage = null;      }    }  }  @TargetApi(Build.VERSION_CODES.LOLLIPOP)  private void onActivityResultAboveL(int requestCode, int resultCode, Intent intent) {    if (requestCode != FILE_CHOOSER_RESULT_CODE || uploadMessageAboveL == null)      return;    Uri[] results = null;    if (resultCode == Activity.RESULT_OK) {      if (intent != null) {        String dataString = intent.getDataString();        ClipData clipData = intent.getClipData();        if (clipData != null) {          results = new Uri[clipData.getItemCount()];          for (int i = 0; i < clipData.getItemCount(); i++) {            ClipData.Item item = clipData.getItemAt(i);            results[i] = item.getUri();          }        }        if (dataString != null)          results = new Uri[]{Uri.parse(dataString)};      }    }    uploadMessageAboveL.onReceiveValue(results);    uploadMessageAboveL = null;  }

3.重写WebChromeClient中的相关方法

 // For Android < 3.0    public void openFileChooser(ValueCallback<Uri> valueCallback) {      uploadMessage = valueCallback;      openImageChooserActivity();    }    // For Android >= 3.0    public void openFileChooser(ValueCallback valueCallback, String acceptType) {      uploadMessage = valueCallback;      openImageChooserActivity();    }    //For Android >= 4.1    public void openFileChooser(ValueCallback<Uri> valueCallback, String acceptType, String capture) {      uploadMessage = valueCallback;      openImageChooserActivity();    }    // For Android >= 5.0    @Override    public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {      uploadMessageAboveL = filePathCallback;      openImageChooserActivity();      return true;    }

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表