今天,简单讲讲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就讲完了。

就这么简单。



android 根据文件Uri获取图片url相关推荐

  1. js 获取图片url的Blob值并预览

    js 获取图片url的Blob值并预览 1)使用 XMLHttpRequest 对象获取图片url的Blob值 参考:https://www.cnblogs.com/tujia/p/6483255.h ...

  2. php 获取内容页图片,织梦DEDECMS内容页获取图片URL地址的方法

    织梦DEDECMS内容页获取图片URL地址的方法 {dede:sql sql="select * from dede_uploads where arcid = ~id~"} [f ...

  3. android相册路径地址,Android拍照和相册获取图片路径

    /** *调用系统相机 */ public voidstartCamera() { Intent intent =newIntent(MediaStore.ACTION_IMAGE_CAPTURE); ...

  4. android通过BitmapFactory.decodeFile获取图片bitmap报内存溢出的解决办法

    android通过BitmapFactory.decodeFile获取图片bitmap报内存溢出的解决办法 原方法: public static Bitmap getSmallBitmap(Strin ...

  5. android根据拍摄url获取格式,Android如何通过URI获取文件路径示例代码

    前言 最近在工作的过程中,遇到不同 Android 版本下 URI 采用不同方式来获取文件路径的问题. 因为需求的原因,要求拍照上传或者从相册中选择图片上传,而且图片是需要经过压缩的,大小不能超过2M ...

  6. android从本地相册获取图片uri三星手机适配问题

    启动系统相册intent Intent intentFromGallery = new Intent(); if (android.os.Build.VERSION.SDK_INT >= and ...

  7. android本地视频封装uri,android – 从内容uri获取所拍摄视频的文件

    我有一个方法如下: private String getRealPathFromUriForVideos(Uri selectedVideoUri) { String wholeID = Docume ...

  8. android代码修改mp3文件封面,android-从音频文件Uri获取专辑封面

    我正在尝试从音频文件Uri中获取专辑封面,这是我的代码: // uri is the audio file uri public static Bitmap getSongCoverArt(Conte ...

  9. android listview网络图片,Android ListView从网络获取图片及文字显示

    上一篇文章说的是ListView展示本地的图片以及文本,这一篇说一下如何从网络获取图片以及文本来显示.事实上,一般是先获取Josn或sml数据,然后解释显示.我们先从网上获取xml,然后对其进行解析, ...

最新文章

  1. haystack全文检索框架
  2. ccna考试真题及经验介绍
  3. CAD2015软件安装资料及教程
  4. nginx配置文件中location与root访问时的联系
  5. Java--对象内存布局
  6. html获取url参数值,js获取url中参数值的两种方法
  7. (89)FPGA写文件激励(fdisplay)
  8. Hdu 1496 Equations
  9. 从零开始学php 光盘,从零开始学PHP(第2版)(含DVD光盘1张)
  10. rust里面的柴油桶有什么用_一种柴油桶倒油装置的制作方法
  11. 已知自然常数e的泰勒展开式是_泰勒公式:微分学的顶峰 (数学分析 · 导数的应用 (2))...
  12. 怎么做应力应变曲线_浅析基桩低应变检测技术
  13. python 优点_python语言有什么优势
  14. Junit单元测试的基本编码步骤
  15. PDF Expert 2.5.13 极致的 PDF 阅读标注工作体验
  16. 耿建超英语语法---非谓语动词作主语
  17. 省赛 和 南京邀请赛总结
  18. 华为视频显示服务器异常,给予用户一份贴心|(数十份案例)APP异常界面与Toast产品设计落地...
  19. 康涅狄格大学计算机科学排名,康涅狄格大学的计算机科学排名,不可忽视的重点信息...
  20. python 冒泡排序 交换次数_(Python)交换排序(气泡排序、快速排序),冒泡排序...

热门文章

  1. CentOS bug修复指令集(阿里云漏洞修复方法)
  2. python-IDE的使用(小白先看)
  3. HDU 6249 Alice’s Stamps(dp)
  4. DedeCMS生成首页html静态文件的教程
  5. 团队开发个人总结05
  6. 雷军反击董明珠:感觉董总好像认输了似的
  7. android 开发时遇到的环境问题3--eclipse整个项目工程报错
  8. vue脚手架安装步骤vue-cli
  9. MUI 支付宝支付接入
  10. Zmodem transfer canceled by remote side