首页 > 系统 > Android > 正文

Android Uri和文件路径互相转换的实例代码

2019-12-12 02:29:51
字体:
来源:转载
供稿:网友

在项目中需要用到将Uri转换为绝对路径,在网上找到一个方法,做个笔记

网上有不少方法,但是有的对4.4后的版本无效,这里的方法可以在4.4之后的版本将Uri转换为绝对路径

public class GetPathFromUri {   /**    * 专为Android4.4设计的从Uri获取文件绝对路径    */   public static String getPath(final Context context, final Uri uri) {     final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;     // DocumentProvider     if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {       // ExternalStorageProvider       if (isExternalStorageDocument(uri)) {         final String docId = DocumentsContract.getDocumentId(uri);         final String[] split = docId.split(":");         final String type = split[0];         if ("primary".equalsIgnoreCase(type)) {           return Environment.getExternalStorageDirectory() + "/" + split[1];         }       }       // DownloadsProvider       else if (isDownloadsDocument(uri)) {         final String id = DocumentsContract.getDocumentId(uri);         final Uri contentUri = ContentUris.withAppendedId(             Uri.parse("content://downloads/public_downloads"), Long.valueOf(id));         return getDataColumn(context, contentUri, null, null);       }       // MediaProvider       else if (isMediaDocument(uri)) {         final 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]};         return getDataColumn(context, contentUri, selection, selectionArgs);       }     }     // MediaStore (and general)     else if ("content".equalsIgnoreCase(uri.getScheme())) {       return getDataColumn(context, uri, null, null);     }     // File     else if ("file".equalsIgnoreCase(uri.getScheme())) {       return uri.getPath();     }     return null;   }   /**    * Get the value of the data column for this Uri. This is useful for    * MediaStore Uris, and other file-based ContentProviders.    *    * @param context    The context.    * @param uri      The Uri to query.    * @param selection   (Optional) Filter used in the query.    * @param selectionArgs (Optional) Selection arguments used in the query.    * @return The value of the _data column, which is typically a file path.    */   public 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;   }   /**    * @param uri The Uri to check.    * @return Whether the Uri authority is ExternalStorageProvider.    */   public static boolean isExternalStorageDocument(Uri uri) {     return "com.android.externalstorage.documents".equals(uri.getAuthority());   }   /**    * @param uri The Uri to check.    * @return Whether the Uri authority is DownloadsProvider.    */   public static boolean isDownloadsDocument(Uri uri) {     return "com.android.providers.downloads.documents".equals(uri.getAuthority());   }   /**    * @param uri The Uri to check.    * @return Whether the Uri authority is MediaProvider.    */   public static boolean isMediaDocument(Uri uri) {     return "com.android.providers.media.documents".equals(uri.getAuthority());   } } 

绝对路径转Uri比较简单

以绝对路径创建一个File对象,然后调用

Uri.fromFile(file)

以上所述是小编给大家介绍的Android Uri和文件路径互相转换的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对武林网网站的支持!

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表