以上で完了です。

開発を始めるには、デベロッパー ドキュメント をご覧下さい。

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 インスタンスのリストを保持している 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 枚取得すると、割り当ての 1 単位が消費されます。なお、写真のメタデータの取得には使用制限がありません。詳細については、使用制限をご覧ください。

フィードバックを送信...