Android Uri to Path

现在遇到的常规Uri有两种:

  • 媒体文件的Uri是content://, 表示这是一个数据库数据。去数据库查询正常返回

  • 其他的文件Uri是file://, 表示这个是一个文件。这个uri是通过Uri.fromFile(File file)方法生成。

直接上代码

package com.xinmang.videoeffect.utils;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.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.support.v4.content.FileProvider;import com.xinmang.videoeffect.app.MainApplication;import java.io.File;public class UriTool {public static String getFilePathByUri(Context context, Uri uri) {String path = null;String scheme = uri.getScheme();// 以 file:// 开头的if (ContentResolver.SCHEME_FILE.equals(uri.getScheme())) {path = uri.getPath();return path;}// 以 content:// 开头的,比如 content://media/extenral/images/media/17766if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()) && Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {Cursor cursor = context.getContentResolver().query(uri, new String[]{MediaStore.Images.Media.DATA}, null, null, null);if (cursor != null) {if (cursor.moveToFirst()) {int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);if (columnIndex > -1) {path = cursor.getString(columnIndex);}}cursor.close();}return path;}// 4.4及之后的 是以 content:// 开头的,比如 content://com.android.providers.media.documents/document/image%3A235700if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme()) && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {if (DocumentsContract.isDocumentUri(context, uri)) {if (isExternalStorageDocument(uri)) {// ExternalStorageProviderfinal String docId = DocumentsContract.getDocumentId(uri);final String[] split = docId.split(":");final String type = split[0];if ("primary".equalsIgnoreCase(type)) {path = Environment.getExternalStorageDirectory() + "/" + split[1];return path;}} else if (isDownloadsDocument(uri)) {// DownloadsProviderfinal String id = DocumentsContract.getDocumentId(uri);final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(id));path = getDataColumn(context, contentUri, null, null);return path;} else if (isMediaDocument(uri)) {// MediaProviderfinal 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]};path = getDataColumn(context, contentUri, selection, selectionArgs);return path;}} else if ("content".equalsIgnoreCase(uri.getScheme())) {// Return the remote addressif (isGooglePhotosUri(uri))return uri.getLastPathSegment();if (isQQMediaDocument(uri)) {String paths = uri.getPath();File fileDir = Environment.getExternalStorageDirectory();File file = new File(fileDir, paths.substring("/QQBrowser".length(), paths.length()));return file.exists() ? file.toString() : null;}return getDataColumn(context, uri, null, null);} else if ("file".equalsIgnoreCase(uri.getScheme())) {return uri.getPath();}else if (ContentResolver.SCHEME_CONTENT.equals(scheme)) {//微信文件打开的uripath = uri.getPath();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N&& path != null && path.startsWith("/external")) {return new File(Environment.getExternalStorageDirectory().getAbsolutePath()+ path.replace("/external", "")).getPath();} else {String[] paths = uri.getPath().split("/0/");if (paths.length == 2) {return Environment.getExternalStorageDirectory() + "/" + paths[1];}}} else {String[] paths = uri.getPath().split("/0/");if (paths.length == 2) {return Environment.getExternalStorageDirectory() + "/" + paths[1];}}}return null;}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;}private static boolean isExternalStorageDocument(Uri uri) {return "com.android.externalstorage.documents".equals(uri.getAuthority());}private static boolean isDownloadsDocument(Uri uri) {return "com.android.providers.downloads.documents".equals(uri.getAuthority());}private static boolean isMediaDocument(Uri uri) {return "com.android.providers.media.documents".equals(uri.getAuthority());}public static Uri PathToUri(String path){Uri uri;if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {uri = Uri.fromFile(new File(path));} else {/*** 7.0 调用系统相机拍照不再允许使用Uri方式,应该替换为FileProvider* 并且这样可以解决MIUI系统上拍照返回size为0的情况*/uri = FileProvider.getUriForFile(MainApplication.getInstance(),  "com.xinmang.videoeffect.fileprovider", new File(path));}return uri;}/*** 使用第三方qq文件管理器打开** @param uri* @return*/public static boolean isQQMediaDocument(Uri uri) {return "com.tencent.mtt.fileprovider".equals(uri.getAuthority());}/*** @param uri The Uri to check.* @return Whether the Uri authority is Google Photos.*/public static boolean isGooglePhotosUri(Uri uri) {return "com.google.android.apps.photos.content".equals(uri.getAuthority());}
}

Android中Uri和Path之间的转换相关推荐

  1. Android中Uri 和Path之间的相互转化

    Android Uri to Path 现在遇到的常规Uri有两种: 媒体文件的Uri是content://, 表示这是一个数据库数据.去数据库查询正常返回. 其他的文件Uri是file://, 表示 ...

  2. Android中Uri和path file三者的相互转换

    一.path转file File file = new File(path); 二.path转uri Uri uri = Uri.parse(path); 三.uri转path /*** 将URI路径 ...

  3. java中各进制之间的转换(十进制转十六进制、十进制转二进制、二进制转十进制、二进制转十六进制)...

    在java编辑中有没有遇到经常需要进行java中各进制之间的转换(十进制转十六进制.十进制转二进制.二进制转十进制.二进制转十六进制)的事情呢?下面我们就来分析一下各自是怎么转换的: [java] / ...

  4. C#中char[]与string之间的转换

    C#中char[]与string之间的转换 原文:C#中char[]与string之间的转换 string 转换成 Char[] string ss = "abcdefg"; ch ...

  5. C++中数字与字符串之间的转换 scanf string总结(复习必读)

    1 string的scanf读入操作 C++里面控制台输入直接使用cin操作就可以了:或者getline(istringstream,string); 字符和数字加减就是字符的ASCII码和数字直接加 ...

  6. java子类和父类实例_java中父类与子类之间的转换示例

    java中父类与子类之间的转换示例有以下三点: 示例一 父类强制转子类 pre class="brush:php;toolbar:false">Father f = new ...

  7. pythonunicode和str_python2 中 unicode 和 str 之间的转换及与python3 str 的区别

    在python2中字符串分为 unicode 和 str 类型 Str To Unicode 使用decode(), 解码 Unicode To Str 使用encode(), 编码 返回数据给前端时 ...

  8. android中uri的作用,Android UrlUri详细解析

    概述 在项目开发中,有时会遇到解析Url.Uri的需求,要从中得到链接中的相应字段.参数等.有多种实现方式,在这里总结一下应用到的. URL与URI的区别 Uri - 统一资源标志符 Url - 统一 ...

  9. Android中Uri的使用

    1.Uri 通用资源标志符(Universal Resource Identifier, 简称"URI"). Uri代表要操作的数据,Android上可用的每种资源 - 图像.视频 ...

最新文章

  1. Typesetting Engine_ Presto
  2. 计算机网络·数据链路层.三个基本问题
  3. Jodd-vtor验证框架
  4. 如何去掉字符串最后的逗号?(亲测)
  5. 这样的递归调用,你看出来了?
  6. 内部类、包、修饰符、代码块
  7. 前端学习(2799):实现资讯的结构和列表
  8. Java 变量、数据类型
  9. linux 批量创建用户和删除用户
  10. 基于OpencCV的彩色图像的分离与合并
  11. 在asp.net中使用线程
  12. c 子类对象 访问父类对象受保护成员_面向对象的三大特征
  13. linux有许多sed进程,Linux进程与性能监控
  14. RHEL 6 配置yum源
  15. android 7 audio架构,7.2.1 Audio系统的各个层次
  16. 3.Linux性能诊断 --- 快速检查单(10个命令) 监控
  17. 【秋招毕业】自由奔赴的行者2021年终总结
  18. 什么是设计思维Design Thinking——风靡全球的创造力培养方法
  19. first season twenty-second episode,the color(yellow) dream???
  20. 问农事 - 菜蔬作物的节令

热门文章

  1. bash下的特殊符号与通配符
  2. oracle中scott用户的创建
  3. springsecurity总结
  4. C语言中的void和void指针-void*
  5. 单目摄像头检测输出 3D 边界框
  6. 修改HTK代码,让其支持中文
  7. 腾讯笔试算法题-开锁
  8. 软件质量有什么特性?
  9. oracle根据约束名查找具体信息,如是哪张表的哪个字段约束信息
  10. 刘利刚-什么是计算机图形学?