android 4.4系统以前,选择图片,获取图片路径代码如下:
//访问图库
Intent intent = new Intent();
intent.setType("image/*");//可选择图片视频
intent.setAction(Intent.ACTION_GET_CONTENT );
startActivityForResult(intent, Select);
获取图片路径
//方法重载获取返回值
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case Select:
if (resultCode == RESULT_OK) {
/**
* 当选择的图片不为空的话,在获取到图片的途径
*/
Uri uri = data.getData();
// String ddd=Uri.decode(uri.toString());
try {
String[] pojo = {MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery(uri, pojo, null, null, null);
if (cursor != null) {
ContentResolver cr = this.getContentResolver();
int colunm_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String path = cursor.getString(colunm_index);
//以上代码获取图片路径
/*获取文件的扩展名*/
File f2 = new File(path);
String fName2 = f2.getName();//文件名
String extendName1 = fName2.substring(fName2.lastIndexOf(".") + 1);//扩展名
//复制到指定文件夹中文件的新的名称
// String fileName1 = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + "." + extendName1;//导入后图片名称
String TotalName = Long.toString(System.currentTimeMillis()) + "_" + caseName + "_" + fileName+ "_" + userName;
String fileName1 = TotalName + "." + extendName1;
// String fileName=str.substring(str.lastIndexOf("/")+1,str.length());
/*新建存储导入文件的文件夹*/
pastePath = mPath + "Import/";
File out = new File(pastePath);
if (!out.exists()) {
out.mkdirs();
}
//文件的存储路径
String newPathone = pastePath + fileName1;
boolean res = copyFile(path, newPathone);//复制录音文件到指定文件夹
/*复制另外一份文件到不会删除的目录下方*/
ImportPath = newPath + "Import/";
File outfileOnew = new File(ImportPath);
if (!outfileOnew.exists()) {
outfileOnew.mkdirs();
}
//文件的存储路径
String newPathThree = ImportPath + fileName1;
boolean result = copyFile(path, newPathThree);//复制录音文件到指定文件夹
if (result == true && res == true) {
Toast.makeText(this, "导入成功!", Toast.LENGTH_SHORT).show();
}
}
} catch (Exception e) {
}
break;
}
}
}
Android 4.4系统及以上,使用以上方法获取到的图片路径为空,原因如下:
Android 4.4(含)开始,通过以上方式访问图库后,返回的Uri如下(访问“最近”):
Uri is:content://com.android.providers.media.documents/document/image%3A188382 Uri.getPath is :/document/image:188383 对应的图片真实路径:/storage/emulated/0/Pictures/Screenshots/Screenshot_2014-09-22-21-40-53.png
不但如此,对于不同类型图库,返回的Uri形式并不相同(访问普通相册):
Uri is:content://media/external/images/media/188222 Uri.getPath is :/external/images/media/188223 对应的图片真实路径:/storage/emulated/0/Download/20130224235013.jpg
而4.4之前返回的Uri只存在一种形式,如下:
Uri is: content://media/external/images/media/140462 Uri.getPath is :/external/images/media/140463对应的图片真实路径:/storage/emulated/0/DCIM/Camera/20130224235013.jpg
因此,在Android 4.4或更高版本设备上,通过简单的getDataColumn(Context, Uri, null, null)进行图片数据库已经不能满足所有需求,因此在获取图片真实路径的时候需要根据不同类型区分对待。
针对android4.4及以上选择图片解决方法:
方法一:
Intent intent = new Intent();
intent.setType("image/*");//可选择图片视频
//修改为以下两句代码
intent.setAction(Intent.ACTION_PICK);
intent.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);//使用以上这种模式,并添加以上两句
startActivityForResult(intent, Select);
使用上面的方法,使用android4.4以下onActivityResult中的方法就可以获取到路径,这种方法不区分系统版本。
方法二:
在android中选择图片时,打开相册选择图片(根据是否是4.4及以上设置不同action),代码如下:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {//4.4及以上 intent2.setAction(Intent.ACTION_OPEN_DOCUMENT);
} else {//4.4以下
intent2.setAction(Intent.ACTION_GET_CONTENT);
}
在onActivityResult里面返回的Uri uri = data.getData();如果是android4.4 uri格式为content://com.android.providers.media.documents/document/image:3952,4.4以下格式为
content://media/external/images/media/3951,要获取图片的存储路径需要,根据系统的版本使用不同的方法获得,代码如下:
if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT){//4.4及以上
String wholeID = DocumentsContract.getDocumentId(contentUri);
String id = wholeID.split(:)[1];
String[] column = { MediaStore.Images.Media.DATA };
String sel = MediaStore.Images.Media._ID + =?;
Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column,
sel, new String[] { id }, null);
int columnIndex = cursor.getColumnIndex(column[0]);
if (cursor.moveToFirst()) {
filePath = cursor.getString(columnIndex);
}
cursor.close();
}else{//4.4以下,即4.4以上获取路径的方法
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = context.getContentResolver().query(contentUri, projection, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
filePath = cursor.getString(column_index);
}
**注意:总的来说第二种方式的效果对于4.4系统的界面看起来很不错的,如果只求功能第一种就简便一些了。
参考网址:
[http://y.dobit.top/Detail/61.html]
[http://blog.sina.com.cn/s/blog_88be6cd00102uzu8.html]
[http://www.bubuko.com/infodetail-831974.html]
[http://blog.163.com/shexinyang@126/blog/static/13673931220149135409328/]
关键代码:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {//4.4及以上 intent2.setAction(Intent.ACTION_OPEN_DOCUMENT);
} else {//4.4以下
intent2.setAction(Intent.ACTION_GET_CONTENT);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case PHOTO_REQUEST_TAKEPHOTO:// 当选择拍照时调用
PrefTool.setBooleanSave(this, Prefs.PRE_NOT_TO_BACKGROUD, false);
if (resultCode == Activity.RESULT_OK) {
piclist.add(picName);
refreshListView();
}
break;
case PHOTO_REQUEST_GALLERY:// 当选择从本地获取图片时
PrefTool.setBooleanSave(this, Prefs.PRE_NOT_TO_BACKGROUD, false);
if (resultCode == Activity.RESULT_OK) {
Uri uri = data.getData();
String imgPath = "";
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {//4.4及以上
String wholeID = DocumentsContract.getDocumentId(uri);
String id = wholeID.split(":")[1];
String[] column = {MediaStore.Images.Media.DATA};
String sel = MediaStore.Images.Media._ID + "=?";
Cursor cursor = GroupContext.getApplication().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, column,
sel, new String[]{id}, null);
int columnIndex = cursor.getColumnIndex(column[0]);
if (cursor.moveToFirst()) {
imgPath = cursor.getString(columnIndex);
}
cursor.close();
} else {//4.4以下,即4.4以上获取路径的方法
Cursor cursor = getContentResolver().query(uri, null, null,
null, null);
cursor.moveToFirst();
cursor.moveToFirst();
String imgNo = cursor.getString(0); // 图片编号
imgPath = cursor.getString(1); // 图片文件路径
String imgSize = cursor.getString(2); // 图片大小
String imgName = cursor.getString(3); // 图片文件名
cursor.close();
}
String picName = DateUtil.format(new Date(), "yyyyMMddHHmmss")
+ ".jpg";
FileCache.copyFile(imgPath, Files.photoPath + picName);
piclist.add(picName);
refreshListView();
}
break;
}
}