[Android] Zeigen Sie Bilder im Web im infoWindow von Google Map an

1. Erstellen Sie ein Projekt

Erstellen Sie ein neues Projekt. Wählen Sie Google Maps Activity und geben Sie den Projektnamen ein, um fortzufahren. Ersetzen Sie den Teil YOUR_KEY_HERE der automatisch generierten res / values / google_maps_api.xml durch Ihren eigenen API-Schlüssel, den Sie erhalten haben.

google_maps_api.xml


<resources>
<!--Abkürzung-->
    <string name="google_maps_key" templateMergeStrategy="preserve" translatable="false">YOUR_KEY_HERE</string>
</resources>

Starten Sie zu diesem Zeitpunkt das Programm einmal und überprüfen Sie, ob die Karte richtig angezeigt wird.

2. Schreiben Sie eine Layoutdatei

Erstellen Sie ein Layout für infoWindow. Dieses Mal werde ich es mit nur einer ImageView in LinearLayout einfach machen.

info_window_layout.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

3. Beschreibung von InfoWindowAdapter

Implementieren Sie InfoWindowAdapter in der onMapReady-Methode von MapsActivity.java.

MapsActivity.java


    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
//~ Abkürzung ~
        mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
            Marker lastMarker;
            View infoWindow;

            @Override
            public View getInfoWindow(Marker marker) {
                return null;
            }

            @Override
            public View getInfoContents(Marker marker) {
//Beschreiben Sie diesmal den Vorgang hier
                return null;
            }
        });

Der infoWindowAdapter muss sowohl die Methoden getInfoWindow () als auch getInfoContents () überschreiben und den Prozess in die eine schreiben und in die andere null zurückgeben. Beschreiben Sie diesmal den Prozess in getInfoContents (). Deklarieren Sie zur Vereinfachung der Verarbeitung die erforderlichen Variablen lastMarker und infoWindow in der Klasse von infoWindowAdapter.

4. Beschreibung der Methode getInfoContents ()

            @Override
            public View getInfoContents(Marker marker) {
                if(lastMarker==null || !lastMarker.equals(marker)){
                    lastMarker = marker;
                    infoWindow = getLayoutInflater().inflate(R.layout.info_window_layout,null);
                    ImageView img = infoWindow.findViewById(R.id.img);
                    new DownloadImageTask(img,marker).execute(imgUrl);
//↑ Danach implementiert
                }
                return infoWindow;
            }

Wie Sie sehen können, wenn Sie den Prozess nach der Implementierung bis zum Ende detailliert verfolgen, wird die Methode getInfoWindow () insgesamt zweimal aufgerufen, wenn Sie versuchen, infoWindow durch Klicken auf die Markierung anzuzeigen. Der Vorgang des Herunterladens des Bildes wird beim ersten Mal ausgeführt und nur infoWindow zurückgegeben. Beim zweiten Mal wird eine Endlosschleife verhindert.

5. Beschreiben Sie die Bilddownload-Verarbeitungsklasse

private class DownloadImageTask extends AsyncTask<String,Void, Bitmap>{
        ImageView img = null;
        Marker marker = null;

        DownloadImageTask(ImageView img, Marker marker){
            this.img = img;
            this.marker = marker;
        }

