Android5.0以上Webview上传文件注意事项
来源:互联网 发布:乐之网络 编辑:程序博客网 时间:2024/06/05 11:40
Webview执行上传操作的逻辑是这样的:首先准备上传时会回调 WebChromeClient
类下的 openFileChooser
方法,在这个方法中给我们机会发起Intent来打开支持提供文件的第三方应用,最后在 onActivityResult
回调中将第三方应用提供的内容通过一个叫做 ValueCallback
的参数返回给Webview(详细点来说:ValueCallback是在 openFileChooser
方法里由webview提供给我们的,里面包裹一个Uri,我们在 onActivityResult
里将选中的Uri反馈给 ValueCallback
,这时候相当于Webview就知道我们选择了什么文件),因此,我们需要为Webview设置一个提供 openFileChooser
方法的 WebChromeClient
,这个方法在不同版本的Android中参数是不同的,为此我们一般需要写三个重载函数,大致像这个样子:
private class WebChrome extends WebChromeClient {public void openFileChooser(ValueCallback<Uri> uploadMsg) {Log.d(TAG, "openFileChoose(ValueCallback<Uri> uploadMsg)");mUploadMsg = uploadMsg;}public void openFileChooser(ValueCallback uploadMsg, String acceptType) {Log.d(TAG, "openFileChoose( ValueCallback uploadMsg, String acceptType )");mUploadMsg = uploadMsg;}public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {Log.d(TAG, "openFileChoose(ValueCallback<Uri> uploadMsg, String acceptType, String capture)");mUploadMsg = uploadMsg;}// For Android 5.0+public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {mUploadCallbackAboveL = filePathCallback;return true;}
}Android5.0以后已经换成了onShowFileChooser方法,因此在回调方法中也有一定改变:
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent intent) {if(requestCode == FILECHOOSER_RESULTCODE) {if (null == mUploadMsg && null == mUploadCallbackAboveL) return;Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData();if(mUploadCallbackAboveL != null) {onActivityResultAboveL(requestCode, resultCode, intent);} else if (mUploadMsg != null) {mUploadMsg.onReceiveValue(result);mUploadMsg = null;}}}5.0的回调方法:
@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;}希望可以帮助到各位!
0 0
- Android5.0以上Webview上传文件注意事项
- Android5.0以上WebView的兼容问题
- Android5.0及以上系统WebView上传图片遇到的那些坑
- android5.0以上webview无法加载图片问题
- android5.0以上webview无法播放腾讯等视频
- android使用webview上传文件(适配4.4以上系统)
- android5.0webview上传图片的几个小问题
- android5.0以上webview无法播放腾讯优酷等网络视频
- Android5.0以上版本对比
- express4.0以上版本文件上传
- Android5.0启动Service注意事项
- Android5.0以上通知栏图标设计
- android5.0以上获得所有进程
- android5.0以上手机host修改教程
- Android5.0以上Button去除阴影
- Android5.0以上通知栏图标设计
- Android5.0以上编译Root权限
- Android5.0以上去掉阴影效果
- uva1601题解,pascal留守儿童的血泪
- 工厂模式
- 操作数组的工具类Arrays
- OpenCV Tutorial: 找邊緣(Laplacian)
- H264 编码+打包+解码相关知识 .
- Android5.0以上Webview上传文件注意事项
- 1076. Forwards on Weibo (30)
- 新生代开源区块链技术
- 编译器科谱
- 浅谈HTTP中Get与Post的区别
- Android 技术目标:全栈工程师
- React—Native开发之原生模块向JavaScript发送事件
- 有趣的JavaScript原生数组函数
- GridView设置不同的item(布局)