Write a program to find the direction from user's current location to MSBTE,

Bandra.





AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.example.msbte.google_map_currentlocationroute">

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"

/>

<application

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:roundIcon="@mipmap/ic_launcher_round"

android:supportsRtl="true"

android:theme="@style/AppTheme">

<meta-data

android:name="com.google.android.gms.version"

android:value="@integer/google_play_services_version" />

<meta-data

android:name="com.google.android.geo.API_KEY"

android:value="@string/google_maps_key" />

<activity android:name=".MainActivity">

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

</application>

</manifest>

MainActivity.java

import android.Manifest;

import android.content.DialogInterface;

import android.content.Intent;

import android.content.pm.PackageManager;

import android.location.Location;

import android.net.Uri;

import android.provider.Settings;

import android.support.v4.app.ActivityCompat;

import android.support.v7.app.AlertDialog;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.TextView;

import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;

import com.google.android.gms.common.api.GoogleApiClient;

import com.google.android.gms.location.LocationRequest;

import com.google.android.gms.location.LocationServices;

import com.google.android.gms.maps.CameraUpdateFactory;

import com.google.android.gms.maps.GoogleMap;

import com.google.android.gms.maps.MapFragment;

import com.google.android.gms.maps.OnMapReadyCallback;

import com.google.android.gms.maps.model.CameraPosition;

import com.google.android.gms.maps.model.LatLng;

import com.google.android.gms.maps.model.MarkerOptions;

import com.google.android.gms.maps.model.Polyline;

import com.google.android.gms.maps.model.PolylineOptions;

import com.karumi.dexter.Dexter;

import com.karumi.dexter.MultiplePermissionsReport;

import com.karumi.dexter.PermissionToken;

import com.karumi.dexter.listener.DexterError;

import com.karumi.dexter.listener.PermissionRequest;

import com.karumi.dexter.listener.PermissionRequestErrorListener;

import com.karumi.dexter.listener.multi.MultiplePermissionsListener;

import java.util.List;

public class MainActivity extends AppCompatActivity implements

GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener,

com.google.android.gms.location.LocationListener , OnMapReadyCallback,

TaskLoadedCallback{

//variables for map and route

private GoogleMap mMap;

private MarkerOptions place1, place2;

Button getDirection;

private Polyline currentPolyline;

private MapFragment mapFragment;

private boolean isFirstTime = true;

//variables for current location

private static final String TAG = "MainActivity";

private TextView tvLocation;

private GoogleApiClient mGoogleApiClient;

private Location mLocation;

private LocationRequest mLocationRequest;

private com.google.android.gms.location.LocationListener listener;

private long UPDATE_INTERVAL = 2 * 1000; /* 10 secs */

// Building the url to the web service

String url = "https://maps.googleapis.com/maps/api/directions/" + output + "?" +

parameters + "&key=" + getString(R.string.google_maps_key);

return url;

}

@Override

public void onTaskDone(Object... values) {

if (currentPolyline != null)

currentPolyline.remove();

currentPolyline = mMap.addPolyline((PolylineOptions) values[0]);

}

//runtime permission method

private void requestMultiplePermissions(){

Dexter.withActivity(this)

.withPermissions(

Manifest.permission.ACCESS_FINE_LOCATION,

Manifest.permission.ACCESS_COARSE_LOCATION )

.withListener(new MultiplePermissionsListener() {

@Override

public void onPermissionsChecked(MultiplePermissionsReport report) {

// check if all permissions are granted

if (report.areAllPermissionsGranted()) {

Toast.makeText(getApplicationContext(), "All permissions are granted by

user!", Toast.LENGTH_SHORT).show();

}

// check for permanent denial of any permission

if (report.isAnyPermissionPermanentlyDenied()) {

// show alert dialog navigating to Settings

openSettingsDialog();

}

}

@Override

public void onPermissionRationaleShouldBeShown(List<PermissionRequest>

permissions, PermissionToken token) {

token.continuePermissionRequest();

}

}).

withErrorListener(new PermissionRequestErrorListener() {

@Override

public void onError(DexterError error) {

Toast.makeText(getApplicationContext(), "Some Error! ",

Toast.LENGTH_SHORT).show();

}

})

.onSameThread()

.check();

}

private void openSettingsDialog() {

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

builder.setTitle("Required Permissions");

builder.setMessage("This app require permission to use awesome feature. Grant them in

app settings.");

builder.setPositiveButton("Take Me To SETTINGS", new

DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

dialog.cancel();

Intent intent = new

Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);

Uri uri = Uri.fromParts("package", getPackageName(), null);

intent.setData(uri);

startActivityForResult(intent, 101);

}

});

builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

dialog.cancel();

}

});

builder.show();

}

//methods for getting current location

@Override

public void onConnected(Bundle bundle) {

if (ActivityCompat.checkSelfPermission(this,

Manifest.permission.ACCESS_FINE_LOCATION) !=

PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,

Manifest.permission.ACCESS_COARSE_LOCATION) !=

PackageManager.PERMISSION_GRANTED) {

return;

}

startLocationUpdates();

mLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

if(mLocation == null){

startLocationUpdates();

}

if (mLocation != null) {

// mLatitudeTextView.setText(String.valueOf(mLocation.getLatitude()));

//mLongitudeTextView.setText(String.valueOf(mLocation.getLongitude()));

} else {

Toast.makeText(this, "Location not Detected", Toast.LENGTH_SHORT).show();

} }

@Override

public void onConnectionSuspended(int i) {

Log.i(TAG, "Connection Suspended");

mGoogleApiClient.connect();

}

@Override

public void onConnectionFailed(ConnectionResult connectionResult) {

Log.i(TAG, "Connection failed. Error: " + connectionResult.getErrorCode());

}

@Override

protected void onStart() {

super.onStart();

if (mGoogleApiClient != null) {

mGoogleApiClient.connect();

} }

@Override

protected void onStop() {

super.onStop();

if (mGoogleApiClient.isConnected()) {

mGoogleApiClient.disconnect();

} }

protected void startLocationUpdates() {

// Create the location request

mLocationRequest = LocationRequest.create()

.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)

.setInterval(UPDATE_INTERVAL)

.setFastestInterval(FASTEST_INTERVAL);

if (ActivityCompat.checkSelfPermission(this,

Manifest.permission.ACCESS_FINE_LOCATION) !=

PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,

Manifest.permission.ACCESS_COARSE_LOCATION) !=

PackageManager.PERMISSION_GRANTED) {

return;

}

LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient,

mLocationRequest, this);

}

@Override

public void onLocationChanged(Location location) {

String msg = "Updated Location: " +

Double.toString(location.getLatitude()) + "," +

Double.toString(location.getLongitude());

tvLocation.setText(String.valueOf(location.getLatitude() +"

"+String.valueOf(location.getLongitude())));

Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();

if(isFirstTime){

//code to draw path on map

getDirection = findViewById(R.id.btnGetDirection);

getDirection.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

new FetchURL(MainActivity.this).execute(getUrl(place1.getPosition(),

place2.getPosition(), "driving"), "driving");

}

});

place1 = new MarkerOptions().position(new LatLng(location.getLatitude(),

location.getLongitude())).title("Location 1");

place2 = new MarkerOptions().position(new

LatLng(19.021824,72.8662016)).title("MSBTE");

mapFragment = (MapFragment)

getFragmentManager().findFragmentById(R.id.mapNearBy);

mapFragment.getMapAsync(this);

isFirstTime = false;

} }}