最近公司有个项目是用webview为主搭配原生为辅写的,其中要用到上传图片,于是查了下webView中上传文件的做法:
1.JS中的<input type="file"/>需要重写WebChromeClient中的openFileChooser来响应操作。代码如下:
class MyWebChromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int newProgress) {
mPb.setProgress(newProgress);
super.onProgressChanged(view, newProgress);
}
//The undocumented magic method override
//Eclipse will swear at you if you try to put @Override here
// For Android 3.0+
public void openFileChooser(ValueCallback<Uri> uploadMsg) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("image/*");
startActivityForResult(Intent.createChooser(i,"File Chooser"), FILE_CHOOSER_RESULT_CODE);
}
// For Android 3.0+
public void openFileChooser( ValueCallback uploadMsg, String acceptType ) {
mUploadMessage = uploadMsg;
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*");
startActivityForResult(
Intent.createChooser(i, "File Browser"), FILE_CHOOSER_RESULT_CODE);
}
//For Android 4.1
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("*/*");
startActivityForResult( Intent.createChooser( i, "File Chooser" ), FILE_CHOOSER_RESULT_CODE );
}
}2.重写选择完图片后的回调函数,代码如下:
public void onActivityResult(int requestCode, int resultCode, Intent intentData) {
super.onActivityResult(requestCode, resultCode, intentData);
Uri result = null;
// check that the response is a good one
if (resultCode == Activity.RESULT_OK) {
if (requestCode == FILE_CHOOSER_RESULT_CODE) {
if (null == this.mUploadMessage) {
return;
}
if (null == mUploadMessage) return;
String dataString = intentData.getDataString();
if (dataString != null) {
result = Uri.parse(dataString);
}
// result = intentData == null || resultCode != Activity.RESULT_OK ? null : intentData.getData();
}
}
mUploadMessage.onReceiveValue(result );
mUploadMessage = null;
}网络上能查到的关于WebView中上传文件的解决方案基本都是这个,我做到问题来了,所有操作都很正常,但当选完图片后上传到服务器发现上传的图片是空的。折腾了很久还是没能找到原因,后来试着把URI的路径写死成手机中某个已经存在图片,发现居然可以了!!!这下比较明了了,通过选择图片返回的URI还要经过处理才能使用。先要通过返回的URI转换成真实的路径。
private String getRealPathFromURI(Uri contentUri) {
String[] proj = { MediaStore.Images.Media.DATA };
CursorLoader loader = new CursorLoader(getActivity(), contentUri, proj, null, null, null);
Cursor cursor = loader.loadInBackground();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}然后再通过File创建一个新的URI
String str = getRealPathFromURI(result);
File file = new File(str);
Uri uriImg = Uri.fromFile(file);
mUploadMessage.onReceiveValue(pic);被这问题搞得快崩溃了,写出来希望能帮到其他也遇到过此问题的人。
本文介绍了在Android项目中使用WebView进行图片上传时遇到的问题及解决方案。通过重写WebChromeClient的openFileChooser方法,实现与JavaScript中的<input type="file"/>交互,完成文件选择上传功能,特别是针对图片上传进行了详细说明。
遇到的问题&spm=1001.2101.3001.5002&articleId=46309669&d=1&t=3&u=97441c9679f54b179e831d6cc6d945ae)
1762

被折叠的 条评论
为什么被折叠?



