原因
調用系統拍照應用,拍照后要保存圖片,那么我們需要指定一個存儲圖片路徑的Uri。這就涉及到如何將file path轉換為Uri。有時候我們還需要根據照片的路徑得到照片的media Uri,那么又該如何轉換呢?
Android Uri to Path
現在遇到的常規Uri有兩種:
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。有需要用到時,可以查閱文檔。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。
|
新聞熱點
疑難解答