`
wang_peng1
  • 浏览: 3944213 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

URI 转path

 
阅读更多

转自知乎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());
    }
}

 

分享到:
评论

相关推荐

    Android Uri转Path

    Uri转Path

    Android中Uri和Path之间的转换的示例代码

    Android 中 Uri 和 Path 之间的转换示例代码分析 Android 中 Uri 和 Path 之间的转换是 Android 开发中非常重要的一部分,特别是在拍照、图片处理和文件存储等方面。本篇文章主要介绍了 Android 中 Uri 和 Path ...

    uri-path:将相对文件系统路径转换为安全URI路径

    尿路 将相对文件系统路径转换为安全URI路径安装npm install --save uri-path用法var URIpath = require ( 'uri-path' ) ;// Properly encode URI path segmentsURIpath ( '../abc/@#$%¨&()[]{}-_=+ß/môòñ 月 ق...

    android图片文件的路径地址与Uri的相互转换方法

    Uri uri = Uri.fromFile(new File(path)); ``` 在上面的代码中,我们首先获取了图片文件的路径地址,然后使用 Uri.fromFile() 方法将其转换为 Uri。 二、从 Uri 中获得图片文件的路径地址 从 Uri 中获得图片文件...

    Android Uri和文件路径互相转换的实例代码

    在项目中需要用到将Uri转换为绝对路径,在网上找到一个方法,做个笔记 网上有不少方法,但是有的对4.4后的版本无效,这里的方法可以在4.4之后的版本将Uri转换为绝对路径 public class GetPathFromUri { /** * 专...

    uri转字符串路径工具

    uri转字符串路径,解决4.0以上的兼容问题,

    URI,URL常识

    ### URI与URL的基础概念 #### 一、URI(Uniform Resource Identifier):统一资源标识符 在互联网技术领域中,URI是用于唯一标识一个资源的一种标准形式。它是一种抽象的概念,用以指代任何类型的资源,无论是实体...

    Android中Bitmap、File与Uri之间的简单记录

    2、讲一个Uri转换成一个path 以选择一张图片为例: String path = FileTools.getRealPathFromUri(content,uri); //自定义方法在下面 public static String getRealPathFromUri(Context context,

    react-native-get-real-path:将文件uri转换为真实路径

    从文件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**:Uri库允许通过字符串或数组创建URI实例,并能解析出各个部分,如scheme(协议)、authority(授权部分,包括用户信息、主机和端口)、path(路径)、query(查询字符串)和fragment(片段...

    androdi ContentProvider和Uri详解

    Uri通常由两部分组成:authority和path。Authority是ContentProvider的唯一标识,一般与应用的包名相同;path则是指向具体数据的路径。 在实际开发中,创建自定义ContentProvider时,我们需要在AndroidManifest.xml...

    博客《Uri详解之——Uri结构与代码提取》对应源码

    Uri通常由多个部分组成,包括scheme、authority、path、query和fragment。例如,`content://com.example.provider/mydata?id=1`。 - scheme:定义了资源的获取方式,如`content`表示通过内容提供者,`file`表示...

    java_一些图片管理工具类的标准代码_android_bitmap转drawable_高斯模糊代码

    一些工具类代码块的标准代码,包括但不限于: 根据drawable id获取Bitmap 根据drawable id获取Drawable bitmap转drawable ...图片uri转path 根据路径获得突破并压缩返回bitmap用于显示 从文件中获取图片

    Android-通过URI获取文件Path(支持QQ文件管理器,下载文件夹,共享媒体文件)

    通过URI获取文件Path(支持QQ文件管理器,下载文件夹,共享媒体文件)

    android实现Uri获取真实路径转换成File的方法

    在Android开发中,有时我们需要从Uri获取到真实的文件路径,并将其转换为File对象,以便进行文件操作,如读取、写入或删除等。这里我们将深入探讨如何在Android中实现这个过程。 首先,Uri(Uniform Resource ...

    uriparser-0.7.7.zip

    `uriparser`库提供了一套API,使得开发者可以方便地分解URL的各个部分,如协议(scheme)、主机(authority)、路径(path)、查询字符串(query)和片段(fragment)。 1. **协议(scheme)**:`uriparser`允许...

    浅析什么是URI

    3. **Path(路径)**:表示资源的具体位置,如`/index.html`。路径可以进一步细分为层级结构,帮助区分不同的子资源。 #### 三、URI的应用实例 为了更好地理解URI是如何工作的,我们可以通过几个实际的例子来加以...

    A_APP通过Uri调用B_APP(Uri含两个应用包)demo最新版

    <data android:scheme="bapp" android:host="auth" android:path="/login" /> ``` 2. **构建Uri**:在A_APP中,我们需要构造一个包含B_APP所需信息的Uri。这里因为涉及到两个应用包,可能意味着A_APP需要在Uri...

Global site tag (gtag.js) - Google Analytics