Android中Uri和Path之间的转换的示例代码
Android中Uri和Path之间的转换
原因
调用系统拍照应用,拍照后要保存图片,那么我们需要指定一个存储图片路径的Uri。这就涉及到如何将filepath转换为Uri。有时候我们还需要根据照片的路径得到照片的mediaUri,那么又该如何转换呢?
AndroidUritoPath
现在遇到的常规Uri有两种:
- 媒体文件的Uri是content://,表示这是一个数据库数据。去数据库查询正常返回。
- 其他的文件Uri是file://,表示这个是一个文件。这个uri是通过Uri.fromFile(Filefile)方法生成。
MediaUriToPath
在我简书中有一篇文章AndroidUritoPath当中介绍了如何把从相册返回的Uri转换为MediaUri,然后再通过获得的MediaUri获取图片的Path。最终通过BitmapFractory创建相应的Bitmap对象。
FileUriToPath
这个转换相对比较简单,我们可以直接利用AndroidSDK提供的Uri.getPath()方法来获取相应的路径,然后利用JavaIO来获取输入流,创建Bitmap。如果想直接通过FileUri获取输入流,我们可以通过调用ContentResolves.openInputStream(Uriuri)返回得到输入流。
bitmap=BitmapFactory.decodeStream( getContentResolver().openInputStream( GetImageUri.getImageStreamFromExternal("Screenshots/Screenshot.png")) );
这里的GetImageUri.getImageStreamFromExternal是我自己写的一个工具类:
publicstaticUrigetImageStreamFromExternal(StringimageName){ FileexternalPubPath=Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES ); FilepicPath=newFile(externalPubPath,imageName); Uriuri=null; if(picPath.exists()){ uri=Uri.fromFile(picPath); } returnuri; }
通过该静态方法可以将外部存储路径下的Pictures目录下的文件的路径转换为FileUri。
AndroidPathToUri
FilePathToFileUri
直接上代码:
publicstaticUrigetImageStreamFromExternal(StringimageName){ FileexternalPubPath=Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES ); FilepicPath=newFile(externalPubPath,imageName); Uriuri=null; if(picPath.exists()){ uri=Uri.fromFile(picPath); } returnuri; }
这里我们看到,最核心的部分就是利用Uri.fromFile()方法获取到指定路径的FileUri。
FilePathToMediaUri
直接上代码:
publicstaticUrigetMediaUriFromPath(Contextcontext,Stringpath){ UrimediaUri=MediaStore.Images.Media.EXTERNAL_CONTENT_URI; Cursorcursor=context.getContentResolver().query(mediaUri, null, MediaStore.Images.Media.DISPLAY_NAME+"=?", newString[]{path.substring(path.lastIndexOf("/")+1)}, null); Uriuri=null; if(cursor.moveToFirst()){ uri=ContentUris.withAppendedId(mediaUri, cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media._ID))); } cursor.close(); returnuri; }
代码分析:首先我们获取到相册数据库表的Uri,mediaUri。然后我们利用ContentResolver.query()方法,并且selectionArgs传入根据指定路径获得的文件名来得到一个cursor对象。然后通过这个cursor对象我们获取到指定文件的ID。最后通过ContentUri组合mediaUri和图片的Id,得到最终的MediaUri。
MediaStore
这个类很重要,官方文档介绍:TheMediaprovidercontainsmetadataforallavailablemediaonbothinternalandexternalstoragedevices.意思大概是该类包含了所有在设备的内部存储和外部存储的媒体文件的元数据。例如通过指定MediaStore.ACTION_IMAGE_CAPTURE为action的Intent可以打开系统相机,MediaStore.EXTRA_OUTPUT是指定存储Uri的键...
渣渣英语翻译,见谅...总之这个类在访问媒体文件时很重要。
还有一些对应数据库表列名,android.provider.MediaStore.MediaColumns中DATA指的是文件路径,DISPLAY_NAME代表文件名...还有android.provider.BaseColumns中_ID就是媒体文件的ID。有需要用到时,可以查阅文档。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。