Android中Uri和Path之间的转换的示例代码
作者:FoolishDev 时间:2022-01-25 10:22:48
Android中Uri和Path之间的转换
原因
调用系统拍照应用,拍照后要保存图片,那么我们需要指定一个存储图片路径的Uri。这就涉及到如何将file path转换为Uri。有时候我们还需要根据照片的路径得到照片的media Uri,那么又该如何转换呢?
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。有需要用到时,可以查阅文档。
来源:https://www.jianshu.com/p/33bc363290e9
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
c# 网络编程之tcp
Java 中的 clone( ) 和 new哪个效率更高
![](https://img.aspxhome.com/file/2023/6/59326_0s.png)
Java读取properties配置文件的8种方式汇总
![](https://img.aspxhome.com/file/2023/9/96079_0s.png)
Android实现拼图小游戏
![](https://img.aspxhome.com/file/2023/6/93326_0s.jpg)
C#SuperSocket的搭建并配置启动总结
![](https://img.aspxhome.com/file/2023/6/89756_0s.png)
C/C++根据年月日计算星期几(蔡勒公式篇)
Java中List集合去重方法以及效率对比
Andriod studio 打包aar 的方法
Java获取时间打印到控制台代码实例
![](https://img.aspxhome.com/file/2023/7/96087_0s.png)
Android中NestedScrolling滑动机制详解
![](https://img.aspxhome.com/file/2023/9/106059_0s.png)
自己实现Android View布局流程
Java经典设计模式之模板方法模式定义与用法示例
Android Java调用自己C++类库的实例讲解
Jenkins自动化打包为war包
![](https://img.aspxhome.com/file/2023/2/103992_0s.jpg)
Java获取字符串编码格式实现思路
Ubuntu安装jdk8常用方法流程解析
关于SpringMVC在Controller层方法的参数解析详解
C# 9.0 新特性之模式匹配简化的实现
用java等语言仿360首页拼音输入全模糊搜索和自动换肤
![](https://img.aspxhome.com/file/2023/4/74934_0s.jpg)
IDEA2020如何打开Run Dashboard的方法步骤
![](https://img.aspxhome.com/file/2023/4/119144_0s.png)