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:
-
GOOGLE DEVELOPERS. Configurar seu projeto do Google Cloud. Disponível em: https://developers.google.com/maps/documentation/android-sdk/get-api-key?hl=pt-br. Acessado em: 26 ago. de 2024.
Outras APIs alternativas
-
OSMdroid (https://github.com/osmdroid/osmdroid);
-
Mapbox (https://www.mapbox.com/);
-
Here Maps (https://maps.here.com/);
-
Leaflet (https://leafletjs.com/);
-
OpenMap (http://openmap-java.org/).
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(); } } } }