关键代码如下:
private ValueCallback<Uri> mUploadMessage;
private ValueCallback<Uri[]> mUploadCallbackAboveL;
privatefinalstaticintFILECHOOSER_RESULTCODE = 1;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == FILECHOOSER_RESULTCODE) {
if (null == mUploadMessage && null == mUploadCallbackAboveL)
return;
Uri result = data == null || resultCode != RESULT_OK ? null : data.getData();
if (mUploadCallbackAboveL != null) {
onActivityResultAboveL(requestCode, resultCode, data);
} else if (mUploadMessage != null) {
mUploadMessage.onReceiveValue(result);
mUploadMessage.onReceiveValue(result);
mUploadMessage = null;
}
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) {
if (requestCode != FILECHOOSER_RESULTCODE || mUploadCallbackAboveL == null) {
return;
}
Uri[] results = null;
if (resultCode == Activity.RESULT_OK) {
if (data == null) {
} else {
String dataString = data.getDataString();
ClipData clipData = data.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)};
}
}
mUploadCallbackAboveL.onReceiveValue(results);
mUploadCallbackAboveL = null;
return;
}
为webview 设置WebChromeClient
mWebView.setWebChromeClient(new WebChromeClient() {
// For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
AdWebActivity.this.startActivityForResult(Intent.createChooser(i, "File Chooser"),
FILECHOOSER_RESULTCODE);
}
// For Android 3.0+
public void openFileChooser(ValueCallback uploadMsg, String acceptType) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
AdWebActivity.this.startActivityForResult(Intent.createChooser(i, "File Browser"),
FILECHOOSER_RESULTCODE);
}
// For Android 4.1
public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
AdWebActivity.this.startActivityForResult(Intent.createChooser(i, "File Browser"),
AdWebActivity.FILECHOOSER_RESULTCODE);
}
// For Android 5.0+
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback,
WebChromeClient.FileChooserParams fileChooserParams) {
mUploadCallbackAboveL = filePathCallback;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
AdWebActivity.this.startActivityForResult(Intent.createChooser(i, "File Browser"),
FILECHOOSER_RESULTCODE);
return true;
}
});
相关推荐
然而,在实际使用中,我们可能会遇到一些问题,比如在WebView中使用`<input type="file">`标签时,用户无法选择本地文件。这个现象主要是由于Android的安全机制和权限控制导致的。本文将详细讲解如何解决这个问题。 ...
然而,在使用Webview时,有时会遇到一个问题:当HTML页面中包含`<input type="file">`用于上传文件的表单元素时,这个功能在Webview中可能无法正常工作。这通常是因为Android的安全策略限制了Webview对本地文件系统...
React Native的`<WebView>`组件在Android上默认并不支持文件选择器,因此,当HTML中的表单尝试通过`<input type="file">`标签选择本地图片时,用户可能无法看到文件选择对话框或者无法正常上传。 要解决这个问题,...
注意:input[type=file] 标签中的属性accept=application/msword,application/pdf 在pc上正常,但是在手机ios和android上这个文件格式限制会被忽略,所以需要在js中增加格式的判断,以及对应显示样式的设置.(我也是刚...
发现点击H5中 input type=”file” 标签 不能打开android资源管理器。 通过网络搜索发现是因为 android webview 由于考虑安全原因屏蔽了 input type=”file” 这个功能 。 经过不懈的努力,以及google 翻译的帮助 在...
本篇文章将深入探讨如何在Android客户端中利用WebView实现文件上传功能,特别是针对H5页面的文件选择和上传。 首先,我们需要理解WebView的工作原理。WebView是Android系统提供的一个内置组件,它可以解析并渲染...
但是,当我们在 WebView 中使用 H5 的 input 标签时,发现点击 input type="file" 标签不能打开 Android 资源管理器。这是因为 Android WebView 由于考虑安全原因屏蔽了 input type="file" 这个功能。 解决方法是...
首先,我们需要了解在Android 5.0之前,文件上传通常是通过`<input type="file">`标签实现的。但是,从Android 5.0开始,系统引入了更严格的权限管理,即运行时权限,这对Webview的文件选择器产生了影响。默认情况下...
HTML5引入了`<input type="file">`标签,它允许用户选择本地文件进行上传。当用户点击这个输入框,系统会弹出一个文件选择对话框,用户可以选择一个或多个文件。选定文件后,这些文件的信息(如文件名、大小等)可以...
通过以上步骤,你就可以实现在React-Native的Webview组件中支持Android客户端上传图片文件。这种方法的优点在于它可以保持良好的用户体验,同时避免了权限问题和安全风险。请注意,对于iOS平台,由于其系统限制,...
这主要是因为Android的各个版本中,WebView的实现有所不同,尤其是在涉及到文件系统交互时,没有统一的标准。因此,我们需要自定义一个WebChromeClient来处理文件选择和上传的过程。 WebChromeClient是WebView的一...
在默认情况下,这个标签会在Android和iOS的WebView中触发系统的文件选择器,让用户选择存储在设备上的文件。 ### 支持相机和相册 为了让用户不仅可以选择相册中的图片,还能直接使用相机拍照,我们需要对WebView...
在处理用户交互时,尤其是涉及到文件操作时,如拍照和图片上传,开发者需要对WebView有深入的理解。本篇文章将详细探讨如何在Android的WebView中实现File标签的拍照和图片上传功能。 首先,我们要明白WebView并不...
- 首先,我们需要在XML布局文件中添加WebView组件,通过`<WebView>`标签来定义。 - 在Activity或Fragment中,通过`findViewById()`获取WebView实例,然后调用`loadUrl()`方法加载网页内容。 - 设置WebView的属性...
在Android应用开发中,图片和文件的上传是常见的功能需求,尤其在社交、电商或文件管理类应用中不可或缺。这份"Android应用源码之安卓图片上传和文件上传带jsp服务端源码.zip"包含了实现这一功能的完整示例,旨在...
在WebView中,可以通过监听`shouldOverrideUrlLoading()`方法,拦截`<input type="file">`标签的点击事件,然后弹出自定义的文件选择器,选择图片后,通过JavaScript接口将图片数据传递回Java层,再进行上传操作。...
在Servlet容器(如Tomcat)中,我们需要在web.xml配置文件中启用这个解析器,或者在Servlet 3.0以上的环境中,通过注解@MultipartConfig来配置。 文件上传的安全性和性能也是需要考虑的重要因素。为防止恶意文件...
支持input标签文件上传 支持Js通信文件上传 简化回退及返回键的处理 简化url加载 webview 安全漏洞的问题修复,更加安全 支持权限管理,常用的定位、相册的权限 支持电话、短信、邮件的跳转 支持自定义进度条指示器 ...