`
zhy20045923
  • 浏览: 153381 次
  • 性别: 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获取真实路径

    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的相互转换方法

    下面小编就为大家带来一篇android图片文件的路径地址与Uri的相互转换方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

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

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

    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/*);...

    Android实现多级列表中的新建功能

    本文实例为大家分享了Android实现多级列表中的新建功能...回传的URI需要转化成真实路径 * 4.提交数据之后需要刷新列表 */ public class SectionNewActivity extends AppCompatActivity implements View.OnClickListen

    java-servlet-api.doc

    你可以把Servlet理解成Server上的applets,它被编译成字节码,这样它就可以被动态地载入并用效地扩展主机的处理能力。 Servlet与applets不同的地方是,它不运行在Web浏览器或其他图形化的用户界面上。Servlet通过...

    LifeStyle:Android调用系统拍摄,系统相册,剪裁

    无法直接根据快照返回的URI拿到图片,这是因为从安卓7.0开始,直接使用本地真实路径被认为是不安全的,会抛出FileUriExposedExCeption异常,此处就是基于这个功能去针对Android7.0进行操作。废话不多说,先把基本的...

    Android4.4 WebAPI实现拍照上传功能

    主要原因是android从4.4版本开始通过intent.ACTION_GET_CONTENT打开选择器后,getData()返回的URI没有包含真实的文件路径,而是像这样“content://com.android.providers.media.documents/document/image:1234”,以...

    Tomcat下发布JSP程序的N种方法

    JSP网站的发布最灵活的一种方式我们可以在Tomcat的conf目录下的的Servlet.xml文件中进行配置 在其Host标签内新建一...是URI的路径 Name="mysite" 是虚拟目录名 URI="mysite" 是真实的文件名 <br>页面访问:...

    DownloadManager

    无法从URI下载。 例如: 好处 任何包含确切文件路径的链接(例如: )都可以下载。 能够下载任何类型的文件。 在真实环境中测试并证明。 方法 下载文件的逻辑是: 检查带有http请求的链接,该链接是否有效。 获取...

    vue_cli_nginx:vue-cli 创建的项目,部署在 nginx 上的配置(包括配置缓存)

    # 需要指向下面的@rewrites,否则会出现vue的路由在nginx中刷新出现404 } # 对应上面的@rewrites,主要原因是路由的路径资源并不是一个真实的路径,所以无法找到具体的文件 # 因此需要rewrite到index.html中,然后...

    jsp内置对象的用法

    18 String getRealPath(String path) 返回一虚拟路径的真实路径 2.response对象 response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。 序号 方 法 说 明 ...

    GetPhotoDemo:头像上传

    GetPhotoDemo 最近做了几个商城,发现个人中心那,头像修改都是统一一种模式,调取...7.0之后 使用本地真实的Uri路径不安全,直接使用Uri.fromFile(file);会报FileUriExposedException异常 测试文字数据,测试成功

    ssh(structs,spring,hibernate)框架中的上传下载

     其中第16行通过类路径的映射方式,将sshfile.model类包目录下的所有领域对象的映射文件装载进来,在本文的例子里,它将装载进Tfile.hbm.xml映射文件。如果有多个映射文件需要声明,使用类路径映射方式显然比直接...

    jpivot学习总结.doc

    你一定要指定其中的各种关系 , 如果没有指定 , 就默认 Hierarchy 里面装的是来自立方体中的真实表 . 属性如下: 属性名 含义 name Hierarchy 的名称,该值可以为空,为空时表示 Hirearchy 的名字和 Dimension 的...

Global site tag (gtag.js) - Google Analytics