存取媒體項目

呼叫列出相片庫或相簿的內容後,應用程式應儲存媒體項目的 ID,而非儲存傳回的媒體項目。這是因為媒體項目的內容可能會變更,且在一段時間後,回應中包含的網址會過期。 媒體項目 ID 可用於識別相片或影片等媒體項目 在使用者介面中

請注意,應用程式不應長時間快取使用者的相片或影片,但視用途而定,您可以儲存或快取媒體項目 ID,時間長度視需要而定。您也應該注意,user 資料受隱私權規範 義務。

必要的授權範圍

如要存取媒體項目,應用程式必須至少要求下列其中一項 授權範圍。 您可以存取回應中傳回的媒體項目,取決於您要求的範圍。

  • photoslibrary.readonly 可存取使用者媒體庫中的所有媒體項目
  • photoslibrary.readonly.appcreateddata 僅允許存取符合以下條件的媒體項目: 是由應用程式建立

媒體項目

mediaItem 是媒體的表示法,例如已上傳至 Google 相簿相片庫的相片或影片。這是一個頂層物件,其屬性可以 會因基礎媒體類型而異

下表列出 mediaItem 屬性:

屬性
id 用來識別物件的永久固定 ID。
description 顯示於媒體項目的說明 Google 相簿
baseUrl 用於存取原始位元組。詳情請參閱「Base URLs」。
productUrl

連結至 Google 相簿中的圖片。開發人員無法開啟這個連結,只有使用者可以開啟。網址指向以下中的媒體項目: 程式庫。如果網址是從相簿搜尋中擷取,則會指向相簿中的項目。

mimeType 媒體項目的類型,可協助輕鬆識別媒體類型 (例如:image/jpg)。
filename 在 Google 相簿向使用者顯示的媒體項目檔案名稱 。
mediaMetadata 因媒體的基礎類型而異,例如 photovideo。 如要減少酬載,可以使用欄位遮罩。
contributorInfo

這個欄位只有在媒體項目位於共享相簿中時才會填入資料 ,且使用者已授予 photoslibrary.sharing 範圍。

包含新增此媒體項目的貢獻者相關資訊。詳情請參閱「分享媒體」。

取得媒體項目

如要擷取媒體項目,請使用 mediaItemId 呼叫 mediaItems.get。該要求會傳回單一媒體項目。

mediaItem 包含 ID、說明和網址等屬性。 photovideo 的其他資訊則是根據 檔案。可能不會顯示所有屬性。ContributorInfo 包含中繼資料 。只有在列出共用相簿的內容時,才會納入這個欄位,且使用者必須已授予 photoslibrary.sharing 授權範圍

如果媒體項目是影片,則必須先處理影片檔案。mediaItemmediaMetadata 中包含 status 欄位,用來說明影片檔案的處理狀態。最新上傳的檔案會傳回 videoProcessingStatus敬上 的值為 PROCESSING,然後才是 READY 使用。baseUrl 這是因為影片媒體項目在處理完成後才可供使用。

REST

以下是 GET 要求:

GET https://photoslibrary.googleapis.com/v1/mediaItems/media-item-id
Content-type: application/json
Authorization: Bearer oauth2-token

相片媒體項目的回應如下所示。photo 屬性包含相片項目的中繼資料。

{
  "id": "media-item-id",
  "description": "item-description",
  "productUrl": "url-to-open-in-google-photos",
  "baseUrl": "base-url_do-not-use-directly",
  "mimeType": "mime-type-of-media",
  "filename": "item-filename",
  "mediaMetadata": {
    "width": "media-item-width",
    "height": "media-item-height",
    "creationTime": "media-item-creation-time",
    "photo": {
       "cameraMake": "make-of-the-camera",
       "cameraModel": "model-of-the-camera",
       "focalLength": "focal-length-of-the-camera-lens",
       "apertureFNumber": "aperture-f-number-of-the-camera-lens",
       "isoEquivalent": "iso-of-the-camera",
       "exposureTime": "exposure-time-of-the-camera-aperture"
    }
  },
  "contributorInfo": {
    "profilePictureBaseUrl": "profile-picture-base-url_do-not-use-directly",
    "displayName": "name-of-user"
  }
}

影片媒體項目的回應如下所示。影片屬性包含影片項目的中繼資料。

