Android webview调用本地文件选择失败解决
在被调用的网页中,也许会用到本地相册选取的功能,但我们会发现这并不是一个可以直接使用的功能,需要我们添加一些方法。
不多说直接上代码:
在webview中,我们需要自定义一个ArcWebChromeClient继承WebChromeClient,并添加相应方法,然后在webview所在的activity中进行onActivityResult方法的重写。
private class ArcWebChromeClient extends WebChromeClient{
public void openFileChooser(ValueCallbackuploadMsg) {
((WebActivity) mContext).openFileChooserImpl(uploadMsg);
}
public void openFileChooser(ValueCallback uploadMsg, String acceptType ) {
((WebActivity) mContext).openFileChooserImpl(uploadMsg);
}
public void openFileChooser(ValueCallbackuploadMsg, String acceptType, String capture){
((WebActivity) mContext).openFileChooserImpl(uploadMsg);
}
// For Android 5.0+
public boolean onShowFileChooser (WebView webView, ValueCallbackuploadMsg, WebChromeClient.FileChooserParams fileChooserParams) {
// mUploadCallbackAboveL = uploadMsg;
// Intent i = newframe Intent(Intent.ACTION_GET_CONTENT);
// i.addCategory(Intent.CATEGORY_OPENABLE);
// i.setType("image/*");
// startActivityForResult(
// Intent.createChooser(i, "File Browser"), 0);
// return true;
// mUploadCallbackAboveL = uploadMsg;
((WebActivity) mContext).setUploadMsg(uploadMsg);
Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
contentSelectionIntent.setType("image/*");
Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
chooserIntent.putExtra(Intent.EXTRA_TITLE, "Image Chooser");
((WebActivity) mContext).startActivityForResult(chooserIntent, 1);
return true;
}
}/**-------------------------------处理webview调用本地文件浏览-------------------------------------*/
private ValueCallbackmUploadMessage;
public void openFileChooserImpl(ValueCallbackuploadMsg) { mUploadMessage = uploadMsg; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("image/*"); startActivityForResult(Intent.createChooser(i, "File Chooser"), 0); } //onActivityResult回调 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == 0) { if (null == mUploadMessage) return; Uri result = data == null || resultCode != RESULT_OK ? null : data.getData(); if (mUploadMessage != null) { mUploadMessage.onReceiveValue(result); mUploadMessage = null; } } if (requestCode == 1) { if (mUploadCallbackAboveL == null) { return; } Uri result = (data == null || resultCode != RESULT_OK) ? null: data.getData(); if (result != null) { mUploadCallbackAboveL.onReceiveValue(new Uri[]{result}); } else { mUploadCallbackAboveL.onReceiveValue(new Uri[]{}); } mUploadCallbackAboveL = null; } } private ValueCallbackmUploadCallbackAboveL; public void setUploadMsg(ValueCallbackuploadMsg){ mUploadCallbackAboveL = uploadMsg; } @SuppressLint("NewApi") private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) { if (requestCode != 0 || 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调用本地文件浏览-------------------------------------*/
Android webview调用本地文件选择失败解决相关推荐
- android webview打开相册,Android WebView调用本地相册的方法
本文实例为大家分享了Android WebView调用本地相册的具体实现方法,供大家参考,具体内容如下 首先要知道android本身的WebView是并不支持调用手机文件并上传的,其次WebView的 ...
- android webview访问本地文件
直接访问file:///是不可以的,webview会因为安全问题拦截掉,官方推荐WebViewAssetLoader import android.webkit.MimeTypeMap; import ...
- 解决百度网盘下载时提示本地文件写入失败的问题
今天开通了百度会员,打算download点文件,一直提示本地文件写入失败 解决办法: 在百度网盘上使用右键超级管理会员权限打开,完美解决.
- android调用chrome,android webview调用使用chrome浏览器
我已经做了一个web应用程序,它在移动Chrome中工作正常,但在铬中我看到一些问题,所以可以从应用程序中调用android chrome而不是webview.android webview调用使用c ...
- hive导出数据到本地文件报错解决方法
hive导出数据到本地文件报错解决方法 参考文章: (1)hive导出数据到本地文件报错解决方法 (2)https://www.cnblogs.com/yaopeiyun/p/12232251.htm ...
- Android WebView注入js文件,判断当前HTML有没有某个js然后再注入
Android WebView注入js文件,判断当前HTML有没有某个js然后再注入 1.注入js代码 判断当前有没有jQuery文件引入,然后再进行注入. 判断依据其实很简单,获取script 的d ...
- Vivado生成bit文件布局失败解决
1.1 Vivado生成bit文件布局失败解决 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Vivado生成bit文件布局失败解决: 5)结束语. 1.1.2 本节引 ...
- MySQL导入SQL文件执行失败解决办法
MySQL导入SQL文件执行失败解决办法 导入SQL失败,大多数原有是MySQL开启了严格模式,关闭掉严格模式就可以了,执行如下SQL后再导入: SET sql_mode = ''; SET GLOB ...
- android调用文件管理器回调,Android中调用系统管理器选择文件并返回绝对路径
选择文件的时候,如果使用的是第三方软件,一般是直接返回绝对路径的Uri,如果是系统的,则会返回媒体库的xxxx,所以单纯一种方式选择文件,很可能拿到的绝对路径是错的或者是空的,所以需要做几种处理,这里 ...
- android自定义文件选择,关于安卓自定义本地文件选择库的实现
最近想重温一下旧知识,所以写了这一个库. androidx+kotlin 功能有:(1)多线程本地文件扫描 (2)ContentProvider扫描 注意:若使用本地扫描时,出现错误,请看文章:htt ...
最新文章
- 2000亿次开放学习后,DeepMind的智能体成精了
- 拖链电缆 机器人电缆_选购电缆拖链需要注意哪些要点
- 神策数据汽车行业解决方案重磅上线,全面赋能车企数字化转型
- cmd10与16进制的相互转换
- PHP 运动会,运动会成绩管理系统
- Spring 2.X 中AOP的简明教程
- 聊聊Code Review
- java 且_JAVA中逻辑运算符“|”和“”与“||”和“”的用法
- C++工作笔记-map有自动排序的功能
- WebStorm 格式化代码 - 快捷键
- html字段值换行代码怎么写,HTML段落,换行,字符实体
- Bootstraptable源码
- windows安装vnm
- Linux配置Java环境变量 详解
- vmrc必须从URL启动该应用程序
- 为什么php在网页中不显示,为什么网页显示不出php代码_后端开发
- 如何使用proteus仿真
- Mtlab 二次规划及其例子
- 非越狱逆向开发总结文档(含iOS Extension)
- 概率统计笔记:二维随机变量及其联合概率分布