关于webview上传文件(图片)遇到的问题

本文介绍了在Android项目中使用WebView进行图片上传时遇到的问题及解决方案。通过重写WebChromeClient的openFileChooser方法,实现与JavaScript中的<input type="file"/>交互,完成文件选择上传功能,特别是针对图片上传进行了详细说明。

最近公司有个项目是用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);
被这问题搞得快崩溃了,写出来希望能帮到其他也遇到过此问题的人。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值