{
  "id": "media-item-id",
  "description": "item-description",
  "productUrl": "url-to-open-in-google-photos",
  "baseUrl": "base-url_do-not-use-directly",
  "mimeType": "mime-type-of-media",
  "filename": "item-filename",
  "mediaMetadata": {
    "width": "media-item-width",
    "height": "media-item-height",
    "creationTime": "media-item-creation-time",
    "video": {
     "cameraMake": "make-of-the-camera",
     "cameraModel": "model-of-the-camera",
     "fps": "frame-rate-of-the-video",
     "status": "READY"
    },
  },
  "contributorInfo": {
    "profilePictureBaseUrl": "profile-picture-base-url_do-not-use-directly",
    "displayName": "name-of-user"
  }
}

Java

相片屬性包含相片項目的中繼資料。

try {
  // Get a media item using its ID
  String mediaItemId = "...";
  MediaItem item = photosLibraryClient.getMediaItem(mediaItemId);
  // Get some properties from the retrieved media item
  String id = item.getId();
  String description = item.getDescription();
  String baseUrl = item.getBaseUrl();
  String productUrl = item.getProductUrl();
  // ...
  if (item.hasMediaMetadata()) {
    // The media item contains additional metadata, such as the height and width
    MediaMetadata metadata = item.getMediaMetadata();
    long height = metadata.getHeight();
    long width = metadata.getWidth();
    Timestamp creationTime = metadata.getCreationTime();
    // ...
    if (metadata.hasPhoto()) {
      // This media item is a photo and has additional photo metadata
      Photo photoMetadata = metadata.getPhoto();
      String cameraMake = photoMetadata.getCameraMake();
      String cameraModel = photoMetadata.getCameraModel();
      float aperture = photoMetadata.getApertureFNumber();
      int isoEquivalent = photoMetadata.getIsoEquivalent();
      // ...
    }
  }
  if (item.hasContributorInfo()) {
    // A user has contributed this media item  to a shared album
    ContributorInfo contributorInfo = item.getContributorInfo();
    String profilePictureBaseUrl = contributorInfo.getProfilePictureBaseUrl();
    String displayName = contributorInfo.getDisplayName();
  }
} catch (ApiException e) {
  // Handle error
}

影片屬性包含影片項目的中繼資料。

try {
  // Get a media item using its ID
  String mediaItemId = "...";
  MediaItem item = photosLibraryClient.getMediaItem(mediaItemId);
  // Get some properties from the retrieved media item
  String id = item.getId();
  String description = item.getDescription();
  String baseUrl = item.getBaseUrl();
  String productUrl = item.getProductUrl();
  // ...
  if (item.hasMediaMetadata()) {
    // The media item contains additional metadata, such as the height and width
    MediaMetadata metadata = item.getMediaMetadata();
    long height = metadata.getHeight();
    long width = metadata.getWidth();
    Timestamp creationTime = metadata.getCreationTime();
    // ...

    if (metadata.hasVideo()) {
      // This media item is a video and has additional video metadata
      Video videoMetadata = metadata.getVideo();
      VideoProcessingStatus status = videoMetadata.getStatus();
      if (status.equals(VideoProcessingStatus.READY)) {
        // This video media item has been processed
        String cameraMake = videoMetadata.getCameraMake();
        String cameraModel = videoMetadata.getCameraModel();
        double fps = videoMetadata.getFps();
        // ...
      }
    }
  }

  if (item.hasContributorInfo()) {
    // A user has contributed this media item  to a shared album
    ContributorInfo contributorInfo = item.getContributorInfo();
    String profilePictureBaseUrl = contributorInfo.getProfilePictureBaseUrl();
    String displayName = contributorInfo.getDisplayName();
  }
} catch (ApiException e) {
  // Handle error
}

PHP

相片屬性包含相片項目的中繼資料。

try {
    // Get a media item using its ID
    $mediaItemId = "...";
    $item = $photosLibraryClient->getMediaItem($mediaItemId);
    // Get some properties from the retrieved media item
    $id = $item->getId();
    $description = $item->getDescription();
    $baseUrl = $item->getBaseUrl();
    $productUrl = $item->getProductUrl();
    // ...
    $metadata = $item->getMediaMetadata();
    if (!is_null($metadata)) {
        // The media item contains additional metadata, such as the height and width
        $height = $metadata->getHeight();
        $width = $metadata->getWidth();
        $creationTime = $metadata->getCreationTime();
        // ...
        $photoMetadata = $metadata->getPhoto();
        if (!is_null($photoMetadata)) {
            // This media item is a photo and has additional photo metadata
            $cameraMake = $photoMetadata->getCameraMake();
            $cameraModel = $photoMetadata->getCameraModel();
            $aperture = $photoMetadata->getApertureFNumber();
            $isoEquivalent = $photoMetadata->getIsoEquivalent();
            // ...
        }
    }
    $contributorInfo = $item->getContributorInfo();
    if (!is_null($contributorInfo)) {
        // A user has contributed this media item to a shared album
        $profilePictureBaseUrl = $contributorInfo->getProfilePictureBaseUrl();
        $displayName = $contributorInfo->getDisplayName();
    }
} catch (\Google\ApiCore\ApiException $e) {
    // Handle error
}

