国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android中Uri和Path之間的轉換的示例代碼

2019-10-22 18:12:39
字體:
來源:轉載
供稿:網友

AndroidUriPath之間的轉換

原因

調用系統拍照應用,拍照后要保存圖片,那么我們需要指定一個存儲圖片路徑的Uri。這就涉及到如何將file path轉換為Uri。有時候我們還需要根據照片的路徑得到照片的media Uri,那么又該如何轉換呢?

Android Uri to Path

現在遇到的常規Uri有兩種:

  1. 媒體文件的Uri是content://, 表示這是一個數據庫數據。去數據庫查詢正常返回。
  2. 其他的文件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

這個類很重要,官方文檔介紹: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武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鲁山县| 彰化市| 福贡县| 额尔古纳市| 化德县| 通山县| 太和县| 福贡县| 澎湖县| 乌拉特中旗| 嘉义县| 安多县| 达尔| 伊宁市| 兴安县| 汝州市| 攀枝花市| 齐齐哈尔市| 伊金霍洛旗| 卢龙县| 阿图什市| 禄劝| 民乐县| 旅游| 大新县| 古田县| 天全县| 昌宁县| 乌什县| 巩义市| 上饶市| 汤原县| 莱州市| 利川市| 朝阳区| 南皮县| 永仁县| 印江| 民丰县| 阳春市| 哈巴河县|