您的位置:首页 > 移动开发

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.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不能上传图片的问题已经解决(亲测有效),虽然我很渣但是我一直在努力,希望大家有更好的方法分享出来,我们一起进步。。。

好了好了,时间太晚了必须要睡了,祝大家和自己晚安哦

!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: