public static String getPathFromUri(Context context, Uri uri) {
String path = null;
if (DocumentsContract.isDocumentUri(context, uri)) {
//如果是document类型的Uri,通过document id处理,内部会调用Uri.decode(docId)进行解码
String docId = DocumentsContract.getDocumentId(uri);
//primary:Azbtrace.txt
//video:A1283522
String[] splits = docId.split(":");
String type = null, id = null;
if(splits.length == 2) {
type = splits[0];
id = splits[1];
switch (uri.getAuthority()) {
case "com.android.externalstorage.documents":
if("primary".equals(type)) {
path = Environment.getExternalStorageDirectory() + File.separator + id;
break;
case "com.android.providers.downloads.documents":
if("raw".equals(type)) {
path = id;
} else {
Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId));
path = getMediaPathFromUri(context, contentUri, null, null);
break;
case "com.android.providers.media.documents":
Uri externalUri = null;
switch (type) {
case "image":
externalUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
break;
case "video":
externalUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
break;
case "audio":
externalUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
break;
case "document":
externalUri = MediaStore.Files.getContentUri("external");
break;
if(externalUri != null) {
String selection = "_id=?";
String[] selectionArgs = new String[]{ id };
path = getMediaPathFromUri(context, externalUri, selection, selectionArgs);
break;
} else if (ContentResolver.SCHEME_CONTENT.equalsIgnoreCase(uri.getScheme())) {
path = getMediaPathFromUri(context, uri, null, null);
} else if (ContentResolver.SCHEME_FILE.equalsIgnoreCase(uri.getScheme())) {
//如果是file类型的Uri(uri.fromFile),直接获取图片路径即可
path = uri.getPath();
//确保如果返回路径,则路径合法
return path == null ? null : (new File(path).exists() ? path : null);
private static String getMediaPathFromUri(Context context, Uri uri, String selection, String[] selectionArgs) {
String path;
String authroity = uri.getAuthority();
path = uri.getPath();
String sdPath = Environment.getExternalStorageDirectory().getAbsolutePath();
if(!path.startsWith(sdPath)) {
int sepIndex = path.indexOf(File.separator, 1);
if(sepIndex == -1) path = null;
else {
path = sdPah + path.substring(sepIndex);
if(path == null || !new File(path).exists()) {
ContentResolver resolver = context.getContentResolver();
String[] projection = new String[]{ MediaStore.MediaColumns.DATA };
Cursor cursor = resolver.query(uri, projection, selection, selectionArgs, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
try {
int index = cursor.getColumnIndexOrThrow(projection[0]);
if (index != -1) path = cursor.getString(index);
Log.i(TAG, "getMediaPathFromUri query " + path);
} catch (IllegalArgumentException e) {
e.printStackTrace();
path = null;
} finally {
cursor.close();
return path;
文件管理器的组成调用系统自带的文件管理器有如下几个选项,分为两类系统自带的文件管理器第三方集成到系统管理器中下面是调用选择文件方法后,调用系统文件管理器出来的界面网上可以搜到很多 Uri 转路径的方法,但都是互相抄袭根本没经过验证的。现在最新是 Android 10,而网上那些方法,大多连 Android 7 引入文件权限(fileProvider)都不支持。本着认真仔细的研究,我安...
Android中
Uri和
Path之间的
转换
调用系统拍照应用,拍照后要保存图片,那么我们需要指定一个存储图片路径的
Uri。这就涉及到如何将file
path转换为
Uri。有时候我们还需要根据照片的路径得到照片的media
Uri,那么又该如何
转换呢?
Android Uri to
Path
现在遇到的常规
Uri有两种:
媒体文件的
Uri是content://, 表示这是一个数据库数据。去数据库查询正常返回。
其他的文件
Uri是file://, 表示这个是一个文件。这个
uri是通过
Uri.fromFile(File file)方法生成。
Media
Uri To
Path
在项目中需要用到将Uri转换为绝对路径,在网上找到一个方法,做个笔记
网上有不少方法,但是有的对4.4后的版本无效,这里的方法可以在4.4之后的版本将Uri转换为绝对路径
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
content://com.
android.providers.downloads.documents/document/raw:/storage/emulated/0/Download/browser/图片收藏/200832810200350_2.jpg
emmm....
* @param imageUri
public static String getFileAbsolutePath(Context context, Uri imageUri) {
if (context == null || imageUri == null) {
1、uri转file:file = new File(new URI(uri.toString())); file转uri:URI uri = file.toURI(); 2、uri转path:private String getPath(Uri uri) {
String[] projection = {MediaStore.Video.Media.DATA};
媒体文件的Uri是content://, 表示这是一个数据库数据。去数据库查询正常返回。
其他的文件Uri是file://, 表示这个是一个文件。这个uri是通过Uri.fromFile(File file)方法生成。
Media Uri To Path
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Environme
点击选择相册中的视频,获取所有本地视频文件。点击获取相册中的视频是正常的,但是获取文件管理中的视频时,会出现根据Uri找不到存储路径的问题。
在Android Uri 转 Path的过程中,发现在查询文件管理中的视频时,通过Uri查询系统媒体库得到的存储路径为null,但是可以通过拼接的方式来得到存储路径。
private static String getMediaPathFromUri(Context context, Uri uri, String selection, String[] select
注:本方法也可解决获取相册图片拿不到正确路径问题。
我们项目的使用场景,手机qq打开文件,选择其他打开方式,选择我们自己的应用打开,通过intent.getData()获取文件地址,后来发现在Android7.0之后的版本,获取到的地址不正确,说文件不存在。日志报错column-data-does-not-exist,
经过一天的折腾,终于在网上找到了一些零碎的知识拼接成了解决办法,具体如下:...
public static String getPath(Context context, Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
// DocumentProvider
if (isKitKat &...
Uri的概述:
通用资源标志符(Universal Resource Identifier, 简称"URI")。
Uri代表要操作的数据,Android上可用的每种资源 (图像、视频片段、网页等) 都可以用Uri来表示。从概念上来讲,URI包括URL。
Uri的通用格式为:scheme: scheme-specific-part #fragment
1.path转uri:
Uri uri = Uri.parse(path);
将路径转换为要操作的数据。
......