Es kann losgehen!

Bevor Sie mit der Entwicklung beginnen, lesen Sie bitte unsere Entwicklerdokumentation.

Die Google Places API for Android aktivieren

Zum Einstieg führen wir Sie durch die Google Developers Console, wo Sie vorab Folgendes tun müssen:

  1. Ein Projekt erstellen oder auswählen
  2. Die Google Places API for Android aktivieren
  3. Zugehörige Schlüssel erstellen
Weiter

Ortsfotos

Über Google Places API for Android können Sie Ortsfotos anfordern und in Ihrer Anwendung anzeigen. Vom Fotodienst zurückgegebene Fotos stammen aus unterschiedlichen Quellen, einschließlich Fotos, die vom Unternehmenseigentümer und von Google+-Benutzern beigesteuert wurden. Wenn Sie Bilder zu einem Ort anfordern möchten, gehen Sie wie folgt vor:

  1. Rufen Sie GeoDataApi.getPlacePhotos() auf, um eine Zeichenfolge mit einer Orts-ID zu übergeben. Dadurch wird eine Instanz des Typs PlacePhotoMetadataResult zurückgegeben.
  2. Rufen Sie getPhotoMetadata() auf der Instanz PlacePhotoMetadataResult auf, um das Holding PlacePhotoMetadataBuffer einer Liste von Instanzen des Typs PlacePhotoMetadata (eine pro Foto) abzurufen.
  3. Rufen Sie get() auf der Instanz PlacePhotoMetadataBuffer auf, um eine Ganzzahl zu übergeben, mit der die Instanz PlacePhotoMetadata im angegebenen Index abgerufen wird.

Google Places API for Android setzt einen Netzwerkzugang voraus. Aus diesem Grund müssen alle Aufrufe im Hintergrund erfolgen, außerhalb des primären Benutzeroberflächenthreads. Daher wird empfohlen, Fotos asynchron im Hintergrund abzurufen. Beispiele, wie Sie dies tun können, finden Sie unter Fotos im Hintergrund mit AsyncTask abrufen und Fotos im Hintergrund mit ResultCallback abrufen.

Der folgende vereinfachte Codeausschnitt zeigt das Abrufen einer Liste von Fotos zu einem Ort.

// 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();
}

Der folgende vereinfachte Codeausschnitt zeigt das Abrufen der Instanz PlacePhotoMetadata. Anschließen dient diese Instanz zum Abrufen des Bitmap-Bilds in voller Größe sowie des Zuordnungstexts:

// 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();

Fotos im Hintergrund mit AsyncTask abrufen

Wir empfehlen die Verwendung von AsyncTask, um Ortsfotos in Ihrer App zu implementieren. Hier sind die dafür erforderlichen Schritte zusammengefasst:

  1. Verbinden Sie sich mit Places API.
  2. Erstellen Sie eine Aufgabenklasse, die AsyncTask erweitert und die Aufrufe zum Abrufen von PlacePhotoMetadata einschließt und das Bild anfordert.
  3. Erstellen Sie eine Methode, die diese Klasse instanziiert, sodass sie Bildanforderungen verarbeitet.

Fotoaufgabenklasse erstellen

Die folgende Beispielklasse erfordert eine Orts-ID und ruft das erste Foto aus der zurückgegebenen Liste ab. Sie können diese Klasse als Vorlage für die Klasse verwenden, die Sie in Ihrer eigenen App erstellen werden.

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;
        }
    }
}

Fotoanforderungen verarbeiten

Das folgende Beispiel zeigt das Erstellen einer Methode zum Instanziieren der Beispielklasse (PhotoTask), die Bilder zu einem Ort anfordert.

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);
}

Fotos im Hintergrund mit ResultCallback abrufen

Als Alternative zu AsyncTask können Sie Fotos asynchron mit ResultCallback anfordern. Der folgende Beispielcode zeigt den Ablauf.

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();
                }
            });
}

Zuordnungen

In den meisten Fällen dürfen Ortsfotos ohne Zuordnung verwendet werden bzw. sind die erforderlichen Zuordnungen bereits im Bild eingebunden. Falls die zurückgegebene Instanz PlacePhotoMetadata jedoch eine Zuordnung enthält, müssen Sie die zusätzliche Zuordnung immer dann in Ihrer App einschließen, wenn Sie das Bild anzeigen. Weitere Informationen finden Sie in Zuordnungen anzeigen.

Nutzungsbeschränkungen

Das Abrufen eines Bilds kostet eine Kontingenteinheit. Es gibt keine Nutzungsbeschränkungen für das Abrufen von Fotometadaten. Weitere Informationen dazu finden Sie in der Dokumentation zu Nutzungsbeschränkungen.

Feedback geben zu...

location_on
Google Places API for Android