中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Android中實現Uri與Path之間的轉換

發布時間:2021-02-24 16:13:44 來源:億速云 閱讀:663 作者:戴恩恩 欄目:移動開發

這篇文章主要介紹了如何在Android中實現Uri與Path之間的轉換,億速云小編覺得不錯,現在分享給大家,也給大家做個參考,一起跟隨億速云小編來看看吧!

Android是什么

Android是一種基于Linux內核的自由及開放源代碼的操作系統,主要使用于移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯盟領導及開發。

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。

以上就是億速云小編為大家收集整理的如何在Android中實現Uri與Path之間的轉換,如何覺得億速云網站的內容還不錯,歡迎將億速云網站推薦給身邊好友。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

北碚区| 周口市| 清苑县| 涿州市| 虞城县| 牟定县| 陇川县| 东港市| 浮梁县| 育儿| 桃园县| 融水| 盐源县| 涟水县| 恩平市| 伊吾县| 玉山县| 明光市| 永城市| 阿克陶县| 项城市| 青龙| 吉林省| 前郭尔| 固镇县| 锡林浩特市| 建始县| 苍山县| 张掖市| 温泉县| 饶平县| 蚌埠市| 永昌县| 东宁县| 乌拉特前旗| 泰来县| 科技| 阜城县| 高雄县| 大埔县| 重庆市|