Все готово!

Прежде чем приступить к разработке, ознакомьтесь с документацией для разработчиков.

Активация Google Places API for Android

Чтобы помочь вам освоиться, мы покажем, как выполнить некоторые необходимые действия в консоли разработчика Google:

  1. Создание или выбор проекта
  2. Активация Google Places API for Android
  3. Создание соответствующих ключей

Фотографии мест

Чтобы отправить запрос на отображение фотографий мест в вашем приложении, можно использовать интерфейс Google Places API for Android. Служба фотографий передает изображения из множества источников, в том числе фотографии, предоставленные владельцами компаний и пользователями Google+. Чтобы получить изображения места, необходимо выполнить следующие действия:

  1. Вызовите метод GeoDataApi.getPlacePhotos(), передав строку с идентификатором места. При этом возвращается экземпляр объекта PlacePhotoMetadataResult.
  2. Вызовите метод getPhotoMetadata() для экземпляра PlacePhotoMetadataResult, чтобы получить буфер PlacePhotoMetadataBuffer с перечнем экземпляров PlacePhotoMetadata (по одному для каждой фотографии).
  3. Вызовите метод get() для буфера PlacePhotoMetadataBuffer, передав в него целое число для извлечения экземпляра PlacePhotoMetadata с соответствующим индексом.

Интерфейсу Google Places API for Android требуется доступ к сети, поэтому все вызовы должны производиться в фоновом режиме, вне основного потока пользовательского интерфейса. По этой причине мы рекомендуем получать фотографии асинхронно в фоновом режиме. Соответствующие примеры см. в разделах Получение фотографий в фоновом режиме с использованием объектов 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. Подключитесь к API Адресов.
  2. Создайте класс задач, наследующий класс AsyncTask, чтобы инкапсулировать обратные вызовы для получения объекта PlacePhotoMetadata и запроса изображения.
  3. Создайте метод, использующий экземпляр этого класса для обработки запросов изображений.

Создание класса задач для фотографий

В качестве примера приведем следующий класс, который берет идентификатор места и получает первую фотографию из возвращаемого списка. Вы можете использовать его как шаблон класса, создаваемого в вашем приложении.

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