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

Android根据图片Uri获取图片绝对路径

2017-05-31 11:43 316 查看
本文转载自简书tianma,网址是: http://www.jianshu.com/p/b168cbe50066

当我们需要选择并获取图片将其展示出来时,一般会这样处理:
// 进入选择图片的界面
private void selectImage(){
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, CHOOSE_IMAGE);
}
// 在onActivityResult()回调方法中进行数据获取
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// ... 进行一些判断处理
Uri uri = data.getData();
// ... 接下来进行图片显示
}

以上可以看出我们获取的是Uri类型的数据,要显示图片可以先根据Uri获取图片的位置,然后再显示在界面上,那么如何根据Uri来获取图片的绝对路径呢?这就涉及到Android版本适配问题,因为Android Api版本不同,获取Uri对应的图片绝对路径也不一样,那么需要对不同的Api进行适配:
/**
* 根据图片的Uri获取图片的绝对路径(已经适配多种API)
* @return 如果Uri对应的图片存在,那么返回该图片的绝对路径,否则返回null
*/
public static String getRealPathFromUri(Context context, Uri uri) {
int sdkVersion = Build.VERSION.SDK_INT;
if (sdkVersion < 11) {
// SDK < Api11
return getRealPathFromUri_BelowApi11(context, uri);
}
if (sdkVersion < 19) {
// SDK > 11 && SDK < 19
return getRealPathFromUri_Api11To18(context, uri);
}
// SDK > 19
return getRealPathFromUri_AboveApi19(context, uri);
}

/**
* 适配api19以上,根据uri获取图片的绝对路径
*/
private static String getRealPathFromUri_AboveApi19(Context context, Uri uri) {
String filePath = null;
String wholeID = DocumentsContract.getDocumentId(uri);

// 使用':'分割
String id = wholeID.split(":")[1];

String[] projection = { MediaStore.Images.Media.DATA };
String selection = MediaStore.Images.Media._ID + "=?";
String[] selectionArgs = { id };

Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection,
selection, selectionArgs, null);
int columnIndex = cursor.getColumnIndex(projection[0]);

if (cursor.moveToFirst()) {
filePath = cursor.getString(columnIndex);
}
cursor.close();
return filePath;
}

/**
* 适配api11-api18,根据uri获取图片的绝对路径
*/
private static String getRealPathFromUri_Api11To18(Context context, Uri uri) {
String filePath = null;
String[] projection = { MediaStore.Images.Media.DATA };

CursorLoader loader = new CursorLoader(context, uri, projection, null,
null, null);
Cursor cursor = loader.loadInBackground();

if (cursor != null) {
cursor.moveToFirst();
filePath = cursor.getString(cursor.getColumnIndex(projection[0]));
cursor.close();
}
return filePath;
}

/**
* 适配api11以下(不包括api11),根据uri获取图片的绝对路径
*/
private static String getRealPathFromUri_BelowApi11(Context context, Uri uri) {
String filePath = null;
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = context.getContentResolver().query(uri, projection,
null, null, null);
if (cursor != null) {
cursor.moveToFirst();
filePath = cursor.getString(cursor.getColumnIndex(projection[0]));
cursor.close();
}
return filePath;
}

以上便可以获取Uri对应的图片的绝对路径,然后就可以愉快的做我们想做的事情咯~
参考链接:
Android | Display Selected Image and Its Real Path
android get real path by Uri.getPath()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 图片 uri