Google Maps

Através do SDK do Android é possível adicionar mapas ao seu projeto. É necessário criar um projeto na Google Cloud, gerar uma chave de API e adicionar essa chave no seu projeto Android. Para mais detalhes em como criar, configurar e ativar a API do SDK Maps, acesse o material disponível na documentação oficial:

Outras APIs alternativas

Exemplo 01 (visualização do mapa com ícone personalizado):

  • No arquivo gradle acrescente: dependencies { implementation ("org.osmdroid:osmdroid-android:6.1.18") implementation ("org.osmdroid:osmdroid-wms:6.1.18") …​ }

  • No arquivo AndroidManifest.xml acrescente: <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" />

  • activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/main"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
        <FrameLayout
            android:id="@+id/mapContainer"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone">
            <org.osmdroid.views.MapView
                android:id="@+id/mapView"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </FrameLayout>
    </LinearLayout>
  • MainActivity.java

    import android.Manifest;
    import android.content.pm.PackageManager;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.FrameLayout;
    import android.widget.Toast;
    import androidx.annotation.NonNull;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.app.ActivityCompat;
    import androidx.core.content.ContextCompat;
    import org.osmdroid.config.Configuration;
    import org.osmdroid.util.GeoPoint;
    import org.osmdroid.views.MapView;
    import org.osmdroid.views.overlay.Marker;
    public class MainActivity extends AppCompatActivity {
        private static final int REQUEST_CODE = 1;
        private MapView mapView;
        private FrameLayout mapContainer;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Configuration.getInstance().setUserAgentValue(getPackageName());
            setContentView(R.layout.activity_main);
            mapContainer = findViewById(R.id.mapContainer);
            solicitarPermissao(new String[]{
                    Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.ACCESS_COARSE_LOCATION
            });
        }
        private void inicializarMapa() {
            mapView = findViewById(R.id.mapView);
            mapView.setMultiTouchControls(true);
            GeoPoint palmas = new GeoPoint(-10.184, -48.333);
            mapView.getController().setZoom(13.0);
            mapView.getController().setCenter(palmas);
            Marker marker = new Marker(mapView);
            marker.setPosition(palmas);
            marker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);
            marker.setTitle("Palmas - TO");
            marker.setIcon(ContextCompat.getDrawable(this, R.drawable.sunflower));
            mapView.getOverlays().add(marker);
            mapContainer.setVisibility(View.VISIBLE);
        }
        private void solicitarPermissao(String[] permissions) {
            for (String permission : permissions) {
                if (ContextCompat.checkSelfPermission(this, permission)
                        != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE);
                    return;
                }
            }
            inicializarMapa();
        }
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                               @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode == REQUEST_CODE) {
                boolean granted = true;
                for (int result : grantResults) {
                    if (result != PackageManager.PERMISSION_GRANTED) {
                        granted = false;
                        break;
                    }
                }
                if (granted) {
                    inicializarMapa();
                } else {
                    mapContainer.setVisibility(View.GONE);
                    Toast.makeText(this, "Permissão negada. O mapa não será exibido.", Toast.LENGTH_LONG).show();
                }
            }
        }
    }

