今天,简单讲讲android里如何通过文件的Uri获取文件的路径url。

昨天,我讲了如何调用手机的文件管理器获取文件资源,但是文件管理器返回的是文件的Uri,我们需要通过Uri获取文件的url才可以操作文件。昨天的博客虽然写了一种Uri转url的代码,但是我自己也没有很懂,于是在网上查找资料,最终解决了问题。这里记录一下。


一.简易版处理(实际并没发现有什么问题)

public static String getRealPathFromURI(Context context, Uri contentURI) {   String result;   Cursor cursor = context.getContentResolver().query(contentURI,         new String[]{MediaStore.Images.ImageColumns.DATA},//         null, null, null);   if (cursor == null) result = contentURI.getPath();   else {      cursor.moveToFirst();      int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);      result = cursor.getString(index);      cursor.close();   }   return result;}

简单讲讲,这种代码直接通过Uri使用contentProvider获取数据库的文件的url,网上说android 4.4后这种代码是有问题的,但是我没有测试,大家可以测试看看。


2.复杂版处理

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());   } }
简单讲讲,这种代码对android4.4之前和之后做了分别的处理,在android 4.4后又根据url的类型,如ExternalStorageProvider,DownloadsProvider,MediaProvider分别进行处理。具体怎么处理,上面写的很清楚。这个代码比较全面,建议大家使用。


顺便讲讲url转Uri,这个绝对路径转Uri比较简单

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

Uri.fromFile(file)


android 根据文件Uri获取图片url就讲完了。


就这么简单。

更多相关文章

  1. Android(安卓)Studio 基础 之 简单获取手机端所有图片
  2. Android下使用TCP/IP协议实现断点上传
  3. android 文件存储调试细节(小米系统)
  4. 05Android学习从零单排之Androidmultimedia(多媒体)
  5. Android(安卓)ID 理解
  6. [Android] Android制作自己的依赖库让别人引用(1)
  7. Android中数据文件解析(Json解析【从服务器端获取数据并且解析,显
  8. Android日志通过logcat实时输出至文件
  9. AndroidStudio NDK的接入FFmpeg填坑记

随机推荐

  1. 2010.12.14——— android 应用的自动更
  2. Google Android admob
  3. android图片闪烁或帧动画
  4. Mac下完全卸载干净Android Studio
  5. msm8916 lcd 相关调试点指导
  6. android studio 调试android源码
  7. Android编程权威指南(第二版)— 第10章挑战
  8. 【Android】TV端项目开发挖坑总结
  9. Android的关键的持久数据应该在onPause()
  10. 在学习android + opencv遇到的各种问题