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

本文主要是介绍Android WebView加载 不支持 ElementUi el-upload文件上传无法正常打开文件列表 解决方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近因为赶项目进度,因此将本来要用原生控件实现的界面,自己做了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 constructorprotected 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)@Overridepublic 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 onlyprotected 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 ActivityUri result = intent == null || resultCode != MainActivity.RESULT_OK ? null : intent.getData();mUploadMessage.onReceiveValue(result);mUploadMessage = null;}elseToast.makeText(getBaseContext(), "Failed to Upload Image", Toast.LENGTH_LONG).show();
}

 

 

 

 

 


 

 

这篇关于Android WebView加载 不支持 ElementUi el-upload文件上传无法正常打开文件列表 解决方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/973315

相关文章

打开VMware WorkStation没反应的解决办法

今天在打开虚拟机的时候,遇到过一个故障:就是用虚拟机打开Ubuntu系统半天没反应,刚开始以为是电脑反应太慢了,之后,在关闭虚拟机,重新打开,等上半天还是没反应。 之后在网上查找了一下,听说是 VMware tools的原因。VMware tools有個功能,就是從縮主機複製文件到虛擬系統,或者從虛擬系統複製文件到縮主系統。很方便,但有時會出現故障。我只能说可能是这个原因!因为之前重新安

Android_04_网络图片查看器

1>不带缓存的图片查看器 MainActivity.java package com.ithiema.imageviewer;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import jav

Android_03_数据库的使用总结

前言: 1>区分SQL和SQLite SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。 SQL 可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。 不幸地是,存在着很多不同版本的 SQL 语言,但是为了与 ANSI 标准相

Android_03_单元测试框架

测试类(用于单元测试之用) package com.itheima.junit.test;import com.itheima.junit.utils.Utils;import android.test.AndroidTestCase;public class TestCase extends AndroidTestCase {public void test(){int result =

Android_02_关于SharePreferences的使用

前言: 我们使用SharePreferences的主要目的是针对一些简单的数据进行存取,其是通过键值对来存取的, 其实质是通过xml文件进行保存的;对于一些简单数据的存取,我们可以用SharePreferences,替代 其他几种复杂的数据存取的方式,比如文件的读写或者数据库的操作; 本示例演示的内容是:通过SharedPreferences来实现记住密码的功能,无需第二次再输入密码

Android_02_文件访问权限(待更新)

前言: 打开 File Explorer可以看到: 10个字母表示的意义: drwxrwxrwx 第一个字母:     * d:表示文件夹     * -:表示文件  第一组rwx:表示的是文件拥有者(owner)对文件的权限     * r:read,读     * w:write     * x:execute  第二组rwx:表示的是跟

Android_02_获取SD卡的可用容量

代码示例如下: package com.itheima.getsdavail;import java.io.File;import android.os.Build;import android.os.Bundle;import android.os.Environment;import android.os.StatFs;import android.app.Activity;i

Android_02_在内部或外部存储中读写文件的操作

前言:  Ram内存:运行内存,相当于电脑的内存  Rom内存:内部存储空间,相当于电脑的硬盘 sd卡:外部存储空间,相当于电脑的移动硬盘 1>在内部存储中读写文件 代码示例如下: package com.itheima.rwinrom;import java.io.BufferedReader;import java.io.File;import java.io.File

Android_02_帧布局

代码示例如下: <?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><!-- 帧布

Android_02_相对布局

代码如下: <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><!--