Exemplo 02 (Visualização do mapa com impressão da localização ao deslocar o marcador):

  • No arquivo gradle acrescente: dependencies { implementation ("org.osmdroid:osmdroid-android:6.1.18") implementation ("org.osmdroid:osmdroid-wms:6.1.18") …​ }

  • No arquivo AndroidManifest.xml acrescente: <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" />

  • activity_mainl.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/txtCoordenadas"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Coordenadas: "
            android:padding="8dp"
            android:textSize="16sp"
            android:background="#DDDDDD"/>
        <FrameLayout
            android:id="@+id/mapContainer"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone">
            <org.osmdroid.views.MapView
                android:id="@+id/mapView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>
        </FrameLayout>
    </LinearLayout>
  • MainActivity.java

    import android.Manifest;
    import android.content.pm.PackageManager;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.FrameLayout;
    import android.widget.TextView;
    import android.widget.Toast;
    import androidx.annotation.NonNull;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.app.ActivityCompat;
    import androidx.core.content.ContextCompat;
    import org.osmdroid.config.Configuration;
    import org.osmdroid.util.GeoPoint;
    import org.osmdroid.views.MapView;
    import org.osmdroid.views.overlay.Marker;
    public class MainActivity extends AppCompatActivity {
        private static final int REQUEST_CODE = 1;
        private MapView mapView;
        private FrameLayout mapContainer;
        private TextView txtCoordenadas;
        private Marker marker;
        private LocationManager locationManager;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Configuration.getInstance().setUserAgentValue(getPackageName());
            setContentView(R.layout.activity_main);
            mapContainer = findViewById(R.id.mapContainer);
            txtCoordenadas = findViewById(R.id.txtCoordenadas);
            solicitarPermissao(new String[]{
                    Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.ACCESS_COARSE_LOCATION
            });
        }
        private void inicializarMapa(Location location) {
            mapView = findViewById(R.id.mapView);
            mapView.setMultiTouchControls(true);
            GeoPoint pontoInicial = new GeoPoint(location.getLatitude(), location.getLongitude());
            mapView.getController().setZoom(16.0);
            mapView.getController().setCenter(pontoInicial);
            marker = new Marker(mapView);
            marker.setPosition(pontoInicial);
            marker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);
            marker.setTitle("Minha localização");
            marker.setDraggable(false);
            marker.setOnMarkerClickListener((m, mv) -> {
                marker.setDraggable(true);
                Toast.makeText(this, "Agora você pode arrastar o marcador!", Toast.LENGTH_SHORT).show();
                return true;
            });
            marker.setOnMarkerDragListener(new Marker.OnMarkerDragListener() {
                @Override
                public void onMarkerDrag(Marker marker) {
                    // enquanto arrasta (opcional)
                }
                @Override
                public void onMarkerDragEnd(Marker marker) {
                    GeoPoint novaPosicao = marker.getPosition();
                    txtCoordenadas.setText("Coordenadas: " +
                            novaPosicao.getLatitude() + ", " +
                            novaPosicao.getLongitude());
                    Toast.makeText(MainActivity.this, "Marcador movido!", Toast.LENGTH_SHORT).show();
                }
                @Override
                public void onMarkerDragStart(Marker marker) {
                    // quando começa a arrastar (opcional)
                }
            });
            mapView.getOverlays().add(marker);
            mapContainer.setVisibility(View.VISIBLE);
            txtCoordenadas.setText("Coordenadas: " +
                    pontoInicial.getLatitude() + ", " +
                    pontoInicial.getLongitude());
        }
        private void solicitarPermissao(String[] permissions) {
            for (String permission : permissions) {
                if (ContextCompat.checkSelfPermission(this, permission)
                        != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE);
                    return;
                }
            }
            obterLocalizacaoAtual();
        }
        private void obterLocalizacaoAtual() {
            locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                    && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            Location lastLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            if (lastLocation != null) {
                inicializarMapa(lastLocation);
            } else {
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, new LocationListener() {
                    @Override
                    public void onLocationChanged(@NonNull Location location) {
                        inicializarMapa(location);
                        locationManager.removeUpdates(this);
                    }
                });
            }
        }
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                               @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode == REQUEST_CODE) {
                boolean granted = true;
                for (int result : grantResults) {
                    if (result != PackageManager.PERMISSION_GRANTED) {
                        granted = false;
                        break;
                    }
                }
                if (granted) {
                    obterLocalizacaoAtual();
                } else {
                    mapContainer.setVisibility(View.GONE);
                    Toast.makeText(this, "Permissão negada. O mapa não será exibido.", Toast.LENGTH_LONG).show();
                }
            }
        }
    }

