一切就绪!

着手开发前,请先阅读我们的开发者文档

激活 Google Places API for Android

为帮助您起步,我们将引导您在 Google 开发者控制台中先完成几项任务:

  1. 创建或选择项目
  2. 激活 Google Places API for Android
  3. 创建相应密钥
继续

地点照片

您可以利用 Google Places API for Android 请求在您的应用中显示地点照片。照片服务返回的照片来自各种来源,包括商家所有者和 Google+ 用户贡献的照片。如需检索地点的图像,您必须执行以下步骤:

  1. 调用 GeoDataApi.getPlacePhotos(),传递一个带地点 ID 的字符串。此操作会返回一个 PlacePhotoMetadataResult 实例。
  2. PlacePhotoMetadataResult 实例调用 getPhotoMetadata() 以获取 PlacePhotoMetadataBuffer,其中包含 PlacePhotoMetadata 实例列表(其中的每个实例分别对应一张照片)。
  3. PlacePhotoMetadataBuffer 实例调用 get(),传递一个整型值,以检索给定索引处的 PlacePhotoMetadata 实例。

Google Places API for Android 要求网络访问权限,因此所有调用都必须在主 UI 线程以外的后台执行。因此,我们建议在后台以异步方式检索照片。如需查看具体操作方法的示例,请参阅利用 AsyncTask 在后台获取照片利用 ResultCallback 在后台获取照片

以下简化代码段演示了如何获取地点的照片列表。

// Get a PlacePhotoMetadataResult containing metadata for the first 10 photos.
PlacePhotoMetadataResult result = Places.GeoDataApi
      .getPlacePhotos(mGoogleApiClient, placeId).await();
// Get a PhotoMetadataBuffer instance containing a list of photos (PhotoMetadata).
if (result != null && result.getStatus().isSuccess()) {
      PlacePhotoMetadataBuffer photoMetadataBuffer = result.getPhotoMetadata();
}

以下简化代码段展示了如何获取 PlacePhotoMetadata 实例,然后利用该实例获取全尺寸位图图像和提供方说明文本:

// Get the first photo in the list.
PlacePhotoMetadata photo = photoMetadataBuffer.get(0);
// Get a full-size bitmap for the photo.
Bitmap image = photo.getPhoto(mGoogleApiClient).await()
    .getBitmap();
// Get the attribution text.
CharSequence attribution = photo.getAttributions();

利用 AsyncTask 在后台获取照片

我们建议使用 AsyncTask 在应用中实现地点照片。下面概要列出了执行这一操作所需的步骤:

  1. 连接至 Places API
  2. 创建一个 task 类来扩展 AsyncTask,以封装用于检索 PlacePhotoMetadata 和请求图像的调用。
  3. 创建一个将该类实例化的方法以处理图像请求。

创建一个 photo task 类

以下示例类会使用地点 ID 来获取返回列表中的第一张照片。您可以使用该类作为您将在自己的应用中创建的类的模板。

abstract class PhotoTask extends AsyncTask<String, Void, PhotoTask.AttributedPhoto> {

    private int mHeight;

    private int mWidth;

    public PhotoTask(int width, int height) {
        mHeight = height;
        mWidth = width;
    }

    /**
     * Loads the first photo for a place id from the Geo Data API.
     * The place id must be the first (and only) parameter.
     */
    @Override
    protected AttributedPhoto doInBackground(String... params) {
        if (params.length != 1) {
            return null;
        }
        final String placeId = params[0];
        AttributedPhoto attributedPhoto = null;

        PlacePhotoMetadataResult result = Places.GeoDataApi
                .getPlacePhotos(mGoogleApiClient, placeId).await();

        if (result.getStatus().isSuccess()) {
            PlacePhotoMetadataBuffer photoMetadataBuffer = result.getPhotoMetadata();
            if (photoMetadata.getCount() > 0 && !isCancelled()) {
                // Get the first bitmap and its attributions.
                PlacePhotoMetadata photo = photoMetadata.get(0);
                CharSequence attribution = photo.getAttributions();
                // Load a scaled bitmap for this photo.
                Bitmap image = photo.getScaledPhoto(mGoogleApiClient, mWidth, mHeight).await()
                        .getBitmap();

                attributedPhoto = new AttributedPhoto(attribution, image);
            }
            // Release the PlacePhotoMetadataBuffer.
            photoMetadataBuffer.release();
        }
        return attributedPhoto;
    }

