在Android移动应用中,我们不止会使用本地原生的界面显示,嵌套网页显示也是一个基本需求。

在被调用的网页中,也许会用到本地相册选取的功能,但我们会发现这并不是一个可以直接使用的功能,需要我们添加一些方法。

不多说直接上代码:

在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调用本地文件选择失败解决相关推荐

  1. android webview打开相册,Android WebView调用本地相册的方法

    本文实例为大家分享了Android WebView调用本地相册的具体实现方法,供大家参考,具体内容如下 首先要知道android本身的WebView是并不支持调用手机文件并上传的,其次WebView的 ...

  2. android webview访问本地文件

    直接访问file:///是不可以的,webview会因为安全问题拦截掉,官方推荐WebViewAssetLoader import android.webkit.MimeTypeMap; import ...

  3. 解决百度网盘下载时提示本地文件写入失败的问题

    今天开通了百度会员,打算download点文件,一直提示本地文件写入失败 解决办法: 在百度网盘上使用右键超级管理会员权限打开,完美解决.

  4. android调用chrome,android webview调用使用chrome浏览器

    我已经做了一个web应用程序,它在移动Chrome中工作正常,但在铬中我看到一些问题,所以可以从应用程序中调用android chrome而不是webview.android webview调用使用c ...

  5. hive导出数据到本地文件报错解决方法

    hive导出数据到本地文件报错解决方法 参考文章: (1)hive导出数据到本地文件报错解决方法 (2)https://www.cnblogs.com/yaopeiyun/p/12232251.htm ...

  6. Android WebView注入js文件,判断当前HTML有没有某个js然后再注入

    Android WebView注入js文件,判断当前HTML有没有某个js然后再注入 1.注入js代码 判断当前有没有jQuery文件引入,然后再进行注入. 判断依据其实很简单,获取script 的d ...

  7. Vivado生成bit文件布局失败解决

    1.1 Vivado生成bit文件布局失败解决 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Vivado生成bit文件布局失败解决: 5)结束语. 1.1.2 本节引 ...

  8. MySQL导入SQL文件执行失败解决办法

    MySQL导入SQL文件执行失败解决办法 导入SQL失败,大多数原有是MySQL开启了严格模式,关闭掉严格模式就可以了,执行如下SQL后再导入: SET sql_mode = ''; SET GLOB ...

  9. android调用文件管理器回调,Android中调用系统管理器选择文件并返回绝对路径

    选择文件的时候,如果使用的是第三方软件,一般是直接返回绝对路径的Uri,如果是系统的,则会返回媒体库的xxxx,所以单纯一种方式选择文件,很可能拿到的绝对路径是错的或者是空的,所以需要做几种处理,这里 ...

  10. android自定义文件选择,关于安卓自定义本地文件选择库的实现

    最近想重温一下旧知识,所以写了这一个库. androidx+kotlin 功能有:(1)多线程本地文件扫描 (2)ContentProvider扫描 注意:若使用本地扫描时,出现错误,请看文章:htt ...

最新文章

  1. 2000亿次开放学习后,DeepMind的智能体成精了
  2. 拖链电缆 机器人电缆_选购电缆拖链需要注意哪些要点
  3. 神策数据汽车行业解决方案重磅上线,全面赋能车企数字化转型
  4. cmd10与16进制的相互转换
  5. PHP 运动会,运动会成绩管理系统
  6. Spring 2.X 中AOP的简明教程
  7. 聊聊Code Review
  8. java 且_JAVA中逻辑运算符“|”和“”与“||”和“”的用法
  9. C++工作笔记-map有自动排序的功能
  10. WebStorm 格式化代码 - 快捷键
  11. html字段值换行代码怎么写,HTML段落,换行,字符实体
  12. Bootstraptable源码
  13. windows安装vnm
  14. Linux配置Java环境变量 详解
  15. vmrc必须从URL启动该应用程序
  16. 为什么php在网页中不显示,为什么网页显示不出php代码_后端开发
  17. 如何使用proteus仿真
  18. Mtlab 二次规划及其例子
  19. 非越狱逆向开发总结文档(含iOS Extension)
  20. 概率统计笔记:二维随机变量及其联合概率分布

热门文章

  1. 相机像素尺寸(像元大小)和成像系统分辨率之间的关系
  2. 对java方法进行功能增强的三种方法
  3. Lodop打印参数方法参考
  4. MySQL获取汉字的拼音首字母
  5. 计算机浏览记录删除,如何完全删除本地计算机上的浏览历史记录?如何从计算机中完全删除Internet访问...
  6. 在Windows环境下,将tomcat的默认端口修改为8081
  7. 【集训队互测 2012】Middle
  8. docker迁移禅道
  9. DEJA_VU3D - Cesium功能集 之 050-纯前端空间体体积计算
  10. Scratch编程学习的好处