地點相片

您可以使用 Places SDK for Android 要求在應用程式中顯示地點相片。相片服務傳回的相片取自各種來源,包括業主和使用者提供的相片。如要擷取地點的圖片,請務必採取下列步驟:

  1. 使用 Place Details 擷取 Place 物件 (使用 fetchPlace()findCurrentPlace())。請務必在要加進回應 Place 物件的欄位清單中加入 Place.Field PHOTO_METADATAS 欄位。
  2. FetchPlaceResponseFindCurrentPlaceResponseOnSuccessListener 中:
    1. 使用 Place.getPhotoMetadas() 從回應 Place 物件取得類型為 PhotoMetadata 的相片中繼資料物件。
    2. 建立 FetchPhotoRequest 物件,並視需要指定高度和寬度上限 (以像素為單位)。相片的寬度或高度上限為 1600 像素。
    3. 使用 PlacesClient.fetchPhoto() 要求相片。
    4. 新增 OnSuccessListener 並從 FetchPhotoResponse 取得相片。

存取 3.3.0 版中新增的 PhotoMetadata 資料

Places SDK for Android (新版) 會將 AuthorAttributions 欄位新增至 PhotoMetadata 類別。如果應用程式啟用新的 SDK,Place.getPhotoMetadas() 傳回的 PhotoMetadata 物件就會包含一或多個作者屬性。

如果 PhotoMetadata 物件含有任何作者資訊,無論是 3.3.0 版中新增的新作者作者資訊,還是 3.2.0 以下版本中的現有作者資訊,都必須在相片中顯示。如要進一步瞭解如何處理所有類型的歸因,請參閱「歸因」。

如要在 PhotoMetadata 物件中填入作者作者資訊,您必須:

  1. 設定 Google Cloud 專案時啟用新的 SDK。
  2. 在活動或片段中初始化新的 SDK
  3. Place.Field.PHOTO_METADATAS 加入 Place Details 要求的欄位清單。
  4. 呼叫 PlacesClient.fetchPlace() 即可取得 Place 物件,呼叫 Place.getPhotoMetadas() 即可取得 PhotoMetadata 物件。PlacesClient.findCurrentPlace() 不支援作者出處欄位。
  5. 使用 PhotoMetadata.getAuthorAttributions() 取得作者作者資訊。

取得地點相片

下例示範如何取得地點相片。

Kotlin



// Define a Place ID.
val placeId = "INSERT_PLACE_ID_HERE"

// Specify fields. Requests for photos must always have the PHOTO_METADATAS field.
val fields = listOf(Place.Field.PHOTO_METADATAS)

// Get a Place object (this example uses fetchPlace(), but you can also use findCurrentPlace())
val placeRequest = FetchPlaceRequest.newInstance(placeId, fields)

placesClient.fetchPlace(placeRequest)
    .addOnSuccessListener { response: FetchPlaceResponse ->
        val place = response.place

        // Get the photo metadata.
        val metada = place.photoMetadatas
        if (metada == null || metada.isEmpty()) {
            Log.w(TAG, "No photo metadata.")
            return@addOnSuccessListener
        }
        val photoMetadata = metada.first()

        // Get the attribution text.
        val attributions = photoMetadata?.attributions

        // Create a FetchPhotoRequest.
        val photoRequest = FetchPhotoRequest.builder(photoMetadata)
            .setMaxWidth(500) // Optional.
            .setMaxHeight(300) // Optional.
            .build()
        placesClient.fetchPhoto(photoRequest)
            .addOnSuccessListener { fetchPhotoResponse: FetchPhotoResponse ->
                val bitmap = fetchPhotoResponse.bitmap
                imageView.setImageBitmap(bitmap)
            }.addOnFailureListener { exception: Exception ->
                if (exception is ApiException) {
                    Log.e(TAG, "Place not found: " + exception.message)
                    val statusCode = exception.statusCode
                    TODO("Handle error with given status code.")
                }
            }
    }

      

Java


// Define a Place ID.
final String placeId = "INSERT_PLACE_ID_HERE";

// Specify fields. Requests for photos must always have the PHOTO_METADATAS field.
final List<Place.Field> fields = Collections.singletonList(Place.Field.PHOTO_METADATAS);

// Get a Place object (this example uses fetchPlace(), but you can also use findCurrentPlace())
final FetchPlaceRequest placeRequest = FetchPlaceRequest.newInstance(placeId, fields);

placesClient.fetchPlace(placeRequest).addOnSuccessListener((response) -> {
    final Place place = response.getPlace();

    // Get the photo metadata.
    final List<PhotoMetadata> metadata = place.getPhotoMetadatas();
    if (metadata == null || metadata.isEmpty()) {
        Log.w(TAG, "No photo metadata.");
        return;
    }
    final PhotoMetadata photoMetadata = metadata.get(0);

    // Get the attribution text.
    final String attributions = photoMetadata.getAttributions();

    // Create a FetchPhotoRequest.
    final FetchPhotoRequest photoRequest = FetchPhotoRequest.builder(photoMetadata)
        .setMaxWidth(500) // Optional.
        .setMaxHeight(300) // Optional.
        .build();
    placesClient.fetchPhoto(photoRequest).addOnSuccessListener((fetchPhotoResponse) -> {
        Bitmap bitmap = fetchPhotoResponse.getBitmap();
        imageView.setImageBitmap(bitmap);
    }).addOnFailureListener((exception) -> {
        if (exception instanceof ApiException) {
            final ApiException apiException = (ApiException) exception;
            Log.e(TAG, "Place not found: " + exception.getMessage());
            final int statusCode = apiException.getStatusCode();
            // TODO: Handle error with given status code.
        }
    });
});

      

歸因

在大多數情況下,使用地點相片時可以不用加上作者資訊,圖片本身也可能已加入必要的作者資訊。然而,類型為 PhotoMetadata 的相片中繼資料物件可以包含以下兩種額外的作者資訊:

如果傳回的 PhotoMetadata 物件包含任一類歸因,您每次顯示圖片時都必須在應用程式中加入作者資訊。詳情請參閱「顯示屬性」。

用量與計費

針對向 fetchPhoto() 發出的呼叫,系統會視為 Places Photo SKU 來計費。詳情請參閱用量與計費頁面。