影片屬性包含影片項目的中繼資料。

  try {
    // Get a media item using its ID
    $mediaItemId = "...";
    $item = $photosLibraryClient->getMediaItem($mediaItemId);
    // Get some properties from the retrieved media item
    $id = $item->getId();
    $description = $item->getDescription();
    $baseUrl = $item->getBaseUrl();
    $productUrl = $item->getProductUrl();
    // ...
    $metadata = $item->getMediaMetadata();
    if (!is_null($metadata)) {
        // The media item contains additional metadata, such as the height and width
        $height = $metadata->getHeight();
        $width = $metadata->getWidth();
        $creationTime = $metadata->getCreationTime();
        // ...
        $videoMetadata = $metadata->getVideo();
        if (!is_null($videoMetadata)) {
            // This media item is a video and has additional video metadata
            if (VideoProcessingStatus::READY == $videoMetadata->getStatus()) {
            // This video media item has been processed
                $cameraMake = $videoMetadata->getCameraMake();
                $cameraModel = $videoMetadata->getCameraModel();
                $fps = $videoMetadata->getFps();
                // ...
            }
        }
    }
    $contributorInfo = $item->getContributorInfo();
    if (!is_null($contributorInfo)) {
        // A user has contributed this media item to a shared album
        $profilePictureBaseUrl = $contributorInfo->getProfilePictureBaseUrl();
        $displayName = $contributorInfo->getDisplayName();
    }
} catch (\Google\ApiCore\ApiException $e) {
    // Handle error
}

取得多個媒體項目

如要依 ID 擷取多個媒體項目,請呼叫 mediaItems.batchGet敬上 使用 mediaItemId

要求會依照要求中提供的媒體項目 ID 順序,傳回 MediaItemResults 清單。每筆結果 包含 MediaItem 如果發生錯誤,則會傳回 Status

一次呼叫中可要求的媒體項目數量上限為 50 個。請注意, 媒體項目不得包含重複的 ID,亦不得留空。

REST

以下是 GET 要求,顯示媒體項目的存取成功和失敗情況。在要求中指定每個媒體項目 ID 做為新的 mediaItemIds 查詢參數:

GET https://photoslibrary.googleapis.com/v1/mediaItems:batchGet?mediaItemIds=media-item-id&mediaItemIds=another-media-item-id&mediaItemIds=incorrect-media-item-id
Content-type: application/json
Authorization: Bearer oauth2-token

GET 要求會傳回以下回應:

{
  "mediaItemResults": [
    {
      "mediaItem": {
        "id": "media-item-id",
        ...
      }
    },
    {
      "mediaItem": {
        "id": "another-media-item-id",
        ...
      }
    },
    {
      "status": {
        "code": 3,
        "message": "Invalid media item ID."
      }
    }
  ]
}

Java

try {
  // List of media item IDs to retrieve
  List<String> mediaItemIds = Arrays
      .asList("MEDIA_ITEM_ID", "ANOTHER_MEDIA_ITEM_ID", "INCORRECT_MEDIA_ITEM_ID");

  // Get a list of media items using their IDs
  BatchGetMediaItemsResponse response = photosLibraryClient
      .batchGetMediaItems(mediaItemIds);

  // Loop over each result
  for (MediaItemResult result : response.getMediaItemResultsList()) {

    // Each MediaItemresult contains a status and a media item
    if (result.hasMediaItem()) {
      // The media item was successfully retrieved, get some properties
      MediaItem item = result.getMediaItem();
      String id = item.getId();
      // ...
    } else {
      // If the media item is not set, an error occurred and the item could not be loaded
      // Check the status and handle the error
      Status status = result.getStatus();
      // ...
    }

  }
} catch (ApiException e) {
  // Handle error
}

PHP