Exemplo 03 (Localização do usuário):

  • No arquivo gradle acrescente: dependencies { implementation ("org.osmdroid:osmdroid-android:6.1.18") implementation ("org.osmdroid:osmdroid-wms:6.1.18") …​ }

  • No arquivo AndroidManifest.xml acrescente: <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" />

  • activity_mainl.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/txtCoordenadas"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Coordenadas: "
            android:padding="8dp"
            android:textSize="16sp"
            android:background="#DDDDDD"/>
        <FrameLayout
            android:id="@+id/mapContainer"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone">
            <org.osmdroid.views.MapView
                android:id="@+id/mapView"
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>
        </FrameLayout>
    </LinearLayout>
  • MainActivity.java

    import android.Manifest;
    import android.content.pm.PackageManager;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.FrameLayout;
    import android.widget.TextView;
    import android.widget.Toast;
    import androidx.annotation.NonNull;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.app.ActivityCompat;
    import androidx.core.content.ContextCompat;
    import org.osmdroid.config.Configuration;
    import org.osmdroid.util.GeoPoint;
    import org.osmdroid.views.MapView;
    import org.osmdroid.views.overlay.Marker;
    public class MainActivity extends AppCompatActivity {
        private static final int REQUEST_CODE = 1;
        private MapView mapView;
        private FrameLayout mapContainer;
        private TextView txtCoordenadas;
        private Marker marker;
        private LocationManager locationManager;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            Configuration.getInstance().setUserAgentValue(getPackageName());
            setContentView(R.layout.activity_main);
            mapContainer = findViewById(R.id.mapContainer);
            txtCoordenadas = findViewById(R.id.txtCoordenadas);
            solicitarPermissao(new String[]{
                    Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.ACCESS_COARSE_LOCATION
            });
        }
        private void inicializarMapa(Location location) {
            mapView = findViewById(R.id.mapView);
            mapView.setMultiTouchControls(true);
            GeoPoint pontoInicial = new GeoPoint(location.getLatitude(), location.getLongitude());
            mapView.getController().setZoom(16.0);
            mapView.getController().setCenter(pontoInicial);
            marker = new Marker(mapView);
            marker.setPosition(pontoInicial);
            marker.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_BOTTOM);
            marker.setTitle("Minha localização");
            mapView.getOverlays().add(marker);
            mapContainer.setVisibility(View.VISIBLE);
            txtCoordenadas.setText("Coordenadas: " +
                    pontoInicial.getLatitude() + ", " +
                    pontoInicial.getLongitude());
        }
        private void solicitarPermissao(String[] permissions) {
            for (String permission : permissions) {
                if (ContextCompat.checkSelfPermission(this, permission)
                        != PackageManager.PERMISSION_GRANTED) {
                    ActivityCompat.requestPermissions(this, permissions, REQUEST_CODE);
                    return;
                }
            }
            iniciarLocalizacaoTempoReal();
        }
        private void iniciarLocalizacaoTempoReal() {
            locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
                    && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            Location lastLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            if (lastLocation != null) {
                inicializarMapa(lastLocation);
            }
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                    2000,
                    5,
                    new LocationListener() {
                        @Override
                        public void onLocationChanged(@NonNull Location location) {
                            GeoPoint novaPosicao = new GeoPoint(location.getLatitude(), location.getLongitude());
                            marker.setPosition(novaPosicao);
                            mapView.getController().animateTo(novaPosicao);
                            txtCoordenadas.setText("Coordenadas: " +
                                    novaPosicao.getLatitude() + ", " +
                                    novaPosicao.getLongitude());
                        }
                    });
        }
        @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                               @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
            if (requestCode == REQUEST_CODE) {
                boolean granted = true;
                for (int result : grantResults) {
                    if (result != PackageManager.PERMISSION_GRANTED) {
                        granted = false;
                        break;
                    }
                }
                if (granted) {
                    iniciarLocalizacaoTempoReal();
                } else {
                    mapContainer.setVisibility(View.GONE);
                    Toast.makeText(this, "Permissão negada. O mapa não será exibido.", Toast.LENGTH_LONG).show();
                }
            }
        }
    }