Android中Uri和Path之間的轉(zhuǎn)換的示例代碼
Android中Uri和Path之間的轉(zhuǎn)換
原因
調(diào)用系統(tǒng)拍照應(yīng)用,拍照后要保存圖片,那么我們需要指定一個(gè)存儲(chǔ)圖片路徑的Uri。這就涉及到如何將file path轉(zhuǎn)換為Uri。有時(shí)候我們還需要根據(jù)照片的路徑得到照片的media Uri,那么又該如何轉(zhuǎn)換呢?
Android Uri to Path
現(xiàn)在遇到的常規(guī)Uri有兩種:
- 媒體文件的Uri是content://, 表示這是一個(gè)數(shù)據(jù)庫(kù)數(shù)據(jù)。去數(shù)據(jù)庫(kù)查詢正常返回。
- 其他的文件Uri是file://, 表示這個(gè)是一個(gè)文件。這個(gè)uri是通過Uri.fromFile(File file)方法生成。
Media Uri To Path
在我簡(jiǎn)書中有一篇文章Android Uri to Path當(dāng)中介紹了如何把從相冊(cè)返回的Uri轉(zhuǎn)換為Media Uri,然后再通過獲得的Media Uri獲取圖片的Path。最終通過BitmapFractory創(chuàng)建相應(yīng)的Bitmap對(duì)象。
File Uri To Path
這個(gè)轉(zhuǎn)換相對(duì)比較簡(jiǎn)單,我們可以直接利用Android SDK提供的Uri.getPath()方法來獲取相應(yīng)的路徑,然后利用Java IO來獲取輸入流,創(chuàng)建Bitmap。如果想直接通過File Uri獲取輸入流,我們可以通過調(diào)用ContentResolves.openInputStream(Uri uri)返回得到輸入流。
bitmap = BitmapFactory.decodeStream( getContentResolver().openInputStream( GetImageUri.getImageStreamFromExternal("Screenshots/Screenshot.png")) );
這里的GetImageUri.getImageStreamFromExternal是我自己寫的一個(gè)工具類:
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; }
通過該靜態(tài)方法可以將外部存儲(chǔ)路徑下的Pictures目錄下的文件的路徑轉(zhuǎn)換為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; }
代碼分析:首先我們獲取到相冊(cè)數(shù)據(jù)庫(kù)表的Uri,mediaUri。然后我們利用ContentResolver.query()方法,并且selectionArgs傳入根據(jù)指定路徑獲得的文件名來得到一個(gè)cursor對(duì)象。然后通過這個(gè)cursor對(duì)象我們獲取到指定文件的ID。最后通過ContentUri組合mediaUri和圖片的Id,得到最終的Media Uri。
MediaStore
這個(gè)類很重要,官方文檔介紹:The Media provider contains meta data for all available media on both internal and external storage devices.意思大概是該類包含了所有在設(shè)備的內(nèi)部存儲(chǔ)和外部存儲(chǔ)的媒體文件的元數(shù)據(jù)。例如通過指定MediaStore.ACTION_IMAGE_CAPTURE為action的Intent可以打開系統(tǒng)相機(jī),MediaStore.EXTRA_OUTPUT是指定存儲(chǔ)Uri的鍵...
渣渣英語(yǔ)翻譯,見諒...總之這個(gè)類在訪問媒體文件時(shí)很重要。
還有一些對(duì)應(yīng)數(shù)據(jù)庫(kù)表列名,android.provider.MediaStore.MediaColumns中DATA指的是文件路徑,DISPLAY_NAME代表文件名...還有android.provider.BaseColumns中_ID就是媒體文件的ID。有需要用到時(shí),可以查閱文檔。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
android 使用 IJKPlayer 播放視頻流的實(shí)現(xiàn)代碼
這篇文章主要介紹了android 使用 IJKPlayer 播放視頻流,這需要借助 IAndroidIO 這個(gè)接口,也可以用于播放本地文件,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11Android Tween動(dòng)畫之RotateAnimation實(shí)現(xiàn)圖片不停旋轉(zhuǎn)效果實(shí)例介紹
Android中如何使用rotate實(shí)現(xiàn)圖片不停旋轉(zhuǎn)的效果,下面與大家共同分析下Tween動(dòng)畫的rotate實(shí)現(xiàn)旋轉(zhuǎn)效果,感興趣的朋友可以參考下哈2013-05-05Android自定義多節(jié)點(diǎn)進(jìn)度條顯示的實(shí)現(xiàn)代碼(附源碼)
這篇文章主要介紹了Android自定義多節(jié)點(diǎn)進(jìn)度條顯示的實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03Android Studio快捷鍵生成TAG、Log.x日志輸出介紹
這篇文章主要介紹了Android Studio快捷鍵生成TAG、Log.x日志輸出介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04Android仿微博個(gè)人詳情頁(yè)滾動(dòng)到頂部的實(shí)例代碼
這篇文章主要介紹了Android仿微博個(gè)人詳情頁(yè)滾動(dòng)到頂部的實(shí)例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒家,需要的朋友可以參考下2019-05-05使用Kotlin開發(fā)Android應(yīng)用的初體驗(yàn)
本篇文章主要介紹了使用Kotlin開發(fā)Android應(yīng)用的初體驗(yàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05Android 自定義View實(shí)現(xiàn)單擊和雙擊事件的方法
下面小編就為大家?guī)硪黄狝ndroid 自定義View實(shí)現(xiàn)單擊和雙擊事件的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09Android Studio3.6.3 當(dāng)前最新版本數(shù)據(jù)庫(kù)查找與導(dǎo)出方法(圖文詳解)
這篇文章主要介紹了Android Studio3.6.3 當(dāng)前最新版本數(shù)據(jù)庫(kù)查找與導(dǎo)出方法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04android?微信搶紅包工具AccessibilityService實(shí)現(xiàn)詳解
這篇文章主要為大家介紹了android?微信搶紅包工具AccessibilityService實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Androidstudio調(diào)用攝像頭拍照并保存照片
這篇文章主要為大家詳細(xì)介紹了Androidstudio調(diào)用攝像頭拍照并保存照片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03