Android WebView 上传图片(以5.0为分界点)不同的处理方式
2017-06-30 00:00
363 查看
近期由于项目需求,需要使用WebView进行图片的上传工作,按照之前在Eclipse中写好的代码直接拿到Android Studio中进行使用发现在android 5.0以上上传图片不能展示出来(在eclipse中是没问题的)查阅资料发现是由于5.0(API21)对WebView的方法进行了更新,具体是WebView的setWebChromeClient方法中对文件的操作由之前的openFileChooser(ValueCallBack<Uri> uploadMsg)变成了5.0之后的onShowFileChooser(WebView
webview,ValueCallBack<Uri[ ]> filePathCallBack, FileChooserParams fileChooserParams)导致了回调方法发生了改变,所以需要以5.0为分界点对此回调做不同的处理。
具体如下:
这是对WebView做文件选择的操作,涉及到的几个方法分别是android 3.0以下,3.0以上4.0以下,4.0以上5.0以下和5.0以上,当然在回调中不需要分的这么详细,只需要将5.0之前和之后进行区分就好。。。下面贴出对回调的处理,
代码示例如下::
之前在看网上的代码的时候可能会因为以下变量的问题不知道怎么写导致一些bug(可能是因为我比较渣吧)现在我把涉及到的变量贴出::
这两个只是对回调做区分的变量
这是对跳转相册的标识处理。。。
好了,到此android 5.0以上webView不能上传图片的问题已经解决(亲测有效),虽然我很渣但是我一直在努力,希望大家有更好的方法分享出来,我们一起进步。。。
好了好了,时间太晚了必须要睡了,祝大家和自己晚安哦
!!
webview,ValueCallBack<Uri[ ]> filePathCallBack, FileChooserParams fileChooserParams)导致了回调方法发生了改变,所以需要以5.0为分界点对此回调做不同的处理。
具体如下:
webview.setWebChromeClient(new WebChromeClient() { @SuppressWarnings("unused")
public void openFileChooser(ValueCallback<Uri> uploadMsg) { mUploadMessage = uploadMsg; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("image/*"); RepairActivity.this.startActivityForResult( Intent.createChooser(i, "File Chooser"), FILECHOOSER_RESULTCODE); } // For Android 3.0+ @SuppressWarnings("unused") public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType) { mUploadMessage = uploadMsg; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("*/*"); RepairActivity.this.startActivityForResult( Intent.createChooser(i, "File Browser"), FILECHOOSER_RESULTCODE); } // For Android 4.1 @SuppressWarnings("unused") 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("image/*"); RepairActivity.this.startActivityForResult( Intent.createChooser(i, "File Chooser"), RepairActivity.FILECHOOSER_RESULTCODE); } @SuppressWarnings("unused") @Override public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) { mUploadMsgForAndroid5 = filePathCallback; Intent i = new Intent(Intent.ACTION_GET_CONTENT); i.addCategory(Intent.CATEGORY_OPENABLE); i.setType("image/*"); RepairActivity.this.startActivityForResult( Intent.createChooser(i, "File Chooser"), RepairActivity.FILECHOOSER_RESULTCODE); return true; } });
这是对WebView做文件选择的操作,涉及到的几个方法分别是android 3.0以下,3.0以上4.0以下,4.0以上5.0以下和5.0以上,当然在回调中不需要分的这么详细,只需要将5.0之前和之后进行区分就好。。。下面贴出对回调的处理,
代码示例如下::
// @SuppressWarnings("unchecked") @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) @SuppressWarnings("unchecked") public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == FILECHOOSER_RESULTCODE) { if (null == mUploadMessage && null == mUploadMsgForAndroid5){ return; } Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData(); if (mUploadMsgForAndroid5 != null) { onActivityResultAboveL(requestCode, resultCode, intent); } else if (mUploadMessage != null) { mUploadMessage.onReceiveValue(result); mUploadMessage = null; } } } @TargetApi(Build.VERSION_CODES.LOLLIPOP) private void onActivityResultAboveL(int requestCode, int resultCode, Intent data) { if (requestCode != FILECHOOSER_RESULTCODE || mUploadMsgForAndroid5 == null) return; Uri[] results = null; if (resultCode == Activity.RESULT_OK) { if (data != null) { 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)}; } } mUploadMsgForAndroid5.onReceiveValue(results); mUploadMsgForAndroid5 = null; }
之前在看网上的代码的时候可能会因为以下变量的问题不知道怎么写导致一些bug(可能是因为我比较渣吧)现在我把涉及到的变量贴出::
private ValueCallback mUploadMessage; private ValueCallback<Uri[]> mUploadMsgForAndroid5;
这两个只是对回调做区分的变量
private final static int FILECHOOSER_RESULTCODE = 1;
这是对跳转相册的标识处理。。。
好了,到此android 5.0以上webView不能上传图片的问题已经解决(亲测有效),虽然我很渣但是我一直在努力,希望大家有更好的方法分享出来,我们一起进步。。。
好了好了,时间太晚了必须要睡了,祝大家和自己晚安哦
!!
相关文章推荐
- Android webview上传图片(适配3.0,4.0,5.0,6.0)
- [置顶] 【Android开发技巧】 关于Webview拍照或从相册上传图片处理总结
- 如何解决Android不同系统版本WebView上传图片的bug
- android Webview打开、上传本地图片的解决方案 支持到5.0
- Android webview上传图片(适配3.0,4.0,5.0,6.0)
- android 5.0之后原生webview同时用https和http加载HTML不加载图片解决方案
- Android webview html上传图片问题
- Android webview实现上传图片的效果(图片压缩)
- Android WebView关于图片/文件上传
- android webview打开本地图片上传
- Android Webview upload 图片上传
- iphone,UIImageView展现不同途径的图片的不同处理方式
- ios中UIImageView展现图片的不同处理方式
- android textView WebView 两种方式 显示html 格式文本 带图片
- android v7兼容包RecyclerView的使用(四)——点击事件的不同方式处理
- android webView使用js/css实现夜间模式 长按识别图片以及二维码,网页可以上传图片
- Android的WebView加载网页的几种方式及网络异常处理
- Android Webview实现图片、文件上传及启动相机功能
- ios中UIImageView展现图片的不同处理方式
- Android使用WebView显示网页(图片大小的处理及内容的自适应)