溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在Android中實(shí)現(xiàn)Uri與Path之間的轉(zhuǎn)換

發(fā)布時(shí)間:2021-02-24 16:13:44 來(lái)源:億速云 閱讀:659 作者:戴恩恩 欄目:移動(dòng)開(kāi)發(fā)

這篇文章主要介紹了如何在Android中實(shí)現(xiàn)Uri與Path之間的轉(zhuǎn)換,億速云小編覺(jué)得不錯(cuò),現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨億速云小編來(lái)看看吧!

Android是什么

Android是一種基于Linux內(nèi)核的自由及開(kāi)放源代碼的操作系統(tǒng),主要使用于移動(dòng)設(shè)備,如智能手機(jī)和平板電腦,由美國(guó)Google公司和開(kāi)放手機(jī)聯(lián)盟領(lǐng)導(dǎo)及開(kāi)發(fā)。

Android Uri to Path

現(xiàn)在遇到的常規(guī)Uri有兩種:

  1. 媒體文件的Uri是content://, 表示這是一個(gè)數(shù)據(jù)庫(kù)數(shù)據(jù)。去數(shù)據(jù)庫(kù)查詢正常返回。

  2. 其他的文件Uri是file://, 表示這個(gè)是一個(gè)文件。這個(gè)uri是通過(guò)Uri.fromFile(File file)方法生成。

Media Uri To Path

在我簡(jiǎn)書(shū)中有一篇文章Android Uri to Path當(dāng)中介紹了如何把從相冊(cè)返回的Uri轉(zhuǎn)換為Media Uri,然后再通過(guò)獲得的Media Uri獲取圖片的Path。最終通過(guò)BitmapFractory創(chuàng)建相應(yīng)的Bitmap對(duì)象。

File Uri To Path

這個(gè)轉(zhuǎn)換相對(duì)比較簡(jiǎn)單,我們可以直接利用Android SDK提供的Uri.getPath()方法來(lái)獲取相應(yīng)的路徑,然后利用Java IO來(lái)獲取輸入流,創(chuàng)建Bitmap。如果想直接通過(guò)File Uri獲取輸入流,我們可以通過(guò)調(diào)用ContentResolves.openInputStream(Uri uri)返回得到輸入流。

bitmap = BitmapFactory.decodeStream(
          getContentResolver().openInputStream(
              GetImageUri.getImageStreamFromExternal("Screenshots/Screenshot.png"))
      );

這里的GetImageUri.getImageStreamFromExternal是我自己寫(xiě)的一個(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;
  }

通過(guò)該靜態(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ù)指定路徑獲得的文件名來(lái)得到一個(gè)cursor對(duì)象。然后通過(guò)這個(gè)cursor對(duì)象我們獲取到指定文件的ID。最后通過(guò)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ù)。例如通過(guò)指定MediaStore.ACTION_IMAGE_CAPTURE為action的Intent可以打開(kāi)系統(tǒng)相機(jī),MediaStore.EXTRA_OUTPUT是指定存儲(chǔ)Uri的鍵...

渣渣英語(yǔ)翻譯,見(jiàn)諒...總之這個(gè)類在訪問(wèn)媒體文件時(shí)很重要。

還有一些對(duì)應(yīng)數(shù)據(jù)庫(kù)表列名,android.provider.MediaStore.MediaColumns中DATA指的是文件路徑,DISPLAY_NAME代表文件名...還有android.provider.BaseColumns中_ID就是媒體文件的ID。

以上就是億速云小編為大家收集整理的如何在Android中實(shí)現(xiàn)Uri與Path之間的轉(zhuǎn)換,如何覺(jué)得億速云網(wǎng)站的內(nèi)容還不錯(cuò),歡迎將億速云網(wǎng)站推薦給身邊好友。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI