访问媒体内容

通过调用列出照片库或影集内容后,您的应用应存储媒体内容的 ID,而非返回的媒体内容本身。这是因为媒体项的内容 并且响应中包含的网址会在一段时间后过期。通过 媒体项 ID 是媒体项(如照片或视频)的唯一标识符 用户内容库中的内容

请注意,您的应用不应长时间缓存用户的照片或视频,但根据用例,您可以视需要存储或缓存媒体内容 ID 一段时间。另请注意,对用户数据的访问受隐私保护义务的约束。

所需的授权范围

如要访问媒体内容,您的应用必须请求至少以下一项: 授权范围。 对响应中所返回媒体内容的访问权限取决于您请求的范围。

  • photoslibrary.readonly 可允许访问用户账号中的所有媒体内容 库
  • photoslibrary.readonly.appcreateddata 仅允许访问应用创建的媒体内容

媒体项

mediaItem 表示已上传到 Google 相册媒体库的媒体内容(例如照片或视频),属于顶层对象,且其属性会因底层媒体类型而有所不同。

下表列出了 mediaItem 属性:

属性
id 用于标识对象的永久性固定 ID。
description Google 相册中显示的媒体内容说明。
baseUrl 用于访问原始字节。如需了解详情,请参阅基准网址
productUrl

指向 Google 相册内图片的链接。此链接开发者无法打开,只能由用户打开。网址指向 库。如果网址是从影集搜索中检索到的,则指向影集中的项。

mimeType 媒体内容的类型,有助于轻松识别媒体类型(例如:image/jpg)。
filename Google 相册应用中向用户显示的媒体内容文件名(位于内容的信息部分)。
mediaMetadata 因媒体的基础类型而异,例如 photovideo。 为减少负载,可使用字段掩码。
contributorInfo

仅当媒体内容位于此应用创建的共享影集中且用户已授予 photoslibrary.sharing 范围时,系统才会填充此字段。

包含有关添加此媒体的贡献者的信息 内容。有关详情,请参阅分享媒体内容

获取媒体内容

要检索媒体项,请调用 mediaItems.get,使用 mediaItemId。请求将返回单项媒体内容。

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

照片媒体内容的响应如下所示。照片 属性包含照片内容的元数据。

{
  "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
}

获取多项媒体内容

如需按标识符检索多项媒体内容,请使用 mediaItemId 调用 mediaItems.batchGet

该请求会返回 MediaItemResults 按照请求中提供的媒体内容标识符的顺序进行排列。每条结果 包含 MediaItem 如果出现错误,则返回 Status

一次调用中最多可请求 50 项媒体内容。 媒体内容不得包含重复的标识符,也不得为空。

REST

以下 GET 请求展示了成功访问和未成功访问媒体内容的情况。它将每项媒体内容的标识符指定为新的 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 Photos Library API 中的基准网址,您可以访问媒体内容的字节。利用各类基准网址,您的应用可以下载媒体内容或展示其媒体内容。基准网址是列出影集或访问媒体内容时,响应中所包含的字符串。它们分别是 有效期为 60 分钟,并且需要额外的参数,因为它们不能用作 。

基准网址包括以下类别:

  • 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 的字节,请串联 包含下载视频“dv”的“baseUrl” 参数。

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 px(宽)x 720 px(高),并且不包含播放按钮叠加层:

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

动态照片基准网址

动态照片同时包含照片和视频元素。您可以使用 图片基准网址或 用于动态照片 baseUrl 请求的视频基准网址

参数
dv

说明

如需检索动态照片媒体项的视频元素,请使用 dv 参数,就像您从视频基准网址下载一样。

whcd

说明

如需检索动态照片媒体内容的照片元素,请使用图片基准网址的格式。