Android Uri to Path

现在遇到的常规Uri有两种:

  • 媒体文件的Uri是content://, 表示这是一个数据库数据。去数据库查询正常返回。
  • 其他的文件Uri是file://, 表示这个是一个文件。这个uri是通过Uri.fromFile(File file)方法生成。

Media Uri To Path

在我简书中有一篇文章Android Uri to Path当中介绍了如何把从相册返回的Uri转换为Media Uri,然后再通过获得的Media Uri获取图片的Path。最终通过BitmapFractory创建相应的Bitmap对象。

File Uri To Path

这个转换相对比较简单,我们可以直接利用Android SDK提供的Uri.getPath()方法来获取相应的路径,然后利用Java IO来获取输入流,创建Bitmap。如果想直接通过File Uri获取输入流,我们可以通过调用ContentResolves.openInputStream(Uri uri)返回得到输入流。

bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(GetImageUri.getImageStreamFromExternal("Screenshots/Screenshot.png")));

这里的GetImageUri.getImageStreamFromExternal是我自己写的一个工具类:


public static Uri getImageStreamFromExternal(String imageName) {File externalPubPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);File picPath = new File(externalPubPath, imageName);Uri uri = null;if(picPath.exists()) {uri = Uri.fromFile(picPath);}return uri;}

通过该静态方法可以将外部存储路径下的Pictures目录下的文件的路径转换为File Uri。

Android Path To Uri

File Path To File Uri

直接上代码:

public static Uri getImageStreamFromExternal(String imageName) {File externalPubPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);File picPath = new File(externalPubPath, imageName);Uri uri = null;if(picPath.exists()) {uri = Uri.fromFile(picPath);}return uri;}

这里我们看到,最核心的部分就是利用Uri.fromFile()方法获取到指定路径的File Uri。

File Path To Media Uri

直接上代码:

public static Uri getMediaUriFromPath(Context context, String path) {Uri mediaUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;Cursor cursor = context.getContentResolver().query(mediaUri,null,MediaStore.Images.Media.DISPLAY_NAME + "= ?",new String[] {path.substring(path.lastIndexOf("/") + 1)},null);Uri uri = null;if(cursor.moveToFirst()) {uri = ContentUris.withAppendedId(mediaUri,cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media._ID)));}cursor.close();return uri;}

代码分析:首先我们获取到相册数据库表的Uri,mediaUri。然后我们利用ContentResolver.query()方法,并且selectionArgs传入根据指定路径获得的文件名来得到一个cursor对象。然后通过这个cursor对象我们获取到指定文件的ID。最后通过ContentUri组合mediaUri和图片的Id,得到最终的Media Uri。

MediaStore

这个类很重要,官方文档介绍:The Media provider contains meta data for all available media on both internal and external storage devices.意思大概是该类包含了所有在设备的内部存储和外部存储的媒体文件的元数据。例如通过指定MediaStore.ACTION_IMAGE_CAPTURE为action的Intent可以打开系统相机,MediaStore.EXTRA_OUTPUT是指定存储Uri的键...

渣渣英语翻译,见谅...总之这个类在访问媒体文件时很重要。

还有一些对应数据库表列名,android.provider.MediaStore.MediaColumns中DATA指的是文件路径,DISPLAY_NAME代表文件名...还有android.provider.BaseColumns中_ID就是媒体文件的ID。有需要用到时,可以查阅文档。

参考

Android File Uri的转换path

[Android] URI那些事

作者:FoolishDev
链接:https://www.jianshu.com/p/33bc363290e9
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Android中Uri 和Path之间的相互转化相关推荐

  1. Android中Uri和Path之间的转换

    Android Uri to Path 现在遇到的常规Uri有两种: 媒体文件的Uri是content://, 表示这是一个数据库数据.去数据库查询正常返回 其他的文件Uri是file://, 表示这 ...

  2. Android中Uri和path file三者的相互转换

    一.path转file File file = new File(path); 二.path转uri Uri uri = Uri.parse(path); 三.uri转path /*** 将URI路径 ...

  3. Android中Uri的使用

    1.Uri 通用资源标志符(Universal Resource Identifier, 简称"URI"). Uri代表要操作的数据,Android上可用的每种资源 - 图像.视频 ...

  4. Android中URI的格式

    在Android中,为了使用数据集中管理模式,使用了ContentProvider来进行数据管理,在使用ContentProvider进行 数据交互时就需要用到URI.为了让客户端程序能够使用你的数据 ...

  5. android中uri的作用,Android UrlUri详细解析

    概述 在项目开发中,有时会遇到解析Url.Uri的需求,要从中得到链接中的相应字段.参数等.有多种实现方式,在这里总结一下应用到的. URL与URI的区别 Uri - 统一资源标志符 Url - 统一 ...

  6. linux和安卓交互,Android中webview和js之间的交互及注意事项

    1.Android中利用webview调用网页上的js代码. Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true ...

  7. android中matrix的单位,Android中canvas和matrix之间的关系是什么?

    我读了这个画布概述: The Canvas class holds the "draw" calls. To draw something, you need 4 basic co ...

  8. 【Android 界面效果10】Android中View,ViewGroup,Window之间的关系

    一.首先说说View和ViewGroup吧 Android系统中的所有UI类都是建立在View和ViewGroup这两个类的基础上的.所有View的子类成为"Widget",所有V ...

  9. Android中BroadCast与Activity之间的通信

    在看本文之前,假设你对于Android的广播机制不是非常了解.建议先行阅读我转载的一篇博文:图解 Android 广播机制. 因为本案例比較简单,故直接在此贴出代码,不做过多的阐述. 先上效果截图: ...

最新文章

  1. 自制反汇编逆向分析工具 迭代第六版本 (二)
  2. mac 完全卸载android,关于macos:如何在Mac上完全卸载Android Studio?
  3. 【C#】解析C#中JSON.NET的使用
  4. 华北科技学院计算机期末考试,华北科技学院 专业计算机 考试专用
  5. [地产]“用90%的时间考虑失败”——李嘉诚(长江实业集团董事长)
  6. 计算机网络中seq,计算机网络A卷及参考答案
  7. django框架 day07
  8. 2021会宁三中高考成绩查询,2020白银中考分数线
  9. 使用gson和fastjson来解析json
  10. SOA的关键是什么?
  11. 财经管理中的计算机应用 课后答案,财经管理中的计算机应用
  12. 【爬虫实战】自制属于你自己的在线翻译程序 - 爬取 360 在线翻译(教学 + 实践)
  13. 2011年美国大学招生广告
  14. 【sklearn-cookbook-zh】第一章 模型预处理
  15. 滴滴出行小程序体积优化实践
  16. python:文件写入出现ASII编码
  17. 深度学习之梯度裁剪(Gradient Clipping)
  18. Pluecker coordinates普吕克坐标系介绍
  19. Java基础知识梳理
  20. ags infoWindow 应用

热门文章

  1. React Navigation——底部导航栏设计
  2. 需求文档(PRD文档)应该怎么写?
  3. HTML实现简单的注册页面
  4. Python使用try...except...输出详细错误
  5. Photoshop鼠绘精美手机详细教程
  6. Calendar的基本使用和属性说明
  7. Jetpack Compose——Text(文本)的使用
  8. 云效安全那些事儿-Codeup代码智能安全检测服务
  9. 三个等于号===与两个等于号==
  10. window cmd 创建文本文件