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

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

1。需要定义三个变量

 private ValueCallback uploadMessageAboveL;  private final static int FILE_CHOOSER_RESULT_CODE = 10000;  private ValueCallback 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 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 valueCallback, String acceptType, String capture) {      uploadMessage = valueCallback;      openImageChooserActivity();    }    // For Android >= 5.0    @Override    public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {      uploadMessageAboveL = filePathCallback;      openImageChooserActivity();      return true;    }

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

更多相关文章

  1. android 读取资源字符串的 方法
  2. android onTouchEvent和setOnTouchListener中onTouch的区别
  3. android 被强制横屏,Activity重启问题解决方案
  4. Android(安卓)AIDL 实例
  5. android TraceView (图形化性能测试工具)使用入门笔记
  6. Android使用webview让服务器上的js调用java代码的方法
  7. Win7 64位 Android(安卓)SDK下载和更新失败的解决方法
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. JSON就是这么简单
  2. JVM系列(7)内存溢出问题(工作中常用、面试
  3. koa中间件与async
  4. nginx HTTPS反向代理
  5. HTTP常见面试题
  6. XML+JSON面试题都在这里
  7. 财务自由之路
  8. 打包压缩加密备份_bash笔记6
  9. AJAX常见面试题
  10. 【不用框架】文件上传和下载