android 缩略图uri_android 根据文件Uri获取图片url

本文详细介绍了在Android中如何通过文件Uri获取文件的实际路径Url,包括简易版和针对Android 4.4以上系统的复杂版处理方法,以及如何将路径转换为Uri。
摘要由CSDN通过智能技术生成

释放双眼,带上耳机,听听看~!

今天,简单讲讲android里如何通过文件的Uri获取文件的路径url。

昨天,我讲了如何调用手机的文件管理器获取文件资源,但是文件管理器返回的是文件的Uri,我们需要通过Uri获取文件的url才可以操作文件。昨天的博客虽然写了一种Uri转url的代码,但是我自己也没有很懂,于是在网上查找资料,最终解决了问题。这里记录一下。

一.简易版处理(实际并没发现有什么问题)

public static String getRealPathFromURI(Context context, Uri contentURI) {

String result;

Cursor cursor = context.getContentResolver().query(contentURI,

new String[]{MediaStore.Images.ImageColumns.DATA},//

null, null, null);

if (cursor == null) result = contentURI.getPath();

else {

cursor.moveToFirst();

int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);

result = cursor.getString(index);

cursor.close();

}

return result;

}

简单讲讲,这种代码直接通过Uri使用contentProvider获取数据库的文件的url,网上说android 4.4后这种代码是有问题的,但是我没有测试,大家可以测试看看。

2.复杂版处理

public class GetPathFromUri {

/**

* 专为Android4.4设计的从Uri获取文件绝对路径

*/

public static String getPath(final Context context, final Uri uri) {

final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

// DocumentProvider

if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {

// ExternalStorageProvider

if (isExternalStorageDocument(uri)) {

final String docId = DocumentsContract.getDocumentId(uri);

final String[] split = docId.split(":");

final String type = split[0];

if ("primary".equalsIgnoreCase(type)) {

return Environment.getExternalStorageDirectory() + "/" + split[1];

}

}

// DownloadsProvider

else if (isDownloadsDocument(uri)) {

final String id = DocumentsContract.getDocumentId(uri);

final Uri contentUri = ContentUris.withAppendedId(

Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));

return getDataColumn(context, contentUri, null, null);

}

// MediaProvider

else if (isMediaDocument(uri)) {

final String docId = DocumentsContract.getDocumentId(uri);

final String[] split = docId.split(":");

final String type = split[0];

Uri contentUri = null;

if ("image".equals(type)) {

contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

} else if ("video".equals(type)) {

contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;

} else if ("audio".equals(type)) {

contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;

}

final String selection = "_id=?";

final String[] selectionArgs = new String[]{split[1]};

return getDataColumn(context, contentUri, selection, selectionArgs);

}

}

// MediaStore (and general)

else if ("content".equalsIgnoreCase(uri.getScheme())) {

return getDataColumn(context, uri, null, null);

}

// File

else if ("file".equalsIgnoreCase(uri.getScheme())) {

return uri.getPath();

}

return null;

}

/**

* Get the value of the data column for this Uri. This is useful for

* MediaStore Uris, and other file-based ContentProviders.

*

* @param context The context.

* @param uri The Uri to query.

* @param selection (Optional) Filter used in the query.

* @param selectionArgs (Optional) Selection arguments used in the query.

* @return The value of the _data column, which is typically a file path.

*/

public static String getDataColumn(Context context, Uri uri, String selection,

String[] selectionArgs) {

Cursor cursor = null;

final String column = "_data";

final String[] projection = {column};

try {

cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,

null);

if (cursor != null && cursor.moveToFirst()) {

final int column_index = cursor.getColumnIndexOrThrow(column);

return cursor.getString(column_index);

}

} finally {

if (cursor != null)

cursor.close();

}

return null;

}

/**

* @param uri The Uri to check.

* @return Whether the Uri authority is ExternalStorageProvider.

*/

public static boolean isExternalStorageDocument(Uri uri) {

return "com.android.externalstorage.documents".equals(uri.getAuthority());

}

/**

* @param uri The Uri to check.

* @return Whether the Uri authority is DownloadsProvider.

*/

public static boolean isDownloadsDocument(Uri uri) {

return "com.android.providers.downloads.documents".equals(uri.getAuthority());

}

/**

* @param uri The Uri to check.

* @return Whether the Uri authority is MediaProvider.

*/

public static boolean isMediaDocument(Uri uri) {

return "com.android.providers.media.documents".equals(uri.getAuthority());

}

}

简单讲讲,这种代码对android4.4之前和之后做了分别的处理,在android 4.4后又根据url的类型,如ExternalStorageProvider,DownloadsProvider,MediaProvider分别进行处理。具体怎么处理,上面写的很清楚。这个代码比较全面,建议大家使用。

顺便讲讲url转Uri,这个绝对路径转Uri比较简单

以绝对路径创建一个File对象,然后调用

Uri.fromFile(file)

android 根据文件Uri获取图片url就讲完了。

就这么简单。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值