[JAVA] [Android] Afficher des images sur le Web dans la fenêtre info de Google Map

1. Créez un projet

Créez un nouveau projet. Sélectionnez Activité Google Maps et saisissez le nom du projet pour continuer. Remplacez la partie YOUR_KEY_HERE du fichier res / values / google_maps_api.xml généré automatiquement par votre propre clé API que vous avez obtenue.

google_maps_api.xml


<resources>
<!--Abréviation-->
    <string name="google_maps_key" templateMergeStrategy="preserve" translatable="false">YOUR_KEY_HERE</string>
</resources>

À ce stade, démarrez le programme une fois et vérifiez que la carte s'affiche correctement.

2. Rédigez un fichier de mise en page

Créez une mise en page pour infoWindow. Cette fois, je vais simplifier les choses avec un seul ImageView dans LinearLayout.

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. Description d'InfoWindowAdapter

Implémentez InfoWindowAdapter dans la méthode onMapReady de MapsActivity.java.

MapsActivity.java


    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
//~ Abréviation ~
        mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() {
            Marker lastMarker;
            View infoWindow;

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

            @Override
            public View getInfoContents(Marker marker) {
//Cette fois, décrivez le processus ici
                return null;
            }
        });

L'infoWindowAdapter doit remplacer les deux méthodes getInfoWindow () et getInfoContents (), écrire le processus dans l'une et renvoyer null dans l'autre. Cette fois, décrivez le processus dans getInfoContents (). De plus, pour faciliter le traitement, déclarez les variables nécessaires lastMarker et infoWindow dans la classe infoWindowAdapter.

4. Description de la méthode 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);
//↑ Mis en œuvre après cela
                }
                return infoWindow;
            }

Comme vous pouvez le voir si vous suivez le processus en détail après l'avoir implémenté jusqu'à la fin, si vous essayez d'afficher infoWindow en cliquant sur le marqueur, la méthode getInfoWindow () sera appelée deux fois au total. Le processus de téléchargement de l'image est exécuté la première fois et renvoie uniquement infoWindow; est exécuté la deuxième fois pour éviter une boucle infinie.

5. Décrivez la classe de traitement de téléchargement d'image

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

Décrivez DownladImageTask, qui est une classe pour le traitement du téléchargement d'images. Étant donné que l'image doit être téléchargée de manière asynchrone, elle hérite d'AsyncTask. L'URL de l'image est passée sous forme de chaîne lorsqu'elle est appelée avec execute (), et est reçue avec les chaînes [0] de doInbackground (). L'image est définie dans ImageView par onPostExecute (), qui est appelée une fois le téléchargement de l'image terminé, puis l'image est affichée dans infoWindow en appelant marker.showInfoWindow ().

6. MapsActivity.java entière

Le marqueur est la position par défaut de Sydney et l'image est l'URL de ce que vous voyez lorsque vous recherchez Sydney sur la version Web de Google map.

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

référence

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] Afficher des images sur le Web dans la fenêtre info de Google Map
Afficher l'adresse saisie à l'aide de Rails gem'geocoder 'sur Google Map
Afficher plusieurs marqueurs sur Google Map
Comment afficher le maillage régional du Government Statistics Office (eStat) dans un navigateur Web
Afficher le graphique de tensorBoard sur Jupyter
Affiche automatiquement les paroles de la chanson en cours de lecture sur iTunes en Python
Correction des arguments de la fonction utilisée dans map
J'ai essayé d'afficher le degré d'infection par le virus corona sur la carte thermique Seaborn
Comment afficher plusieurs images d'une galaxie en tuiles
[Golang] Spécifiez un tableau pour la valeur de la carte
Différence de résultats en fonction de l'argument du multiprocessus.
Exécuter une commande sur le serveur Web et afficher le résultat
Consultez les prévisions météo sur M5Stack + Google Cloud Platform
[Python] Enregistrez le résultat du scraping Web de la page produit Mercari sur Google Colab dans une feuille de calcul Google et affichez également l'image du produit.
Affiche automatiquement les paroles de la chanson en cours de lecture sur iTunes en Python (version améliorée)
Modification du style par défaut (CSS) des cadres de données pandas générés par affichage dans Google Colab
Remarque sur le comportement par défaut de collate_fn dans PyTorch
Test.py n'est pas reflété sur le serveur Web dans Python3.
À propos de l'événement de changement de caméra de l'API Google Maps Android
Enquête sur l'utilisation du machine learning dans les services réels
[Django] Affichage de la carte Google des données SIG et représentation graphique des paramètres
Comptez le nombre de caractères dans le texte dans le presse-papiers sur Mac
Afficher les horaires du système de localisation des bus Morioka dans Pythonista
Enregistrer des images sur le Web sur un lecteur avec Python (Colab)
Google recherche la chaîne sur la dernière ligne du fichier en Python
Afficher Google Maps sur la page Web (Spring Boot + Thymeleaf)
Afficher les images PIL sur Jupyter
Vérification de la propagation du canular de "Déclaration d'urgence le 1er avril"
Affichage en temps réel de la progression du traitement côté serveur sur le navigateur (implémentation de la barre de progression)
[Python] J'ai écrit la route du typhon sur la carte en utilisant le folium
Affichez l'image de la caméra connectée à l'ordinateur personnel sur l'interface graphique.
Racler le calendrier de Hinatazaka 46 et le refléter dans Google Agenda
Trouvez le rang de la matrice dans le monde XOR (rang de la matrice sur F2)
[Ruby on Rails] Affichage et épinglage de GoolgeMAP à l'aide de l'API Google
Obtenez le nombre de lecteurs d'articles sur Mendeley en Python
Téléchargez les images et vidéos contenues dans les tweets que vous avez aimés sur Twitter et téléchargez-les sur Google Drive
[Rails 6] Intégrez Google Map dans l'application et ajoutez un marqueur à l'adresse saisie. [Confirmation des détails]