Android4.4以上Uri转换成绝对路径的工具类

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