Android WebView加载 不支持 ElementUi el-upload文件上传无法正常打开文件列表 解决方法

本文介绍了解决Android WebView中无法使用文件选择器的问题,通过重写WebChromeClient,实现了在不同Android版本中调用系统文件选择器的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近因为赶项目进度,因此将本来要用原生控件实现的界面,自己做了H5并嵌入webview中。发现点击H5中ElementUi el-upload 标签 不能打开android资源管理器。
通过网络搜索发现是因为 android webview 由于考虑安全原因屏蔽了 input type="file" 这个功能 。
经过不懈的努力,以及google 翻译的帮助 在 stackoverflow 中找到了解决的方法。
具体可以理解为 重写webview 的WebChromeClient :

重写webview 的WebChromeClient:

private ValueCallback<Uri> mUploadMessage;

public ValueCallback<Uri[]> uploadMessage;

public static final int REQUEST_SELECT_FILE = 100;

private final static int FILECHOOSER_RESULTCODE = 2;

 

webView.setWebChromeClient(new WebChromeClient(){


   // For 3.0+ Devices (Start)
   // onActivityResult attached before constructor
   protected void openFileChooser(ValueCallback uploadMsg, String acceptType)
   {
      mUploadMessage = uploadMsg;
      Intent i = new Intent(Intent.ACTION_GET_CONTENT);
      i.addCategory(Intent.CATEGORY_OPENABLE);
      i.setType("image/*");
      startActivityForResult(Intent.createChooser(i, "File Browser"), FILECHOOSER_RESULTCODE);
   }

   // For Lollipop 5.0+ Devices
   @TargetApi(Build.VERSION_CODES.LOLLIPOP)
   @Override
   public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
      if (uploadMessage != null) {
         uploadMessage.onReceiveValue(null);
         uploadMessage = null;
      }
      uploadMessage = filePathCallback;
      Intent intent = fileChooserParams.createIntent();
      try
      {
         startActivityForResult(intent, REQUEST_SELECT_FILE);
      } catch (ActivityNotFoundException e)
      {
         uploadMessage = null;
         Toast.makeText(getBaseContext(), "Cannot Open File Chooser", Toast.LENGTH_LONG).show();
         return false;
      }
      return true;
   }

   //For Android 4.1 only
   protected void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture)
   {
      mUploadMessage = uploadMsg;
      Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
      intent.addCategory(Intent.CATEGORY_OPENABLE);
      intent.setType("image/*");
      startActivityForResult(Intent.createChooser(intent, "File Browser"), FILECHOOSER_RESULTCODE);
   }

   protected void openFileChooser(ValueCallback<Uri> uploadMsg) {
      mUploadMessage = uploadMsg;
      Intent i = new Intent(Intent.ACTION_GET_CONTENT);
      i.addCategory(Intent.CATEGORY_OPENABLE);
      i.setType("image/*");
      startActivityForResult(Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE);
   }


});

 

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent)
{

   if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
   {
      if (requestCode == REQUEST_SELECT_FILE)
      {
         if (uploadMessage == null)
            return;
         uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent));
         uploadMessage = null;
      }
   }
   else if (requestCode == FILECHOOSER_RESULTCODE)
   {
      if (null == mUploadMessage)
         return;
      // Use MainActivity.RESULT_OK if you're implementing WebView inside Fragment
      // Use RESULT_OK only if you're implementing WebView inside an Activity
      Uri result = intent == null || resultCode != MainActivity.RESULT_OK ? null : intent.getData();
      mUploadMessage.onReceiveValue(result);
      mUploadMessage = null;
   }
   else
      Toast.makeText(getBaseContext(), "Failed to Upload Image", Toast.LENGTH_LONG).show();
}

 

 

 

 

 


 

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PrinciplesMan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值