        @Override
        protected Bitmap doInBackground(String... strings) {
            Bitmap bmp = null;
            try{
                String urlStr = strings[0];
                URL url = new URL(urlStr);
                HttpURLConnection con = (HttpURLConnection)url.openConnection();
                con.setRequestMethod("GET");
                con.connect();
                int resp = con.getResponseCode();
                switch (resp){
                    case HttpURLConnection.HTTP_OK:
                        InputStream is = con.getInputStream();
                        bmp = BitmapFactory.decodeStream(is);
                        is.close();
                        break;
                    default:
                        break;
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (ProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return bmp;
        }

        @Override
        protected void onPostExecute(Bitmap bmp){
            img.setImageBitmap(bmp);
            marker.showInfoWindow();
        }
    }

Beschreiben von DownladImageTask, einer Klasse für die Verarbeitung von Bilddownloads. Da das Image asynchron heruntergeladen werden muss, erbt es AsyncTask. Die URL des Bildes wird beim Aufruf mit execute () als String übergeben und mit den Strings [0] von doInbackground () empfangen. Das Bild wird in ImageView von onPostExecute () festgelegt, das nach Abschluss des Bilddownloads aufgerufen wird. Anschließend wird das Bild in infoWindow durch Aufrufen von marker.showInfoWindow () angezeigt.

6. Die gesamte MapsActivity.java

Die Markierung ist Sydney, die Standardposition, und das Bild ist die URL dessen, was Sie sehen, wenn Sie in der Webversion von Google Map nach Sydney suchen.

MapsActivity.java


package com.example.test;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        final String imgUrl = "https://lh5.googleusercontent.com/p/AF1QipNUrZvzjGohRsYfuwIpCS2MjYdAq_3xruYM5imS=w408-h271-k-no";

        // Add a marker in Sydney and move the camera
        LatLng sydney = new LatLng(-34, 151);
        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
        mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
            Marker lastMarker;
            View infoWindow;

            @Override
            public View getInfoWindow(Marker marker) {
                return null;
            }

            @Override
            public View getInfoContents(Marker marker) {
                if(lastMarker==null || !lastMarker.equals(marker)){
                    lastMarker = marker;
                    infoWindow = getLayoutInflater().inflate(R.layout.info_window_layout,null);
                    ImageView img = infoWindow.findViewById(R.id.img);
                    new DownloadImageTask(img,marker).execute(imgUrl);
                }
                return infoWindow;
            }
        });
    }

    private class DownloadImageTask extends AsyncTask<String,Void, Bitmap>{
        ImageView img = null;
        Marker marker = null;

        DownloadImageTask(ImageView img, Marker marker){
            this.img = img;
            this.marker = marker;
        }

        @Override
        protected Bitmap doInBackground(String... strings) {
            Bitmap bmp = null;
            try{
                String urlStr = strings[0];
                URL url = new URL(urlStr);
                HttpURLConnection con = (HttpURLConnection)url.openConnection();
                con.setRequestMethod("GET");
                con.connect();
                int resp = con.getResponseCode();
                switch (resp){
                    case HttpURLConnection.HTTP_OK:
                        InputStream is = con.getInputStream();
                        bmp = BitmapFactory.decodeStream(is);
                        is.close();
                        break;
                    default:
                        break;
                }
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (ProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return bmp;
        }

        @Override
        protected void onPostExecute(Bitmap bmp){
            img.setImageBitmap(bmp);
            marker.showInfoWindow();
        }
    }
}

Referenz

https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.InfoWindowAdapter https://stackoverflow.com/questions/36335004/how-to-get-image-in-infowindow-on-google-maps-with-picasso-android

Recommended Posts

[Android] Zeigen Sie Bilder im Web im infoWindow von Google Map an
Zeigen Sie die mit Rails gem'geocoder 'eingegebene Adresse in Google Map an
Zeigen Sie mehrere Markierungen auf Google Map an
Anzeigen des regionalen Netzes des Government Statistics Office (eStat) in einem Webbrowser
Zeigen Sie das Diagramm von tensorBoard auf jupyter an
Lassen Sie uns automatisch den Text des Songs anzeigen, der in Python in iTunes abgespielt wird
Korrigieren Sie die Argumente der in map verwendeten Funktion
Ich habe versucht, den Grad der Koronavirusinfektion auf der Seekarten-Wärmekarte anzuzeigen
So zeigen Sie mehrere Bilder einer Galaxie in Kacheln an
[Golang] Geben Sie ein Array für den Wert der Karte an
Unterschied in den Ergebnissen abhängig vom Argument von multiprocess.Process
Führen Sie einen Befehl auf dem Webserver aus und zeigen Sie das Ergebnis an
Anzeigen von Wettervorhersagen auf M5Stack + Google Cloud Platform
[Python] Speichern Sie das Ergebnis des Web-Scrapings der Mercari-Produktseite in Google Colab in einer Google-Tabelle und zeigen Sie auch das Produktbild an.
Lassen Sie uns automatisch den Text des Songs anzeigen, der in iTunes in Python abgespielt wird (verbesserte Version).
Der Standardstil (CSS) von Pandas-Datenrahmen, die von der Anzeige in Google Colab ausgegeben werden, wurde geändert
Hinweis zum Standardverhalten von collate_fn in PyTorch
Test.py wird auf dem Webserver in Python3 nicht angezeigt.
Informationen zum Kamerawechselereignis der Google Maps Android API
Umfrage zum Einsatz von maschinellem Lernen in realen Diensten
[Django] Google-Kartenanzeige von GIS-Daten und grafische Darstellung von Parametern
Zählen Sie die Anzahl der Zeichen im Text in der Zwischenablage auf dem Mac
Zeigen Sie den Fahrplan des Morioka-Busortungssystems in Pythonista an
Speichern Sie Bilder im Web mit Python (Colab) auf einem Laufwerk.
Google sucht mit Python nach der Zeichenfolge in der letzten Zeile der Datei
Google Maps auf der Webseite anzeigen (Spring Boot + Thymeleaf)
PIL-Bilder auf Jupyter anzeigen
Überprüfung der Scherzausbreitung der "Notfallerklärung am 1. April"
Echtzeitanzeige des serverseitigen Verarbeitungsfortschritts im Browser (Implementierung des Fortschrittsbalkens)
[Python] Ich habe die Route des Taifuns mit Folium auf die Karte geschrieben
Zeigen Sie das Bild der an den PC angeschlossenen Kamera auf der GUI an.
Verschrotten Sie den Zeitplan von Hinatazaka 46 und spiegeln Sie ihn in Google Kalender wider
Finden Sie den Rang der Matrix in der XOR-Welt (Rang der Matrix auf F2)
[Ruby on Rails] Anzeigen und Fixieren von GoolgeMAP mithilfe der Google-API
Holen Sie sich die Anzahl der Leser von Artikeln über Mendeley in Python
Laden Sie die Bilder und Videos herunter, die in den Tweets enthalten sind, die Ihnen auf Twitter gefallen haben, und laden Sie sie auf Google Drive hoch
[Rails 6] Betten Sie Google Map in die App ein und fügen Sie der eingegebenen Adresse einen Marker hinzu. [Bestätigung der Details]