一、Android4.4版本以上Uri地址封装规范:

content://com.android.providers.media.documents/document/image%3A659

二、Android4.4版本以下Uri地址没被封装的,地址规范:

/storage/emulated/0/Pictures/07 绚彩夜拍.jpg

三、工具类代码实现:

  1. public class GetPathFromUri4kitkat {
  2. @SuppressLint("NewApi")
  3. public static String getPath(final Context context, final Uri uri) {
  4. final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
  5. // DocumentProvider
  6. if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {
  7. // ExternalStorageProvider
  8. if (isExternalStorageDocument(uri)) {
  9. final String docId = DocumentsContract.getDocumentId(uri);
  10. final String[] split = docId.split(":");
  11. final String type = split[0];
  12. if ("primary".equalsIgnoreCase(type)) {
  13. return Environment.getExternalStorageDirectory() + "/" + split[1];
  14. }
  15. // TODO handle non-primary volumes
  16. }
  17. // DownloadsProvider
  18. else if (isDownloadsDocument(uri)) {
  19. final String id = DocumentsContract.getDocumentId(uri);
  20. final Uri contentUri = ContentUris.withAppendedId(
  21. Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));
  22. return getDataColumn(context, contentUri, null, null);
  23. }
  24. // MediaProvider
  25. else if (isMediaDocument(uri)) {
  26. final String docId = DocumentsContract.getDocumentId(uri);
  27. final String[] split = docId.split(":");
  28. final String type = split[0];
  29. Uri contentUri = null;
  30. if ("image".equals(type)) {
  31. contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
  32. } else if ("video".equals(type)) {
  33. contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
  34. } else if ("audio".equals(type)) {
  35. contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
  36. }
  37. final String selection = "_id=?";
  38. final String[] selectionArgs = new String[] { split[1] };
  39. return getDataColumn(context, contentUri, selection, selectionArgs);
  40. }
  41. }
  42. // MediaStore (and general)
  43. else if ("content".equalsIgnoreCase(uri.getScheme())) {
  44. return getDataColumn(context, uri, null, null);
  45. }
  46. // File
  47. else if ("file".equalsIgnoreCase(uri.getScheme())) {
  48. return uri.getPath();
  49. }
  50. return null;
  51. }
  52. /**
  53. * Get the value of the data column for this Uri. This is useful for
  54. * MediaStore Uris, and other file-based ContentProviders.
  55. *
  56. * @param context
  57. *            The context.
  58. * @param uri
  59. *            The Uri to query.
  60. * @param selection
  61. *            (Optional) Filter used in the query.
  62. * @param selectionArgs
  63. *            (Optional) Selection arguments used in the query.
  64. * @return The value of the _data column, which is typically a file path.
  65. */
  66. public static String getDataColumn(Context context, Uri uri, String selection,
  67. String[] selectionArgs) {
  68. Cursor cursor = null;
  69. final String column = "_data";
  70. final String[] projection = { column };
  71. try {
  72. cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
  73. null);
  74. if (cursor != null && cursor.moveToFirst()) {
  75. final int column_index = cursor.getColumnIndexOrThrow(column);
  76. return cursor.getString(column_index);
  77. }
  78. } finally {
  79. if (cursor != null)
  80. cursor.close();
  81. }
  82. return null;
  83. }
  84. /**
  85. * @param uri
  86. *            The Uri to check.
  87. * @return Whether the Uri authority is ExternalStorageProvider.
  88. */
  89. public static boolean isExternalStorageDocument(Uri uri) {
  90. return "com.android.externalstorage.documents".equals(uri.getAuthority());
  91. }
  92. /**
  93. * @param uri
  94. *            The Uri to check.
  95. * @return Whether the Uri authority is DownloadsProvider.
  96. */
  97. public static boolean isDownloadsDocument(Uri uri) {
  98. return "com.android.providers.downloads.documents".equals(uri.getAuthority());
  99. }
  100. /**
  101. * @param uri
  102. *            The Uri to check.
  103. * @return Whether the Uri authority is MediaProvider.
  104. */
  105. public static boolean isMediaDocument(Uri uri) {
  106. return "com.android.providers.media.documents".equals(uri.getAuthority());
  107. }
  108. }