try {

    // List of media item IDs to retrieve
    $mediaItemIds = ["MEDIA_ITEM_ID", "ANOTHER_MEDIA_ITEM_ID", "INCORRECT_MEDIA_ITEM_ID"];

    // Get a list of media items using their IDs
    $response = $photosLibraryClient->batchGetMediaItems($mediaItemIds);

    // Loop over each result
    foreach ($response->getMediaItemResults() as $itemResult) {

        // Each MediaItemresult contains a status and a media item
        $mediaItem = $itemResult->getMediaItem();

        if(!is_null($mediaItem)){
            // The media item was successfully retrieved, get some properties
            $id = $mediaItem->getId();
            // ...
        } else {
            // If the media item is null, an error occurred and the item could not be loaded
        }
    }

} catch (\Google\ApiCore\ApiException $e) {
    // Handle error
}

基礎網址

Google 相簿程式庫 API 中的基礎網址可讓您存取媒體項目的位元組。應用程式可以使用各種基準網址,下載媒體項目 或在應用程式內顯示媒體項目。「基礎網址」是 附加在回應中。這些 效期為 60 分鐘,且需要額外的參數,因為無法將 不過,無論內部 IP 位址為何 DNS 名稱始終會指向特定的執行個體

各種基礎網址如下:

  • baseUrl:直接存取相片、影片縮圖或下載影片位元組。
  • coverPhotoBaseUrl:直接存取相簿的封面相片。
  • profilePictureBaseUrl:直接存取 mediaItem 擁有者的個人資料相片。

映像檔基本網址

以下是可與映像檔基本網址搭配使用的選項清單:

參數
wh

說明

寬度 w 和高度 h 參數。

如要存取圖片媒體項目,例如 則您必須指定要在影片廣告中顯示的尺寸 以便可以將圖片縮放為這些元件 同時保留長寬比)。如要這麼做,請將基準網址與所需尺寸連結,如範例所示。

例如:

base-url=wmax-width-hmax-height

以下範例說明如何顯示寬度不超過 2048 像素、高度不超過 1024 像素的媒體項目:

https://lh3.googleusercontent.com/p/AF....VnnY=w2048-h1024
c

說明

裁剪,c 參數。

如果您希望將圖片裁剪為確切的寬度和高度 將基準網址和 自選 -c 參數和必要的 wh 參數。

大小 (以像素為單位) 應介於 [1, 16383] 之間。如果有 圖片的寬度或高度,超過要求的大小, 縮小並裁剪圖片 (維持長寬比)。

例如:

base-url=wmax-width-hmax-height-c

在這個範例中,應用程式會顯示 正好為寬 256 像素、256 像素高,例如 縮圖:

https://lh3.googleusercontent.com/p/AF....VnnY=w256-h256-c
d

說明

下載,d 參數。

如果您想要下載保留所有 Exif 中繼資料的映像檔 除了位置中繼資料以外,請將基準網址和 d 參數。

例如:

base-url=d

在此範例中,應用程式會下載映像檔 ,但位置中繼資料除外:

https://lh3.googleusercontent.com/p/Az....XabC=d

影片基準網址

以下是可搭配影片基本網址使用的選項清單:

參數
dv

說明

如要存取影片 mediaItem 的位元組,請串連 與下載影片的 baseUrldv 參數。

dv 參數會要求原始影片的高品質轉碼版本。參數不是 與 wh 相容 參數。

影片下載的基本網址可能需要幾秒鐘的時間才能傳回位元組。

使用這個參數前,請檢查媒體項目的 mediaMetadata.status 欄位為 READY。 如果您的媒體項目沒有 處理完成後,您可能會收到 錯誤。

例如:

base-url=dv

以下範例說明如何下載影片的位元組:

https://lh3.googleusercontent.com/p/AF....BsdZ=dv
whcd

說明

如要查看影片縮圖,請使用任一圖片基本網址參數

根據預設,所有影片縮圖都會重疊在影片播放中 按鈕。查看 -no 參數即可移除這個疊加層。

例如:

如需範例,請參閱圖片基本網址表格

no

說明

移除縮圖疊加層 no 參數。

如果您希望擷取沒有重疊畫面的影片縮圖 (播放按鈕),使用 no 串連基準網址 參數。

no 參數必須至少與下列其中一項 這個 圖片基本網址參數

例如:

base-url=wmax-width-hmax-height-no

以下範例顯示的影片縮圖寬度和高度分別為 1280 像素和 720 像素,且不含播放按鈕重疊:

https://lh3.googleusercontent.com/p/AF....VnnY=w1280-h720-no

動態相片基本網址

動態相片同時包含相片和影片元素。您可以使用 映像檔基本網址或 動態相片 baseUrl 要求的影片基本網址

參數
dv

說明

如要擷取動態相片媒體項目的影片元素,請使用 dv 參數,與從影片基本網址下載相同。

whcd

說明

如要擷取動態相片媒體項目的相片元素,請使用 圖片基本網址的格式。