之前在需要使用mediastore时,总结一下:
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
在此提供一个博客地址:android 使用mediastore获取手机上的文件
https://blog.csdn.net/yann02/article/details/92844364