近期由于项目需求,需要使用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.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; } });
代码示例如下::
// @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不能上传图片的问题已经解决(亲测有效),虽然我很渣但是我一直在努力,希望大家有更好的方法分享出来,我们一起进步。。。
好了好了,时间太晚了必须要睡了,祝大家和自己晚安哦!!