android 根据文件Uri获取图片url
今天,简单讲讲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相关推荐
- js 获取图片url的Blob值并预览
js 获取图片url的Blob值并预览 1)使用 XMLHttpRequest 对象获取图片url的Blob值 参考:https://www.cnblogs.com/tujia/p/6483255.h ...
- php 获取内容页图片,织梦DEDECMS内容页获取图片URL地址的方法
织梦DEDECMS内容页获取图片URL地址的方法 {dede:sql sql="select * from dede_uploads where arcid = ~id~"} [f ...
- android相册路径地址,Android拍照和相册获取图片路径
/** *调用系统相机 */ public voidstartCamera() { Intent intent =newIntent(MediaStore.ACTION_IMAGE_CAPTURE); ...
- android通过BitmapFactory.decodeFile获取图片bitmap报内存溢出的解决办法
android通过BitmapFactory.decodeFile获取图片bitmap报内存溢出的解决办法 原方法: public static Bitmap getSmallBitmap(Strin ...
- android根据拍摄url获取格式,Android如何通过URI获取文件路径示例代码
前言 最近在工作的过程中,遇到不同 Android 版本下 URI 采用不同方式来获取文件路径的问题. 因为需求的原因,要求拍照上传或者从相册中选择图片上传,而且图片是需要经过压缩的,大小不能超过2M ...
- android从本地相册获取图片uri三星手机适配问题
启动系统相册intent Intent intentFromGallery = new Intent(); if (android.os.Build.VERSION.SDK_INT >= and ...
- android本地视频封装uri,android – 从内容uri获取所拍摄视频的文件
我有一个方法如下: private String getRealPathFromUriForVideos(Uri selectedVideoUri) { String wholeID = Docume ...
- android代码修改mp3文件封面,android-从音频文件Uri获取专辑封面
我正在尝试从音频文件Uri中获取专辑封面,这是我的代码: // uri is the audio file uri public static Bitmap getSongCoverArt(Conte ...
- android listview网络图片,Android ListView从网络获取图片及文字显示
上一篇文章说的是ListView展示本地的图片以及文本,这一篇说一下如何从网络获取图片以及文本来显示.事实上,一般是先获取Josn或sml数据,然后解释显示.我们先从网上获取xml,然后对其进行解析, ...
最新文章
- haystack全文检索框架
- ccna考试真题及经验介绍
- CAD2015软件安装资料及教程
- nginx配置文件中location与root访问时的联系
- Java--对象内存布局
- html获取url参数值,js获取url中参数值的两种方法
- (89)FPGA写文件激励(fdisplay)
- Hdu 1496 Equations
- 从零开始学php 光盘,从零开始学PHP(第2版)(含DVD光盘1张)
- rust里面的柴油桶有什么用_一种柴油桶倒油装置的制作方法
- 已知自然常数e的泰勒展开式是_泰勒公式:微分学的顶峰 (数学分析 · 导数的应用 (2))...
- 怎么做应力应变曲线_浅析基桩低应变检测技术
- python 优点_python语言有什么优势
- Junit单元测试的基本编码步骤
- PDF Expert 2.5.13 极致的 PDF 阅读标注工作体验
- 耿建超英语语法---非谓语动词作主语
- 省赛 和 南京邀请赛总结
- 华为视频显示服务器异常,给予用户一份贴心|(数十份案例)APP异常界面与Toast产品设计落地...
- 康涅狄格大学计算机科学排名,康涅狄格大学的计算机科学排名,不可忽视的重点信息...
- python 冒泡排序 交换次数_(Python)交换排序(气泡排序、快速排序),冒泡排序...