Google Maps API is a powerful tool that allows developers to integrate maps and location-based functionality into their Android Studio projects. By using the API, developers can access a wealth of data, including street maps, satellite imagery, and real-time traffic information, as well as a wide range of features such as geocoding, routing, and place search.
One of the key benefits of the Google Maps API is that it is easy to use, with a simple and intuitive interface that makes it easy for developers to get started.
Additionally, the API is highly customizable, allowing developers to tailor the maps and location-based features to suit the specific needs of their app or website. Overall, the Google Maps API is a valuable resource for any developer looking to add location-based functionality to their Android Studio projects.
Step 1: Open Android Studio, Click on New Project and Choose Empty Activity.
Step 2: Pre-requisites
Google Cloud API Website
https://cloud.google.com/apis (Further click on Console)
Gradle module
implementation 'com.google.android.gms:play-services-maps:18.1.0' implementation 'com.google.android.gms:play-services-location:17.0.0'
Download Drawables
Add vector asset as clear icon and download google marker from below:
colors.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="purple_200">#FFBB86FC</color> <color name="purple_500">#FF6200EE</color> <color name="purple_700">#FF3700B3</color> <color name="teal_200">#FF03DAC5</color> <color name="teal_700">#FF018786</color> <color name="black">#FF000000</color> <color name="white">#FFFFFFFF</color> <color name="lavender">#8692f7</color> </resources>
themes.xml
<resources xmlns:tools="http://schemas.android.com/tools"> <!-- Base application theme. --> <style name="Theme.MapDemo" parent="Theme.MaterialComponents.DayNight.NoActionBar"> <!-- Primary brand color. --> <item name="colorPrimary">@color/lavender</item> <item name="colorPrimaryVariant">@color/lavender</item> <item name="colorOnPrimary">@color/white</item> <!-- Secondary brand color. --> <item name="colorSecondary">@color/teal_200</item> <item name="colorSecondaryVariant">@color/teal_700</item> <item name="colorOnSecondary">@color/black</item> <!-- Status bar color. --> <item name="android:statusBarColor">?attr/colorPrimaryVariant</item> <!-- Customize your theme here. --> </style> </resources>
lavender_border.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <stroke android:width="1dp" android:color="@color/lavender"/> <solid android:color="@color/white"/> <corners android:radius="30dp"/> </shape>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.MapDemo" tools:targetApi="31"> <activity android:name=".MapsActivity" android:exported="false" android:label="@string/title_activity_maps" /> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.app.lib_name" android:value="" /> </activity> <meta-data android:name="com.google.android.geo.API_KEY" android:value="paste api key here" /> </application> </manifest>
Step 3: XML Layouts
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout 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:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/showMap" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Show Map" android:textSize="18sp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout>
activity_maps.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout android:layout_width="match_parent" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:map="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" tools:context=".MapsActivity" android:layout_height="match_parent"> <androidx.fragment.app.FragmentContainerView android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" tools:layout="@layout/activity_maps" /> <androidx.appcompat.widget.SearchView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="16dp" android:layout_marginStart="12dp" android:layout_marginEnd="12dp" android:id="@+id/search" app:iconifiedByDefault="false" app:queryHint="Search location" android:focusable="false" app:closeIcon="@drawable/baseline_clear_24" app:searchIcon="@drawable/markerg" android:background="@drawable/lavender_border"/> </RelativeLayout>
Step 4: Java Files
MainActivity.java
package com.example.gmap; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { Button showMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); showMap = findViewById(R.id.showMap); showMap.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, MapsActivity.class); startActivity(intent); } }); } }
MapsActivity.java
package com.example.gmap; import androidx.annotation.NonNull; import androidx.appcompat.widget.SearchView; import androidx.core.app.ActivityCompat; import androidx.fragment.app.FragmentActivity; import android.Manifest; import android.content.pm.PackageManager; import android.location.Address; import android.location.Geocoder; import android.location.Location; import android.os.Bundle; import android.widget.FrameLayout; import android.widget.Toast; import com.google.android.gms.location.FusedLocationProviderClient; import com.google.android.gms.location.LocationServices; import com.google.android.gms.maps.CameraUpdate; 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.BitmapDescriptorFactory; 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 com.google.android.gms.tasks.OnSuccessListener; import com.google.android.gms.tasks.Task; import java.io.IOException; import java.util.List; import java.util.Locale; public class MapsActivity extends FragmentActivity implements OnMapReadyCallback{ FrameLayout map; GoogleMap gMap; Location currentLocation; Marker marker; FusedLocationProviderClient fusedClient; private static final int REQUEST_CODE = 101; SearchView searchView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps); map = findViewById(R.id.map); searchView = findViewById(R.id.search); searchView.clearFocus(); fusedClient = LocationServices.getFusedLocationProviderClient(this); getLocation(); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { String loc = searchView.getQuery().toString(); if (loc == null){ Toast.makeText(MapsActivity.this, "Location Not Found", Toast.LENGTH_SHORT).show(); } else { Geocoder geocoder = new Geocoder(MapsActivity.this, Locale.getDefault()); try { List<Address> addressList = geocoder.getFromLocationName(loc, 1); if (addressList.size() > 0){ LatLng latLng = new LatLng(addressList.get(0).getLatitude(),addressList.get(0).getLongitude()); if (marker != null){ marker.remove(); } MarkerOptions markerOptions = new MarkerOptions().position(latLng).title(loc); markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)); CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng,5); gMap.animateCamera(cameraUpdate); marker = gMap.addMarker(markerOptions); } } catch (IOException e){ e.printStackTrace(); } } return false; } @Override public boolean onQueryTextChange(String newText) { return false; } }); } private void getLocation() { if (ActivityCompat.checkSelfPermission( this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission( this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_CODE); return; } Task<Location> task = fusedClient.getLastLocation(); task.addOnSuccessListener(new OnSuccessListener<Location>() { @Override public void onSuccess(Location location) { if (location != null) { currentLocation = location; //Toast.makeText(getApplicationContext(), currentLocation.getLatitude() + "" + currentLocation.getLongitude(), Toast.LENGTH_SHORT).show(); SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); assert supportMapFragment != null; supportMapFragment.getMapAsync(MapsActivity.this); } } }); } @Override public void onMapReady(GoogleMap googleMap) { this.gMap = googleMap; LatLng latLng = new LatLng(currentLocation.getLatitude(), currentLocation.getLongitude()); MarkerOptions markerOptions = new MarkerOptions().position(latLng).title("My Current Location"); googleMap.animateCamera(CameraUpdateFactory.newLatLng(latLng)); googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 5)); googleMap.addMarker(markerOptions); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { getLocation(); } } } }
If you find this article easy and insightful, please share it with your friends.
If you have any queries or errors related to the above context, please feel free to reach out through the comment section.
For a detailed explanation, please check my YouTube Video: Show Current Location on Google Maps in Android Studio
Google Maps Playlist – Click Here
Check my other articles on Android Knowledge: https://androidknowledge.com/android/
Thank you 🙌