Current Location With Google Map Street View Android
Hey guy’s, today we’re going to learn how we can show the current location of the user on GoogleMapStreetView. I’m going to reuse the code from my previous blog => Android Google Map Street View Example.
The previous Article was about how to show GoogleMapStreetView in Android app. In this blog, we’re not going to set up Google Map Console because I have done this in my previous blog. So, without further ado let’s dive into AndroidStudio and do some coding.
Android App Setup
First, open your app level build.gradle file and add the dependency for location.
implementation 'com.google.android.gms:play-services-location:15.0.0'
Now open the Manifest file to add app location and internet permission.
<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" />
Now add StreetViewPanoramaFragment to activity_main.xml. Below is the activity_main.xml file.
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <fragment android:id="@+id/streetViewMap" android:name="com.google.android.gms.maps.StreetViewPanoramaFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>
Now go to the MainActivity.java file and get the StreetViewPanoramaFragment object and add OnStreetViewPanoramaReadyCallback. Below is the code for the StreetViewPanoramaFragment object.
streetViewPanoramaFragment = (StreetViewPanoramaFragment) getFragmentManager() .findFragmentById(R.id.streetViewMap); streetViewPanoramaFragment.getStreetViewPanoramaAsync(this);
Now we have to see if the user has previously installed GooglePlayServices on his/her mobile. Below is the example of how we can check the GooglePlayServices is installed or not.
if (!isGooglePlayServicesAvailable()) Toast.makeText(this, "Google play service not available", Toast.LENGTH_SHORT).show(); else { fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this); startCurrentLocationUpdates(); }
isGooglePlayServicesAvailable is our custom method to check that GooglePlayServices available or not. If the user does not have GooglePlayServices then we simply show a Toast else we start current location updates.
Below is the isGooglePlayServicesAvailable method.
private boolean isGooglePlayServicesAvailable() { GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance(); int status = googleApiAvailability.isGooglePlayServicesAvailable(this); if (ConnectionResult.SUCCESS == status) return true; else { if (googleApiAvailability.isUserResolvableError(status)) Toast.makeText(this, "Please Install google play services to use this application", Toast.LENGTH_LONG).show(); else googleApiAvailability.getErrorDialog(this, status, API_AVAILABILITY_REQUEST_CODE).show(); } return false; }
GoogleApiAvailability is the utility class to check GooglePlayServices availability. If you want to learn more about GoogleApiAvailability class see this link.
Below is the startCurrentLocationUpdates method.
private void startCurrentLocationUpdates() { LocationRequest locationRequest = LocationRequest.create(); locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); locationRequest.setInterval(3000); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION); return; } } fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper()); }
LocationRequest is the class to tell how much time interval we need after every location and also we can set location Accuracy with the LocationRequest. Now we just need the LocationCallback class object which we’re passing in when requesting location updates.
Below is the code how can we make the LocationCallback object.
private LocationCallback locationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { super.onLocationResult(locationResult); Location location = locationResult.getLastLocation(); if (location == null) return; LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); streetViewPanorama.setPosition(latLng); // If you do not want to cancel the location updates after receiving the first location then comment the below line. fusedLocationProviderClient.removeLocationUpdates(locationCallback); } };
onLocationResult is the method where we’re actually getting our current location. Now we just need to set the location into StreetViewPanorama object.
Below is the complete MainActivity.java code.
package com.spartons.googlemapstreetviewlocation; import android.Manifest; import android.content.pm.PackageManager; import android.graphics.Point; import android.location.Location; import android.os.Build; import android.os.Looper; import android.os.PersistableBundle; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.Toast; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.GoogleApiAvailability; import com.google.android.gms.location.FusedLocationProviderClient; import com.google.android.gms.location.LocationCallback; import com.google.android.gms.location.LocationRequest; import com.google.android.gms.location.LocationResult; import com.google.android.gms.location.LocationServices; import com.google.android.gms.maps.OnStreetViewPanoramaReadyCallback; import com.google.android.gms.maps.StreetViewPanorama; import com.google.android.gms.maps.StreetViewPanoramaFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.StreetViewPanoramaCamera; public class MainActivity extends AppCompatActivity implements OnStreetViewPanoramaReadyCallback { private static final Integer PANORAMA_CAMERA_DURATION = 1000; public static final String TAG = MainActivity.class.getSimpleName(); private static final String STREET_VIEW_BUNDLE = "StreetViewBundle"; private static final int API_AVAILABILITY_REQUEST_CODE = 45656; private static final int MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 48499; private StreetViewPanorama streetViewPanorama; private StreetViewPanoramaFragment streetViewPanoramaFragment; private FusedLocationProviderClient fusedLocationProviderClient; private StreetViewPanorama.OnStreetViewPanoramaChangeListener streetViewPanoramaChangeListener = streetViewPanoramaLocation -> Log.e(TAG, "Street View Panorama Change Listener"); private StreetViewPanorama.OnStreetViewPanoramaClickListener streetViewPanoramaClickListener = (orientation -> { Point point = streetViewPanorama.orientationToPoint(orientation); if (point != null) { streetViewPanorama.animateTo( new StreetViewPanoramaCamera.Builder() .orientation(orientation) .zoom(streetViewPanorama.getPanoramaCamera().zoom) .build(), PANORAMA_CAMERA_DURATION); } }); private LocationCallback locationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { super.onLocationResult(locationResult); Location location = locationResult.getLastLocation(); if (location == null) return; LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); Log.e(TAG, latLng.latitude + " " + latLng.longitude); streetViewPanorama.setPosition(latLng); // If you do not want to cancel the location updates after receiving the first location then comment the below line. fusedLocationProviderClient.removeLocationUpdates(locationCallback); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); streetViewPanoramaFragment = (StreetViewPanoramaFragment) getFragmentManager() .findFragmentById(R.id.streetViewMap); streetViewPanoramaFragment.getStreetViewPanoramaAsync(this); Bundle streetViewBundle = null; if (savedInstanceState != null) streetViewBundle = savedInstanceState.getBundle(STREET_VIEW_BUNDLE); streetViewPanoramaFragment.onCreate(streetViewBundle); if (!isGooglePlayServicesAvailable()) Toast.makeText(this, "Google play service not available", Toast.LENGTH_SHORT).show(); else { fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this); startCurrentLocationUpdates(); } } private void startCurrentLocationUpdates() { LocationRequest locationRequest = LocationRequest.create(); locationRequest .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) .setInterval(3000); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION); return; } } fusedLocationProviderClient.requestLocationUpdates(locationRequest, locationCallback, Looper.myLooper()); } private boolean isGooglePlayServicesAvailable() { GoogleApiAvailability googleApiAvailability = GoogleApiAvailability.getInstance(); int status = googleApiAvailability.isGooglePlayServicesAvailable(this); if (ConnectionResult.SUCCESS == status) return true; else { if (googleApiAvailability.isUserResolvableError(status)) Toast.makeText(this, "Please Install google play services to use this application", Toast.LENGTH_LONG).show(); else googleApiAvailability.getErrorDialog(this, status, API_AVAILABILITY_REQUEST_CODE).show(); } return false; } @Override protected void onResume() { super.onResume(); streetViewPanoramaFragment.onResume(); } @Override public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) { super.onSaveInstanceState(outState, outPersistentState); Bundle mStreetViewBundle = outState.getBundle(STREET_VIEW_BUNDLE); if (mStreetViewBundle == null) { mStreetViewBundle = new Bundle(); outState.putBundle(STREET_VIEW_BUNDLE, mStreetViewBundle); } streetViewPanoramaFragment.onSaveInstanceState(mStreetViewBundle); } @Override public void onStreetViewPanoramaReady(StreetViewPanorama streetViewPanorama) { this.streetViewPanorama = streetViewPanorama; this.streetViewPanorama.setOnStreetViewPanoramaChangeListener(streetViewPanoramaChangeListener); this.streetViewPanorama.setOnStreetViewPanoramaClickListener(streetViewPanoramaClickListener); } @Override protected void onStop() { super.onStop(); streetViewPanoramaFragment.onStop(); } @Override protected void onDestroy() { super.onDestroy(); if (streetViewPanoramaFragment != null) streetViewPanoramaFragment.onDestroy(); streetViewPanoramaChangeListener = null; streetViewPanoramaClickListener = null; streetViewPanorama = null; if (fusedLocationProviderClient != null && locationCallback != null) fusedLocationProviderClient.removeLocationUpdates(locationCallback); fusedLocationProviderClient = null; locationCallback = null; } }
That’s it, this is the complete example of how you can show the current location of the user on StreetViewGoogleMap. Complete source code for the above example is on GitHub.
I hope this blog gives you a good understanding of how you can show the current location on StreetViewGoogleMap. If you’ve any queries for the post please do comment below.