
Android and Google Maps. This tutorial describes the usage of Google Maps in your Android application. In this article, I am sharing how to used a google map in android and how to show a marker on current location and source
And in these article, I am sharing how to show root in google map and show these root alternate root and calculate the distance start to end point
Used a start trip run on google map
Step 1: First one to Start Android Studio
Step 2 : Seconds step to Create a New Project Project ClickOn ==> File ==> NEW ==> New Project
And select the google map activity in the android studio.
Step 3: Gradle Scripts Open Project base and add these
uildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'com.google.gms:google-services:3.1.0'
}
}
allprojects {
repositories {
mavenLocal()
mavenCentral()
maven { // <-- Add this
url 'https://maven.google.com/'
name 'Google'
}
jcenter()
maven {
url "https://jitpack.io"
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
And App Base build.gradle and add these
First, one to add google service in your gradle.
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:27.0.2'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile 'com.android.support:design:27.0.2'
compile 'com.android.support:support-v4:27.0.2'
compile 'com.android.volley:volley:1.0.0'
compile 'com.google.firebase:firebase-messaging:11.0.4'
compile 'com.google.android.gms:play-services-base:11.0.4’
compile 'com.google.android.gms:play-services-maps:11.0.4'
compile 'com.google.maps.android:android-maps-utils:0.4.3'
compile 'com.google.android.gms:play-services-location:11.0.4'
compile 'org.jsoup:jsoup:1.11.2'
testCompile 'junit:junit:4.12'
}
apply plugin: 'com.google.gms.google-services'
Step 4: Open your XML file add these
<?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:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.codeplayon.StartTrip"> <TextView android:id="@+id/RootText" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="2dp" android:background="@color/colorPrimary" android:textColor="@color/text"/> <TextView android:id="@+id/RootText1" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="2dp" android:background="@color/colorPrimary" android:textColor="@color/text"/> <TextView android:id="@+id/RootText2" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="2dp" android:background="@color/colorPrimary" android:textColor="@color/text"/> <fragment android:id="@+id/map" class="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
Step 5: Open your java file and add these code
public class StartTrip extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener, RoutingListener {
private GoogleMap mMap;
double Latitude;
double Longitude;
protected LatLng start;
protected LatLng end;
TextView RouteText,RouteText1,RouteText2;
// double Latitude1;
// double Longitude1;
Location mCurrentLocation;
String mLastUpdateTime;
private static final String LOG_TAG = "MyActivity";
LocationRequest mLocationRequest;
GoogleApiClient mGoogleApiClient;
String Name, Address;
AutoCompleteTextView destination;
AutoCompleteTextView starting;
private List<Polyline> polylines;
private static final int[] COLORS = new int[]{R.color.driving,R.color.colorPrimary,R.color.colorAccent,R.color.secondryText,R.color.primary_dark_material_light};
private static final long INTERVAL = 1000 * 60 * 1; //1 minute
private static final long FASTEST_INTERVAL = 1000 * 60 * 1; // 1 minute
private static final String TAG = "LocationTracker";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
logEvent("onCreate");
//show error dialog if GoolglePlayServices not available
if (!isGooglePlayServicesAvailable()) {
finish();
}
// Create Location Request
createLocationRequest();
polylines = new ArrayList<>();
// Initialize GoogleApiClient
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
setContentView(R.layout.activity_start_trip);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
Latitude = getIntent().getDoubleExtra("lat", Latitude);
Longitude = getIntent().getDoubleExtra("log", Longitude);
Address = getIntent().getStringExtra("address");
end=new LatLng(Latitude,Longitude);
Name = getIntent().getStringExtra("name");
RouteText=(TextView)findViewById(R.id.RootText);
RouteText1=(TextView)findViewById(R.id.RootText1);
RouteText2=(TextView)findViewById(R.id.RootText2);
// String lat=bundle.getString("lat");
// String longs=bundle.getString("long");
// Latitude1= Double.parseDouble(lat);
// Longitude1=Double.parseDouble(longs);
}
private boolean isGooglePlayServicesAvailable() {
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (ConnectionResult.SUCCESS == status) {
return true;
} else {
GooglePlayServicesUtil.getErrorDialog(status, this, 0).show();
return false;
}
}
/**
* LocationRequest objects are used to request of service parameters
* for request to the FusedLocationProviderApi.
*/
private void createLocationRequest() {
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(INTERVAL);
mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}
@Override
protected void onStart() {
super.onStart();
logEvent("onStart");
mGoogleApiClient.connect();
}
@Override
protected void onResume() {
super.onResume();
if (mGoogleApiClient.isConnected()) {
startLocationUpdates();
logEvent("Location update resumed");
}
}
@Override
protected void onPause() {
super.onPause();
stopLocationUpdates();
}
@Override
protected void onStop() {
super.onStop();
logEvent("onStop");
mGoogleApiClient.disconnect();
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
// Add a marker in Sydney and move the camera
LatLng sydney = new LatLng(Latitude, Longitude);
mMap.addMarker(new MarkerOptions().position(sydney).title(Name).snippet(Address));
}
/**
* Before any operation is executed, the GoogleApiClient must be connected using the connect() method.
* The client is not considered connected until the onConnected(Bundle) callback has been called.
* @param bundle
*/
@Override
public void onConnected(@Nullable Bundle bundle) {
logEvent("onConnected");
startLocationUpdates();
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
logEvent("Connection failed: " + connectionResult.toString());
}
@Override
public void onLocationChanged(Location location) {
logEvent("onLocationChanged");
mCurrentLocation = location;
mLastUpdateTime = DateFormat.getTimeInstance().format(new Date());
addMarker();
}
private void addMarker() {
logEvent("addMarker");
MarkerOptions options = new MarkerOptions();
// To display the time as title for location markers
IconGenerator iconFactory = new IconGenerator(this);
iconFactory.setStyle(IconGenerator.STYLE_BLUE);
options.icon(BitmapDescriptorFactory.
fromBitmap(iconFactory.makeIcon(mLastUpdateTime)));
options.anchor(iconFactory.getAnchorU(), iconFactory.getAnchorV());
// Set marker
start = new LatLng(mCurrentLocation.getLatitude(), mCurrentLocation.getLongitude());
options.position(start);
Marker marker = mMap.addMarker(options);
long atTime = mCurrentLocation.getTime();
mLastUpdateTime = DateFormat.getTimeInstance().format(new Date(atTime));
marker.setTitle(mLastUpdateTime);
logEvent("Marker added");
LatLng origin = new LatLng(mCurrentLocation.getLatitude(),mCurrentLocation.getLongitude());
LatLng destination = new LatLng(Latitude, Longitude);
// start = new LatLng(18.015365, -77.499382);
// waypoint= new LatLng(18.01455, -77.499333);
// end = new LatLng(18.012590, -77.500659);
sendRequest();
//
// mMap.addPolyline((new PolylineOptions())
// .add(origin,destination).width(5).color(Color.BLUE)
// .geodesic(true));
// mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(currentLatLng, 15));
// move camera to zoom on map
}
/**
* Request location updates with GoogleApiClient object, LocationRequest and
* listener to pass result.
*/
private void startLocationUpdates() {
logEvent("startLocationUpdates");
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) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
PendingResult<Status> pendingResult = LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, (com.google.android.gms.location.LocationListener) this);
}
/**
* User is leaving screen, so stop location updates
*/
protected void stopLocationUpdates() {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
logEvent("Location update stopped.");
}
/**
* Logs event
* @param event
*/
private void logEvent(String event) {
Log.d(TAG, event);
}
public void sendRequest()
{
if (AppStatus.getInstance(this).isOnline()) {
// Toast.makeText(this,"You are online!!!!",Toast.LENGTH_LONG).show();
route();
} else {
ContextThemeWrapper ctw = new ContextThemeWrapper( StartTrip.this, R.style.Theme_AlertDialog);
final android.app.AlertDialog.Builder alertDialogBuilder = new android.app.AlertDialog.Builder(ctw);
alertDialogBuilder.setTitle("No internet connection");
alertDialogBuilder.setMessage("Check your internet connection or try again");
alertDialogBuilder.setPositiveButton("ok", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
}
});
alertDialogBuilder.show();
// Toast.makeText(this,"You are not online!!!!",Toast.LENGTH_LONG).show();
// Log.v("Home", "############################You are not online!!!!");
}
}
public void route()
{
if(start==null || end==null)
{
if(start==null)
{
if(starting.getText().length()>0)
{
starting.setError("Choose location from dropdown.");
}
else
{
Toast.makeText(this,"Please choose a starting point.",Toast.LENGTH_SHORT).show();
}
}
if(end==null)
{
if(destination.getText().length()>0)
{
destination.setError("Choose location from dropdown.");
}
else
{
Toast.makeText(this,"Please choose a destination.",Toast.LENGTH_SHORT).show();
}
}
}
else
{
Routing routing = new Routing.Builder()
.travelMode(AbstractRouting.TravelMode.DRIVING)
.withListener(this)
.alternativeRoutes(true)
.waypoints(start, end)
.build();
routing.execute();
}
}
@Override
public void onRoutingFailure(RouteException e) {
if(e != null) {
Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show();
}else {
Toast.makeText(this, "Something went wrong, Try again", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onRoutingStart() {
}
@Override
public void onRoutingSuccess(ArrayList<Route> route, int shortestRouteIndex) {
CameraUpdate center = CameraUpdateFactory.newLatLng(start);
CameraUpdate zoom = CameraUpdateFactory.zoomTo(12);
mMap.moveCamera(center);
mMap.moveCamera(zoom);
mMap.getUiSettings().setZoomControlsEnabled(true);
if(polylines.size()>0) {
for (Polyline poly : polylines) {
poly.remove();
}
}
polylines = new ArrayList<>();
//add route(s) to the map.
for (int i = 0; i <route.size(); i++) {
//In case of more than 5 alternative routes
int colorIndex = i % COLORS.length;
PolylineOptions polyOptions = new PolylineOptions();
polyOptions.color(getResources().getColor(COLORS[colorIndex]));
polyOptions.width(10 + i * 3);
polyOptions.addAll(route.get(i).getPoints());
polyOptions.toString();
Polyline polyline = mMap.addPolyline(polyOptions);
polylines.add(polyline);
if(i==0){
// Toast.makeText(getApplicationContext(),"Route "+ (i+1) +": distance- "+ route.get(i).getDistanceValue()/1000+": Time - "+ route.get(i).getDurationValue()/60,Toast.LENGTH_LONG).show();
RouteText.setText("Route "+ (i+1) +": KM- "+ route.get(i).getDistanceValue()/1000+": Time- "+ route.get(i).getDurationValue()/60+"Mints");
}else if(i==1){
// Toast.makeText(getApplicationContext(),"Route "+ (i+1) +": distance- "+ route.get(i).getDistanceValue()+": Time - "+ route.get(i).getDurationValue()/60,Toast.LENGTH_LONG).show();
RouteText1.setText("Route "+ (i+1) +": KM- "+ route.get(i).getDistanceValue()/1000+": Time- "+ route.get(i).getDurationValue()/60+"Mints");
}else if(i==2){
// Toast.makeText(getApplicationContext(),"Route "+ (i+1) +": distance- "+ route.get(i).getDistanceValue()+": Time - "+ route.get(i).getDurationValue()/60,Toast.LENGTH_LONG).show();
RouteText2.setText("Route "+ (i+1) +": KM- "+ route.get(i).getDistanceValue()/1000+": Time - "+ route.get(i).getDurationValue()/60+"Mints");
}
}
// Start marker
MarkerOptions options = new MarkerOptions();
options.position(start);
options.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_directions_bike_black_48dp));
mMap.addMarker(options);
mMap.moveCamera(zoom);
// End marker
// options = new MarkerOptions();
// options.position(end);
// options.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_home_black_48dp));
// mMap.addMarker(options);
}
@Override
public void onRoutingCancelled() {
Log.i(LOG_TAG, "Routing was cancelled.");
}
}
Step 6: Manifest file add permission
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="in.rocareindia.com.rocareindiaems"> <permission android:name="rutul.locationtracker.androidlocationmaps.permission.MAPS_RECEIVE" android:protectionLevel="signature" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> <uses-permission android:name="com.javapapers.android.androidlocationmaps.permission.MAPS_RECEIVE" /> <uses-feature android:glEsVersion="0x00020000" android:required="true" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:largeHeap="true" android:roundIcon="@mipmap/ic_launcher" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".StartTrip" android:screenOrientation="portrait" /> <meta-data android:name="com.google.android.geo.API_KEY" android:value="@string/google_maps_api_key" /> <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> </application> </manifest>
Step 7: Create GPSTracker Class
public class GPSTracker1 extends Service implements LocationListener {
private final
CompleteCondition mContext;
// flag for GPS status
boolean isGPSEnabled = false;
// flag for network status
boolean isNetworkEnabled = false;
// flag for GPS status
boolean canGetLocation = false;
Location location; // location
double latitude; // latitude
double longitude; // longitude
long time;
// The minimum distance to change Updates in meters
private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
// The minimum time between updates in milliseconds
private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
// Declaring a Location Manager
protected LocationManager locationManager;
public GPSTracker1(CompleteCondition context) {
this.mContext = context;
getLocation();
}
public Location getLocation() {
try {
locationManager = (LocationManager) mContext
.getSystemService(LOCATION_SERVICE);
// getting GPS status
isGPSEnabled = locationManager
.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
isNetworkEnabled = locationManager
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider is enabled
} else {
this.canGetLocation = true;
// First get location from Network Provider
if (isNetworkEnabled) {locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (locationManager != null) {
location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
// if GPS Enabled get lat/long using GPS Services
if (isGPSEnabled) {
if (location == null) {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("GPS Enabled", "GPS Enabled");
if (locationManager != null) {
location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (location != null) {
latitude = location.getLatitude();
longitude = location.getLongitude();
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return location;
}
/**
* Stop using GPS listener
* Calling this function will stop using GPS in your app
*/
public void stopUsingGPS() {
if (locationManager != null) {
locationManager.removeUpdates(GPSTracker1.this);
}
}
/**
* Function to get latitude
*/
public double getLatitude() {
if (location != null) {
latitude = location.getLatitude();
}
// return latitude
return latitude;
}
/**
* Function to get longitude
*/
public double getLongitude() {
if (location != null) {
longitude = location.getLongitude();
}
// return longitude
return longitude;
}
/**
* Function to check GPS/wifi enabled
*
* @return boolean
*/
public boolean canGetLocation() {
return this.canGetLocation;
}
/**
* Function to show settings alert dialog
* On pressing Settings button will lauch Settings Options
*/
public void showSettingsAlert() {
AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
// Setting Dialog Title
alertDialog.setTitle("GPS is settings");
// Setting Dialog Message
alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");
// On pressing Settings button
alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mContext.startActivity(intent);
}
});
// on pressing cancel button
alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
// Showing Alert Message
alertDialog.show();
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onProviderDisabled(String provider) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public IBinder onBind(Intent arg0) {
return null;
}
}




