• 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. }  
  • 相关阅读:
    dubbo
    maven
    vue
    SSM框架整合
    MyBatis数据表注解开发
    MyBatis多表操作xml方式
    MyBatis映射配置文件
    Mybatis核心配置文件,传统开发和代理开发(主流)
    SpringMVC高级
    SpringMVC基础
  • 原文地址:https://www.cnblogs.com/ouyangxiaoyao/p/9088704.html
Copyright © 2020-2023  润新知