转自知乎Matisse
package com.zhihu.matisse.internal.utils; import android.annotation.TargetApi; import android.content.ContentUris; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Environment; import android.provider.DocumentsContract; import android.provider.MediaStore; /** * http://stackoverflow.com/a/27271131/4739220 */ public class PathUtils { /** * Get a file path from a Uri. This will get the the path for Storage Access * Framework Documents, as well as the _data field for the MediaStore and * other file-based ContentProviders. * * @param context The context. * @param uri The Uri to query. * @author paulburke */ @TargetApi(Build.VERSION_CODES.KITKAT) public static String getPath(final Context context, final Uri uri) { // DocumentProvider if (Platform.hasKitKat() && 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]; } // TODO handle non-primary volumes } else if (isDownloadsDocument(uri)) { // DownloadsProvider 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); } else if (isMediaDocument(uri)) { // MediaProvider 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); } } else if ("content".equalsIgnoreCase(uri.getScheme())) { // MediaStore (and general) return getDataColumn(context, uri, null, null); } else if ("file".equalsIgnoreCase(uri.getScheme())) { // File 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 columnIndex = cursor.getColumnIndexOrThrow(column); return cursor.getString(columnIndex); } } 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()); } }
相关推荐
Uri转Path
Android 中 Uri 和 Path 之间的转换示例代码分析 Android 中 Uri 和 Path 之间的转换是 Android 开发中非常重要的一部分,特别是在拍照、图片处理和文件存储等方面。本篇文章主要介绍了 Android 中 Uri 和 Path ...
尿路 将相对文件系统路径转换为安全URI路径安装npm install --save uri-path用法var URIpath = require ( 'uri-path' ) ;// Properly encode URI path segmentsURIpath ( '../abc/@#$%¨&()[]{}-_=+ß/môòñ 月 ق...
Uri uri = Uri.fromFile(new File(path)); ``` 在上面的代码中,我们首先获取了图片文件的路径地址,然后使用 Uri.fromFile() 方法将其转换为 Uri。 二、从 Uri 中获得图片文件的路径地址 从 Uri 中获得图片文件...
在项目中需要用到将Uri转换为绝对路径,在网上找到一个方法,做个笔记 网上有不少方法,但是有的对4.4后的版本无效,这里的方法可以在4.4之后的版本将Uri转换为绝对路径 public class GetPathFromUri { /** * 专...
uri转字符串路径,解决4.0以上的兼容问题,
### URI与URL的基础概念 #### 一、URI(Uniform Resource Identifier):统一资源标识符 在互联网技术领域中,URI是用于唯一标识一个资源的一种标准形式。它是一种抽象的概念,用以指代任何类型的资源,无论是实体...
2、讲一个Uri转换成一个path 以选择一张图片为例: String path = FileTools.getRealPathFromUri(content,uri); //自定义方法在下面 public static String getRealPathFromUri(Context context,
从文件uri获取真实文件路径 安装(iOS) 目前不支持 安装(Android) npm i react-native-get-real-path@https://github.com/Wraptime/react-native-get-real-path.git --save 对以下文件进行更改: android/...
- **创建和解析URI**:Uri库允许通过字符串或数组创建URI实例,并能解析出各个部分,如scheme(协议)、authority(授权部分,包括用户信息、主机和端口)、path(路径)、query(查询字符串)和fragment(片段...
Uri通常由两部分组成:authority和path。Authority是ContentProvider的唯一标识,一般与应用的包名相同;path则是指向具体数据的路径。 在实际开发中,创建自定义ContentProvider时,我们需要在AndroidManifest.xml...
Uri通常由多个部分组成,包括scheme、authority、path、query和fragment。例如,`content://com.example.provider/mydata?id=1`。 - scheme:定义了资源的获取方式,如`content`表示通过内容提供者,`file`表示...
一些工具类代码块的标准代码,包括但不限于: 根据drawable id获取Bitmap 根据drawable id获取Drawable bitmap转drawable ...图片uri转path 根据路径获得突破并压缩返回bitmap用于显示 从文件中获取图片
通过URI获取文件Path(支持QQ文件管理器,下载文件夹,共享媒体文件)
在Android开发中,有时我们需要从Uri获取到真实的文件路径,并将其转换为File对象,以便进行文件操作,如读取、写入或删除等。这里我们将深入探讨如何在Android中实现这个过程。 首先,Uri(Uniform Resource ...
`uriparser`库提供了一套API,使得开发者可以方便地分解URL的各个部分,如协议(scheme)、主机(authority)、路径(path)、查询字符串(query)和片段(fragment)。 1. **协议(scheme)**:`uriparser`允许...
3. **Path(路径)**:表示资源的具体位置,如`/index.html`。路径可以进一步细分为层级结构,帮助区分不同的子资源。 #### 三、URI的应用实例 为了更好地理解URI是如何工作的,我们可以通过几个实际的例子来加以...
<data android:scheme="bapp" android:host="auth" android:path="/login" /> ``` 2. **构建Uri**:在A_APP中,我们需要构造一个包含B_APP所需信息的Uri。这里因为涉及到两个应用包,可能意味着A_APP需要在Uri...