모든 준비를 마쳤습니다!

개발을 시작하려면 개발자 문서로 이동하세요.

Google Places API for Android 활성화

개발을 시작하기 위해 Google Developers Console에서 우선적으로 해야 할 일을 몇 가지 소개하겠습니다.

  1. 프로젝트 생성 또는 선택
  2. Google Places API for Android 활성화
  3. 적합한 키 생성
계속

장소 사진

Google Places API for Android를 사용하여 애플리케이션에 표시할 장소 사진을 요청할 수 있습니다. 사진 서비스에서 반환되는 사진은 사업체 소유자와 Google+ 사용자가 제공한 사진을 비롯하여 다양한 소스에서 제공받고 있습니다. 장소 이미지를 검색하려면 다음 단계를 따라야 합니다.

  1. GeoDataApi.getPlacePhotos()를 호출하고 장소 ID가 포함된 문자열을 전달합니다. 이 메서드는 PlacePhotoMetadataResult 인스턴스를 반환합니다.
  2. PlacePhotoMetadataResult 인스턴스에서 getPhotoMetadata()를 호출하여 PlacePhotoMetadata 인스턴스(사진당 1개) 목록이 보관된 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 인스턴스에 특성이 포함된 경우에는, 이미지를 표시할 때마다 애플리케이션에 추가 특성을 포함해야 합니다. 자세한 내용은 특성 표시를 참조하세요.

사용 제한

이미지를 검색할 때마다 할당량의 1단위가 사용됩니다. 사진 메타데이터 검색에는 사용 제한이 없습니다. 사용 제한에 대한 문서를 참조하세요.

다음에 대한 의견 보내기...

location_on
Google Places API for Android