    /**
     * Holder for an image and its attribution.
     */
    class AttributedPhoto {

        public final CharSequence attribution;

        public final Bitmap bitmap;

        public AttributedPhoto(CharSequence attribution, Bitmap bitmap) {
            this.attribution = attribution;
            this.bitmap = bitmap;
        }
    }
}

处理照片请求

以下示例展示了如何创建将该示例类 (PhotoTask) 实例化的方法来请求地点图像。

private void placePhotosTask() {
    final String placeId = "ChIJrTLr-GyuEmsRBfy61i59si0"; // Australian Cruise Group

    // Create a new AsyncTask that displays the bitmap and attribution once loaded.
    new PhotoTask(mImageView.getWidth(), mImageView.getHeight()) {
        @Override
        protected void onPreExecute() {
            // Display a temporary image to show while bitmap is loading.
            mImageView.setImageResource(R.drawable.empty_photo);
        }

        @Override
        protected void onPostExecute(AttributedPhoto attributedPhoto) {
            if (attributedPhoto != null) {
                // Photo has been loaded, display it.
                mImageView.setImageBitmap(attributedPhoto.bitmap);

                // Display the attribution as HTML content if set.
                if (attributedPhoto.attribution == null) {
                    mText.setVisibility(View.GONE);
                } else {
                    mText.setVisibility(View.VISIBLE);
                    mText.setText(Html.fromHtml(attributedPhoto.attribution.toString()));
                }

            }
        }
    }.execute(placeId);
}

利用 ResultCallback 在后台获取照片

作为 AsyncTask 的备选,您可以利用 ResultCallback 以异步方式发出照片请求。以下代码示例展示了如何执行此操作。

private ResultCallback<PlacePhotoResult> mDisplayPhotoResultCallback
        = new ResultCallback<PlacePhotoResult>() {
    @Override
    public void onResult(PlacePhotoResult placePhotoResult) {
        if (!placePhotoResult.getStatus().isSuccess()) {
            return;
        }
        mImageView.setImageBitmap(placePhotoResult.getBitmap());
    }
};

/**
 * Load a bitmap from the photos API asynchronously
 * by using buffers and result callbacks.
 */
private void placePhotosAsync() {
    final String placeId = "ChIJrTLr-GyuEmsRBfy61i59si0"; // Australian Cruise Group
    Places.GeoDataApi.getPlacePhotos(mGoogleApiClient, placeId)
            .setResultCallback(new ResultCallback<PlacePhotoMetadataResult>() {


                @Override
                public void onResult(PlacePhotoMetadataResult photos) {
                    if (!photos.getStatus().isSuccess()) {
                        return;
                    }

                    PlacePhotoMetadataBuffer photoMetadataBuffer = photos.getPhotoMetadata();
                    if (photoMetadataBuffer.getCount() > 0) {
                        // Display the first bitmap in an ImageView in the size of the view
                        photoMetadataBuffer.get(0)
                                .getScaledPhoto(mGoogleApiClient, mImageView.getWidth(),
                                        mImageView.getHeight())
                                .setResultCallback(mDisplayPhotoResultCallback);
                    }
                    photoMetadataBuffer.release();
                }
            });
}

提供方说明

在大多数情况下,使用地点照片时可以不包含提供方说明,或将必需的提供方说明作为图像的一部分。不过,如果返回的 PlacePhotoMetadata 实例包含提供方说明,则无论您要在应用中的什么位置显示该图像,都必须包含额外提供方说明。如需了解详细信息,请参阅显示提供方说明

使用限制

检索一幅图像的开销是一个配额单位;检索照片元数据并无使用限制。请参阅关于使用限制的文档。

发送以下问题的反馈:

此网页
location_on
Google Places API for Android