您已全部設定完成!

若要開始開發,請參閱我們的開發人員文件

啟用 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(),以取得持有 PlacePhotoMetadata 實例(每張相片一個)清單的 PlacePhotoMetadataBuffer
  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. 建立一個工作類別(會延伸 AsyncTask 以封裝呼叫)以擷取 PlacePhotoMetadata 並要求影像。
  3. 建立會將該類別實例化以處理影像要求的方法。

建立相片工作類別

下列範例類別接受地點 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