Android4.4以上Uri转换成绝对路径的工具类的更多相关文章

  1. Java中windows路径转换成linux路径等工具类

    项目中发现别人写好的操作系统相关的工具类: 我总结的类似相关博客:http://www.cnblogs.com/DreamDrive/p/4289860.html import java.net.In ...

  2. 数据库表转换成javaBean对象小工具

    package test.utils; import java.io.FileWriter;import java.io.IOException;import java.io.PrintWriter; ...

  3. 为什么要用Hibernate框架? 把SessionFactory,Session,Transcational封装成包含crud的工具类并且处理了事务,那不是用不着spring了?

    既然用Hibernate框架访问管理持久层,那为何又提到用Spring来管理以及整合Hibernate呢?把SessionFactory,Session,Transcational封装成包含crud的 ...

  4. 【游戏开发】Excel表格批量转换成CSV的小工具

    一.前言 在工作的过程中,我们有时可能会面临将Excel表格转换成CSV格式文件的需求.这尤其在游戏开发中体现的最为明显,策划的数据文档大多是一些Excel表格,且不说这些表格在游戏中读取的速度,但就 ...

  5. illustrator将图片转换成ai路径

    窗口->图像描摹 第一选择模式:彩色 第二步:调整颜色的数值 最后点击工具栏上的扩展按钮转成路径 搞定~

  6. px转换成bp单位的工具函数

    import {Dimensions} from 'react-native' //当前屏幕的高度 const deviceH = Dimensions.get('window').height // ...

  7. 调用jdbc已经写成的方法----jdbc工具类抽取方式三

    package jdbc_demo3; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.R ...

  8. 调用jdbc已经写成的方法----jdbc工具类抽取方式二

    先创建db.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/web08?useUnicode=true& ...

  9. 调用jdbc已经写成的方法----jdbc工具类抽取方式一

    package web09; /*获取连接和释放资源的方法 */ import java.sql.Connection; import java.sql.DriverManager; import j ...

随机推荐

  1. DOM节点是啥玩意?

    在 HTML DOM 中,所有事物都是节点.DOM 是被视为节点树的 HTML. DOM 节点 根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点: 整个文档是一个文档节点 ...

  2. pycharm下运行和调试scrapy项目

    1. 新建项目 默认在本地已经新建了一个scrapy爬虫项目 2. 打开项目 点击open à 选择刚刚那个本地的scrapy项目meijutt100 3. 项目结构 各个py文件的作用不作介绍,不懂 ...

  3. iPhone 3gs 5.0.1降級到4.3.3 昨晚搞定(有shsh備份)

    經過昨天白天一天的學習和準備,終於一次降級成功. 手機未降級時狀態: 無鎖港版   3GS 16G  固件:5.0.1  基帶:05.16.05 記錄且分享降級完整步驟: 準備以下軟件.工具 官網固件 ...

  4. MyEclipse 8.5安装Aptana

    Aptana简单介绍 Aptana是一个很强大,开源,专注于JavaScript的Ajax开发IDE它的特性包含:    1.JavaScript,JavaScript函数,HTML,CSS语言的Co ...

  5. redis 主从 及集群

    一.redis 主从架构 搭建redis 主从   (可以用一台主机,也可以两台主机) 环境准备: 一台服务器:192.168.206.6 操作系统:CentOS7.5 redis 版本: redis ...

  6. UNION(并集)集合运算

    在集合论中,两个集合(记为集合A和B)的并集是一个包含集合A和B中所有元素的集合.换句话说,如果一个元素属于任何一个输入集合,那么它也属于结果集. 在T-SQL中,UNION 集合运算可以将两个输入查 ...

  7. html5 虚拟键盘弹出挡住底部的输入框解决方案

    问题描述: 我们使用 h5 做移动网站开发时,如果文本框在页面的下方,当输入信息弹出的软键盘会将输入框挡住(Android 会有这个问题,IOS会自动将整个页面上移),IOS中软键盘关闭后,页面上移的 ...

  8. 【code】flex_进度条样式

    近期打算吧硬盘中的资料记录在博客中,实用的就当是个分享,无用的就当是个备份,还望大家不要见怪. 一共4个文件: JinDuTiaoItem.mxml: <?xml version="1 ...

  9. 从零開始学android&lt;Bitmap图形组件.四十七.&gt;

    android.graphics.Bitmap(位图)是Android手机中专门提供的用于操作图片资源的操作类,使用此类能够直接从资源文件之中进行图片资源的读取.而且对这些图片进行一些简单的改动. 经 ...

  10. POJ 1159 Palindrome(字符串变回文:LCS)

    POJ 1159 Palindrome(字符串变回文:LCS) id=1159">http://poj.org/problem? id=1159 题意: 给你一个字符串, 问你做少须要 ...