Bạn có thể sử dụng SDK Địa điểm dành cho Android để yêu cầu hiển thị ảnh địa điểm trong ứng dụng của mình. Ảnh do dịch vụ ảnh trả về đến từ nhiều nguồn, bao gồm cả chủ doanh nghiệp và ảnh do người dùng đóng góp.
Chọn định dạng ảnh
SDK Địa điểm dành cho Android hỗ trợ 2 định dạng cho ảnh được yêu cầu:
- All Places SDK dành cho phiên bản Android: Trả về hình ảnh bitmap. Hình ảnh bitmap có kích thước tối đa là 1600 x 1600 pixel.
- Địa điểm SDK dành cho Android (Mới) phiên bản 3.4 trở lên: Trả về một URI về hình ảnh bitmap. Hình ảnh bitmap có kích thước tối đa là 4800 x 4800 pixel.
Quy trình truy xuất ảnh
Để truy xuất hình ảnh cho một địa điểm:
- Sử dụng Place Details (Thông tin chi tiết về địa điểm) để tìm nạp đối tượng
Place
(sử dụngfetchPlace()
hoặcfindCurrentPlace()
). Hãy nhớ đưa trườngPlace.Field PHOTO_METADATAS
vào danh sách trường để đưa vào đối tượngPlace
phản hồi. - Trong
OnSuccessListener
dành choFetchPlaceResponse
hoặcFindCurrentPlaceResponse
của bạn:- Sử dụng
Place.getPhotoMetadas()
để lấy đối tượng siêu dữ liệu ảnh, thuộc loạiPhotoMetadata
từ đối tượngPlace
phản hồi. - Cách tải hình ảnh bitmap:
- Tạo một đối tượng
FetchPhotoRequest
, tuỳ ý chỉ định chiều cao và chiều rộng tối đa (tính bằng pixel). Ảnh có thể có chiều rộng hoặc chiều cao tối đa là 1600 px. - Dùng
PlacesClient.fetchPhoto()
để yêu cầu bitmap ảnh. - Thêm
OnSuccessListener
và lấy ảnh từFetchPhotoResponse
.
- Tạo một đối tượng
- Cách lấy URI ảnh:
- Tạo một đối tượng
FetchResolvedPhotoUriRequest
để thực hiện yêu cầu. Ảnh có thể có chiều rộng hoặc chiều cao tối đa là 4800 px. - Sử dụng
PlacesClient.fetchResolvedPhotoUri()
để yêu cầu URI ảnh. - Thêm
OnSuccessListener
và nhận URI ảnh từ đối tượngFetchResolvedPhotoUriResponse
.
- Tạo một đối tượng
- Sử dụng
Truy cập dữ liệu PhotoMetadata được thêm vào phiên bản 3.3.0 trở lên
SDK Địa điểm dành cho Android (Mới) sẽ thêm trường AuthorAttributions
vào lớp PhotoMetadata
. Nếu ứng dụng của bạn bật SDK mới, thì đối tượng PhotoMetadata
do Place.getPhotoMetadas()
trả về có thể chứa một hoặc nhiều thuộc tính tác giả.
Khi đối tượng PhotoMetadata
chứa bất kỳ thuộc tính nào, thì các thuộc tính tác giả mới được thêm vào phiên bản 3.3.0 hoặc các thuộc tính hiện có có sẵn trong phiên bản 3.2.0 trở xuống, bạn phải hiển thị các thuộc tính đó cùng với ảnh. Để biết thêm thông tin về cách xử lý mọi loại mô hình phân bổ, hãy xem bài viết Phân bổ.
Để điền sẵn thông tin ghi nhận tác giả cho đối tượng PhotoMetadata
, bạn phải:
- Bật SDK mới khi bạn Thiết lập dự án trên Google Cloud.
- Khởi chạy SDK mới trong một hoạt động hoặc mảnh.
- Đưa
Place.Field.PHOTO_METADATAS
vào danh sách trường của yêu cầu thông tin chi tiết về địa điểm. - Gọi
PlacesClient.fetchPlace()
để lấy đối tượngPlace
vàPlace.getPhotoMetadas()
để lấy đối tượngPhotoMetadata
.PlacesClient.findCurrentPlace()
không hỗ trợ trường thuộc tính tác giả. - Sử dụng
PhotoMetadata.getAuthorAttributions()
để nhận thông tin ghi nhận tác giả.
Tải ảnh xuống
Phần này mô tả cách truy xuất ảnh dưới dạng bitmap hoặc URI.
Lấy ảnh địa điểm dưới dạng bitmap
Ví dụ sau minh hoạ việc lấy ảnh địa điểm dưới dạng bitmap.
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. } }); });
Nhận URI ảnh địa điểm
Ví dụ sau minh hoạ việc nhận URI ảnh địa điểm.
// 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 FetchResolvedPhotoUriRequest. final FetchResolvedPhotoUriRequest photoRequest = FetchResolvedPhotoUriRequest.builder(photoMetadata) .setMaxWidth(500) // Optional. .setMaxHeight(300) // Optional. .build(); // Request the photo URI placesClient.fetchResolvedPhotoUri(photoRequest).addOnSuccessListener((fetchResolvedPhotoUriResponse) -> { Uri uri = fetchResolvedPhotoUriResponse.getUri(); RequestOptions requestOptions = new RequestOptions().override(Target.SIZE_ORIGINAL); Glide.with(this).load(uri).apply(requestOptions).into(imageView); }).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. } }); });
Phân bổ
Trong hầu hết các trường hợp, bạn có thể sử dụng hình ảnh địa điểm mà không cần ghi nhận tác giả hoặc hình ảnh sẽ có thuộc tính cần thiết. Tuy nhiên, đối tượng siêu dữ liệu ảnh, thuộc loại PhotoMetadata
, có thể chứa một trong hai loại thuộc tính bổ sung:
- Attributions, một chuỗi phân bổ được truy cập bởi
PhotoMetadata.getAttributions()
. - AuthorAttributions, một đối tượng
AuthorAttributions
đượcPhotoMetadata.getAuthorAttributions()
truy cập.
Nếu đối tượng PhotoMetadata
được trả về chứa một trong hai loại thuộc tính, bạn phải đưa thuộc tính đó vào ứng dụng của mình ở bất cứ nơi nào hình ảnh xuất hiện. Để biết thêm thông tin, hãy xem bài viết Cách hiển thị thuộc tính.
Mức sử dụng và thanh toán
SKU Ảnh địa điểm được tính phí cho các cuộc gọi đến fetchPhoto()
.
Hãy xem trang Mức sử dụng và thanh toán để biết thông tin chi tiết.