Android中Uri和Path之间的转换

     之前在需要使用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

 


 

你可能感兴趣的:(Android中Uri和Path之间的转换)