项目中有个需求,通过拍照或者选取系统图片后,显示到控件上,并且要得到图片的实际路径。
自己用的是华为手机,4.0系统。发现选取图片,有2个不同的选项,分别是“图库”和“文件管理”,如下图所示
1、通过系统拍照,得到的uri地址是
file:///mnt/sdcard/DCIM/camera/faceImage.JPEG
2、通过文件管理器,得到的uri地址是
file:///mnt/sdcard/20140724181622520977.jpg
3、通过图库,得到的图片uri地址是
content://media/external/images/media/888737
我们发现,得到图片的地址有2种类型,以file开头和content开头的,但是以content开头的 ,没有路径,只有图片编号的uri.这就导致接下来无法根据图片实际路径,
所以需要要一个方法,把content的变成实际真实文件路径,加上一个方法如下即可
private String getRealPathFromURI(Uri contentUri) { //传入图片uri地址
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);
}
前后的结果如下,可以看到我们通过这个方法得到了图片的真实路径
总结,在获取图片路径时候,要先判断uri字符串是否包含 content ,如果有的话,就要转换。如果以file开头的,就不管它
String textPre=uri.toString();//得到图片uri地址字符串
//图片文件的路径 ,有2种格式
//华为手机从图库选择的结果 ,以content开头
//content://media/external/images/media/888737
//华为手机从文件选择器的结果,或者系统拍照也是如下的结果,以file开头
// file:///mnt/sdcard2/%E7%A8%8B%E5%BA%8F%E5%91%98%E6%97%A5%E5%B8%B8.jpg
System.out.println("转换前的地址是 : "+textPre);
if(uri.toString().contains("content://")){ //如果包含有content开头,需要转化为其实际路径,不能用content开头
text=getRealPathFromURI(uri);
}else{
text=textPre; //如果用file开头,不用转化
}
System.out.println("转换后的地址是 : "+text);
headPicName=text.substring(text.lastIndexOf("/")+1);//保存图片的文件名,注意索引加1
System.out.println("选取图片的地址是: "+headPicName);
最后附上自己一个源代码,是上一篇的更新
package com.qinghui.sslq.fragment;
import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.Map;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
import com.qinghui.sslq.R;
import com.qinghui.sslq.activity.LoginActivity;
import com.qinghui.sslq.activity.ShowContentActivity;
import com.qinghui.sslq.entity.Detail;
import com.qinghui.sslq.util.CommonUtil;
import com.qinghui.sslq.util.NetWebServiceUtil;
import com.qinghui.sslq.util.PromptUtil;
import com.qinghui.sslq.util.ScreenManager;
import com.qinghui.sslq.util.NetWebServiceUtil.WebServiceCallBack;
import com.qinghui.sslq.util.XmlPullManager;
import com.qinghui.sslq.view.SelectPicPopupWindow;
import android.app.ActionBar;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import and