通过调用列出照片库或影集内容后,您的应用应存储媒体内容的 ID,而非返回的媒体内容本身。这是因为媒体内容可能会发生变化,并且响应中包含的网址会在一段时间后过期。媒体内容 ID 是媒体内容(例如用户媒体库内的照片或视频)的唯一标识。
请注意,您的应用不应长时间缓存用户的照片或视频,但根据用例,您可以视需要存储或缓存媒体内容 ID 一段时间。另请注意,对用户数据的访问受隐私权义务的约束。
所需的授权范围
如需访问媒体内容,您的应用必须至少请求以下一项授权范围。对响应中所返回媒体内容的访问权限取决于您请求的范围。
photoslibrary.readonly
允许访问用户媒体库中的所有媒体内容photoslibrary.readonly.appcreateddata
仅允许访问该应用创建的媒体内容
媒体项
mediaItem
表示已上传到 Google 相册媒体库的媒体内容(例如照片或视频)。属于顶层对象,且其属性会因底层媒体类型而有所不同。
下表列出了 mediaItem
属性:
属性 | |
---|---|
id |
用于标识对象的永久性固定 ID。 |
description |
Google 相册中显示的媒体内容说明。 |
baseUrl |
用于访问原始字节。如需了解详情,请参阅基准网址。 |
productUrl |
指向 Google 相册内图片的链接。此链接开发者无法打开,只能由用户打开。网址指向媒体库中的媒体内容。如果网址是从影集搜索中检索到的,则指向影集中的项。 |
mimeType |
媒体内容的类型,有助于轻松识别媒体类型(例如:image/jpg )。 |
filename |
Google 相册应用中向用户显示的媒体内容文件名(位于内容的信息部分)。 |
mediaMetadata |
因媒体的基础类型(如 photo 或 video )而异。为减少负载,可使用字段掩码。
|
contributorInfo |
仅当媒体内容位于此应用创建的共享影集中且用户已授予 包含与添加此媒体内容的贡献者相关的信息。有关详情,请参阅分享媒体内容。 |
获取媒体内容
如需检索媒体内容,请使用 mediaItemId
调用 mediaItems.get。请求将返回单项媒体内容。
mediaItem
包含各项属性,例如 ID、说明和网址。photo
或 video
中的其他信息基于文件内的元数据。并非所有属性均存在。ContributorInfo
包含共享影集所含内容的元数据。只有在用户向其授予 photoslibrary.sharing
授权范围的共享影集的内容列出内容时,才会包含此字段。
如果媒体内容是视频,则必须先处理视频文件。mediaItem
的 mediaMetadata
中包含 status
字段,用于描述视频文件的处理状态。新上传的文件首先会返回值为 PROCESSING
的 videoProcessingStatus
,然后才能成为 READY
状态,以待使用。只有在处理完视频后,视频媒体内容的 baseUrl
才可用。
以下是一个 GET 请求:
GET https://photoslibrary.googleapis.com/v1/mediaItems/media-item-id Content-type: application/json Authorization: Beareroauth2-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 "
}
}
照片属性包含照片内容的元数据。
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
}
照片属性包含照片内容的元数据。
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 项媒体内容。媒体内容列表不得包含重复的标识符,也不得为空。
以下 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: Beareroauth2-token
GET 请求会返回以下响应:
{
"mediaItemResults": [
{
"mediaItem": {
"id": "media-item-id ",
...
}
},
{
"mediaItem": {
"id": "another-media-item-id ",
...
}
},
{
"status": {
"code": 3,
"message": "Invalid media item ID."
}
}
]
}
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
}
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
所有者的个人资料照片。
映像基准网址
以下是可与图片基准网址搭配使用的选项列表:
参数 | |
---|---|
w ,h |
说明 宽度参数 如需访问图片媒体内容(例如照片或视频缩略图),您必须指定计划在应用中显示的尺寸(以便在保留宽高比的同时将图片调整到相应尺寸)。为此,请将基准网址与所需的尺寸进行连接,如示例所示。 示例:
以下示例显示宽度不超过 2048 px 且高度不超过 1024 px 的媒体内容: https://lh3.googleusercontent.com/p/AF....VnnY=w2048-h1024 |
c |
说明 剪裁参数 如果要将图片剪裁为您指定的确切宽度和高度,请将基准网址与可选的 大小(以像素为单位)应在 [1, 16383] 范围内。如果图片的宽度或高度超过所请求的尺寸,则对其进行缩放和剪裁(保持宽高比)。 示例:
在此示例中,应用显示的媒体内容尺寸恰好为 256 px(宽)x 256 px(高),正如以下缩略图的尺寸: https://lh3.googleusercontent.com/p/AF....VnnY=w256-h256-c |
d |
说明 下载参数 如要下载保留除位置元数据之外所有 Exif 元数据的图片,请将基准网址与 示例:
在此示例中,应用会下载一张图片,其中包含除位置元数据之外的所有元数据: https://lh3.googleusercontent.com/p/Az....XabC=d |
视频基准网址
以下是可与视频基准网址一起使用的参数选项列表:
参数 | |
---|---|
dv |
说明 如需访问视频 dv 参数请求获取经过转码的原始视频的高品质版本。该参数与 w 和 h 参数不兼容。 视频下载的基本网址最多可能需要几秒钟才能返回字节。 在使用此参数之前,请检查媒体内容项的 示例:
以下示例展示了如何下载视频的字节: https://lh3.googleusercontent.com/p/AF....BsdZ=dv |
w 、h 、c 和 d |
说明 如需访问视频的缩略图,请使用任意图片基准网址参数。 默认情况下,所有视频缩略图都包含播放按钮叠加层。如需移除此叠加层,请参阅 -no 参数。 示例: 如需查看示例,请参阅图片基准网址表格。 |
no |
说明 移除了缩略图叠加层 如果您想检索不带播放按钮叠加层的视频缩略图,请将基准网址与 no 参数进行连接。 no 参数必须与至少一个图片基准网址参数搭配使用。 示例:
以下示例显示的视频缩略图正好为 1280 px(宽)x 720 px(高),并且不包含播放按钮叠加层: https://lh3.googleusercontent.com/p/AF....VnnY=w1280-h720-no |