`
zhy20045923
  • 浏览: 157000 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

如何将uri转成真实路径地址

 
阅读更多

    /**
     * 获取文件选择器选中的文件路径
     *
     * @param context
     * @param uri
     * @return
     */
    public static String getPath(Context context, Uri uri) {
        String path;
        //使用第三方应用打开
        if ("file".equalsIgnoreCase(uri.getScheme())) {
            path = uri.getPath();
            return path;
        }
        //4.4以后
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {
            path = getPathFromNewSdk(context, uri);
            //4.4以下下系统调用方法
        } else {
            path = getPathFromOldSdk(context, uri);
        }
        return path;
    }

    private static String getPathFromOldSdk(Context context, Uri contentUri) {
        String res = null;
        String[] proj = {MediaStore.Images.Media.DATA};
        Cursor cursor = context.getContentResolver().query(contentUri, proj, null, null, null);
        if (null != cursor && cursor.moveToFirst()) {
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            res = cursor.getString(column_index);
            cursor.close();
        }
        return res;
    }

    /**
     * 专为Android4.4设计的从Uri获取文件绝对路径,以前的方法已不好使
     */
    private static String getPathFromNewSdk(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.
     */
    private 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.
     */
    private 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.
     */
    private 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.
     */
    private static boolean isMediaDocument(Uri uri) {
        return "com.android.providers.media.documents".equals(uri.getAuthority());
    }
分享到:
评论

相关推荐

    android 根据uri获取真实路径

    ### Android根据URI获取真实路径详解 #### 概述 在Android开发过程中,处理文件路径时经常需要将一个`Uri`转换成真实的文件路径。尤其是在处理用户通过文件选择器选取的图片或文件时,通常会得到一个`Uri`,而这个...

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

    React本机得到真实路径 从文件uri获取真实文件路径 安装(iOS) 目前不支持 安装(Android) npm i react-native-get-real-path@https://github.com/Wraptime/react-native-get-real-path.git --save 对以下文件...

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

    本文实例讲述了android实现Uri获取真实路径转换成File的方法。分享给大家供大家参考。具体实现方法如下: Uri uri = data.getData(); String[] proj = { MediaStore.Images.Media.DATA }; Cursor actualimagecursor...

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

    下面我们将详细介绍如何将图片文件的路径地址转换为 Uri,並且从 Uri 中获得图片文件的路径地址。 一、将图片文件的路径地址转换为 Uri 在 Android 中,我们可以使用 ContentResolver 将图片文件的路径地址转换为 ...

    Android开发 8.0及以上调用相机/相册,并根据Uri获取图像绝对路径,并进行文件上传

    就不允许在 App 间,使用 file:// 的方式,传递一个 File ,否则就会抛出异常,而provider的作用恰好就是用过 content://的模式替换掉 file://,看上去只是换了个前缀,但其实是有真实路径转为了虚拟路径。...

    获取本地文件的真实路径

    现在我们需要实现`getRealPathFromURI`方法,这是一个关键步骤,它将`Uri`转换为文件的真实路径。由于Android版本的不同,此方法可能需要根据API级别进行适配: ```java public String getRealPathFromURI(Uri uri)...

    PickiT:一个返回Uri的真实路径的Android库

    选择 一个返回Uri的真实路径的Android库 如果您在其中一个应用程序中使用此库,并且要感谢我:演示截图: 在下载演示应用程序参加民意调查让其他开发人员知道您测试了哪个版本:将Pickit添加到您的项目中: 在存储库...

    电力系统一些常用知识

    把由输电、变电、配电设备及相应的辅助系统组成的联系发电与用电的统一整体称为电力网。

    android跳到系统相册选择图片并根据uri获取真实图片路径

    1.首先跳转到系统相册选择图片 public void ChoosePicture(View view) { // 激活系统图库,选择一张图片 Intent intent = new Intent(); intent.setAction(Intent.ACTION_PICK); intent.setType(image/*);...

    安卓获取文件路径到text的DEMO

    // 自定义方法,用于获取真实路径 if (filePath != null) { // 将路径显示在TextView或其他文本组件中 TextView filePathTextView = findViewById(R.id.file_path_text_view); filePathTextView.setText...

    Android打开手机相册获取图片路径

    使用 RealPathFromUriUtils 工具类获取图片的真实路径: public class RealPathFromUriUtils { public static String getRealPathFromUri(Context context, Uri uri) { // 获取图片的真实路径 } } 五、完整代码...

    java路径获得几种方法.txt

    - **相关标准**:获取路径时遵循的是一套统一资源标识符(Uniform Resource Identifier, URI)的标准,如RFC 2396中所定义。 ##### 2. JSP/Servlet中的路径获取 - **背景**:在JSP或Servlet环境中,路径获取主要...

    行业文档-设计装置-定位路径在多平台的共享方法及系统.zip

    在发送路径信息时,需要将特定平台的路径转换成URI格式。在接收端,接收到的URI需要被正确解析并映射到本地系统的路径。这一过程可能涉及到正则表达式处理、URI组件分解以及根据目标系统规则进行重组。 系统设计时...

    asp.net RewritePath重定向HTTP头Content-Location暴露真实路径解决方法

    6. 在“值”字段中,填写一个用于替代真实路径的地址,例如可以填入网站的域名。这样,当客户端接收到响应时,它将看到这个域名而不是实际的文件路径。 通过上述设置,Content-Location将显示为我们在IIS设置的同名...

    Android获取SD卡中选中图片的路径(URL)

    因此,我们需要将其转换为真实的文件路径。在API 19(KitKat)及以上版本,我们可以使用`DocumentsContract`类: ```java String[] projection = {MediaStore.Images.Media.DATA}; Cursor cursor = ...

    Android7.0 自定义文件管理器 获取文件夹路径

    本教程将详细解释如何创建一个模仿真实文件管理器的应用,重点在于获取文件夹路径。我们将讨论以下几个关键知识点: 1. 文件系统的访问: Android使用Linux内核,因此其文件系统遵循POSIX标准。每个应用程序都有...

    获得当前网页的地址

    本文将深入探讨如何在ASP中实现这一功能,并结合“IP地址”这个相关概念进行讲解。 首先,我们需要了解ASP中的Request对象。Request对象是ASP内置的对象之一,它用于获取客户端发送到服务器的各种信息,包括HTTP...

    PickiT-master.zip下载

    然后,在需要获取文件路径的地方,调用提供的API,如`PickiT.getFilePath(context, uri)`,传入上下文和Uri,即可得到文件的真实路径。 5. 安全性和权限管理: PickiT库在处理Uri时考虑了权限问题,确保只获取到...

    Android应用源码之文件浏览返回路径.zip

    例如,对于`content://`类型的`Uri`,通常需要查询`ContentResolver`获取真实路径。 - 如果是`file://`类型的`Uri`,则可以直接解析成文件路径。 6. 文件选择器: - 自定义文件选择器可以使用`TreeView`、`...

Global site tag (gtag.js) - Google Analytics