Android之根据Uri获得图片或视频文件路径(解决4.4以上版本得不到路径的情况)

来源:互联网 发布:浙江高考数据网 编辑:程序博客网 时间:2024/05/29 15:13
  1. @SuppressLint("NewApi")  
  2. public class UriUtils {  
  3.       
  4.     /**   
  5.      * Get a file path from a Uri. This will get the the path for Storage Access   
  6.      * Framework Documents, as well as the _data field for the MediaStore and   
  7.      * other file-based ContentProviders.   
  8.      *   
  9.      * @param context The context.   
  10.      * @param uri The Uri to query.   
  11.      */    
  12.     public static String getPath(final Context context, final Uri uri) {    
  13.         
  14.         final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;    
  15.         
  16.         // DocumentProvider    
  17.         if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {    
  18.             // ExternalStorageProvider    
  19.             if (isExternalStorageDocument(uri)) {    
  20.                 final String docId = DocumentsContract.getDocumentId(uri);    
  21.                 final String[] split = docId.split(":");    
  22.                 final String type = split[0];    
  23.         
  24.                 if ("primary".equalsIgnoreCase(type)) {    
  25.                     return Environment.getExternalStorageDirectory() + "/" + split[1];    
  26.                 }    
  27.         
  28.                 // TODO handle non-primary volumes    
  29.             }    
  30.             // DownloadsProvider    
  31.             else if (isDownloadsDocument(uri)) {    
  32.         
  33.                 final String id = DocumentsContract.getDocumentId(uri);    
  34.                 final Uri contentUri = ContentUris.withAppendedId(    
  35.                         Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));    
  36.         
  37.                 return getDataColumn(context, contentUri, null, null);    
  38.             }    
  39.             // MediaProvider    
  40.             else if (isMediaDocument(uri)) {    
  41.                 final String docId = DocumentsContract.getDocumentId(uri);    
  42.                 final String[] split = docId.split(":");    
  43.                 final String type = split[0];    
  44.         
  45.                 Uri contentUri = null;    
  46.                 if ("image".equals(type)) {    
  47.                     contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;    
  48.                 } else if ("video".equals(type)) {    
  49.                     contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;    
  50.                 } else if ("audio".equals(type)) {    
  51.                     contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;    
  52.                 }    
  53.         
  54.                 final String selection = "_id=?";    
  55.                 final String[] selectionArgs = new String[] {    
  56.                         split[1]    
  57.                 };    
  58.         
  59.                 return getDataColumn(context, contentUri, selection, selectionArgs);    
  60.             }    
  61.         }    
  62.         // MediaStore (and general)    
  63.         else if ("content".equalsIgnoreCase(uri.getScheme())) {    
  64.             return getDataColumn(context, uri, null, null);    
  65.         }    
  66.         // File    
  67.         else if ("file".equalsIgnoreCase(uri.getScheme())) {    
  68.             return uri.getPath();    
  69.         }    
  70.         
  71.         return null;    
  72.     }    
  73.         
  74.     /**   
  75.      * Get the value of the data column for this Uri. This is useful for   
  76.      * MediaStore Uris, and other file-based ContentProviders.   
  77.      *   
  78.      * @param context The context.   
  79.      * @param uri The Uri to query.   
  80.      * @param selection (Optional) Filter used in the query.   
  81.      * @param selectionArgs (Optional) Selection arguments used in the query.   
  82.      * @return The value of the _data column, which is typically a file path.   
  83.      */    
  84.     public static String getDataColumn(Context context, Uri uri, String selection,    
  85.             String[] selectionArgs) {    
  86.         
  87.         Cursor cursor = null;    
  88.         final String column = "_data";    
  89.         final String[] projection = {    
  90.                 column    
  91.         };    
  92.         
  93.         try {    
  94.             cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,    
  95.                     null);    
  96.             if (cursor != null && cursor.moveToFirst()) {    
  97.                 final int column_index = cursor.getColumnIndexOrThrow(column);    
  98.                 return cursor.getString(column_index);    
  99.             }    
  100.         } finally {    
  101.             if (cursor != null)    
  102.                 cursor.close();    
  103.         }    
  104.         return null;    
  105.     }    
  106.         
  107.         
  108.     /**   
  109.      * @param uri The Uri to check.   
  110.      * @return Whether the Uri authority is ExternalStorageProvider.   
  111.      */    
  112.     public static boolean isExternalStorageDocument(Uri uri) {    
  113.         return "com.android.externalstorage.documents".equals(uri.getAuthority());    
  114.     }    
  115.         
  116.     /**   
  117.      * @param uri The Uri to check.   
  118.      * @return Whether the Uri authority is DownloadsProvider.   
  119.      */    
  120.     public static boolean isDownloadsDocument(Uri uri) {    
  121.         return "com.android.providers.downloads.documents".equals(uri.getAuthority());    
  122.     }    
  123.         
  124.     /**   
  125.      * @param uri The Uri to check.   
  126.      * @return Whether the Uri authority is MediaProvider.   
  127.      */    
  128.     public static boolean isMediaDocument(Uri uri) {    
  129.         return "com.android.providers.media.documents".equals(uri.getAuthority());    
  130.     }    
  131.   
  132. }  
阅读全文
0 0
原创粉丝点击