Last active
August 26, 2018 13:08
-
-
Save griajobag/0825424ca335749500ded90e09c178e5 to your computer and use it in GitHub Desktop.
maps route
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package putugunation.com.mapsroute.activities; | |
import android.Manifest; | |
import android.app.Dialog; | |
import android.content.pm.PackageManager; | |
import android.graphics.Color; | |
import android.location.Criteria; | |
import android.location.Location; | |
import android.location.LocationListener; | |
import android.location.LocationManager; | |
import android.os.AsyncTask; | |
import android.os.Bundle; | |
import android.support.v4.app.ActivityCompat; | |
import android.support.v4.app.FragmentActivity; | |
import android.util.Log; | |
import android.widget.TextView; | |
import com.google.android.gms.common.ConnectionResult; | |
import com.google.android.gms.common.GooglePlayServicesUtil; | |
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.model.BitmapDescriptorFactory; | |
import com.google.android.gms.maps.model.LatLng; | |
import com.google.android.gms.maps.model.MarkerOptions; | |
import com.google.android.gms.maps.model.PolylineOptions; | |
import org.json.JSONObject; | |
import java.io.BufferedReader; | |
import java.io.IOException; | |
import java.io.InputStream; | |
import java.io.InputStreamReader; | |
import java.net.HttpURLConnection; | |
import java.net.URL; | |
import java.util.ArrayList; | |
import java.util.HashMap; | |
import java.util.List; | |
import putugunation.com.mapsroute.R; | |
import putugunation.com.mapsroute.helpers.Constant; | |
import putugunation.com.mapsroute.helpers.DirectionsJSONParser; | |
import putugunation.com.mapsroute.helpers.Utils; | |
/** | |
* Created by putuguna on 9/20/2016. | |
*/ | |
public class ViewRouteActivity extends FragmentActivity implements LocationListener { | |
private GoogleMap mGoogleMap; | |
private double mLatitude = 0; | |
private double mLongitude = 0; | |
private double latChosen; | |
private double longChosen; | |
private String namePlace; | |
private String duration; | |
private String distance; | |
private TextView detail; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_view_route); | |
detail = (TextView) findViewById(R.id.detail); | |
latChosen = Double.parseDouble(Utils.getStrings(this, Constant.LAT_CHOSEN)); | |
longChosen = Double.parseDouble(Utils.getStrings(this, Constant.LONG_CHOSEN)); | |
namePlace = Utils.getStrings(this, Constant.NAME_CHOSEN); | |
duration = Utils.getStrings(this, Constant.DURATION_CHOSEN); | |
distance = Utils.getStrings(this, Constant.DISTANCE_CHOSEN); | |
Log.d("TAG", "CHOSEN : " + latChosen + " : " + longChosen); | |
detail.setText("Distance : " + distance + ", Duration : " + duration); | |
// Getting Google Play availability status | |
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext()); | |
if (status != ConnectionResult.SUCCESS) { // Google Play Services are not available | |
int requestCode = 10; | |
Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode); | |
dialog.show(); | |
} else { // Google Play Services are available | |
// Getting reference to SupportMapFragment of the activity_main | |
MapFragment fm = (MapFragment) getFragmentManager().findFragmentById(R.id.map_view); | |
// Getting Map for the SupportMapFragment | |
mGoogleMap = fm.getMapAsync(this); | |
// Enable MyLocation Button in the Map | |
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, 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; | |
} | |
mGoogleMap.setMyLocationEnabled(true); | |
// Getting LocationManager object from System Service LOCATION_SERVICE | |
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); | |
// Creating a criteria object to retrieve provider | |
Criteria criteria = new Criteria(); | |
// Getting the name of the best provider | |
String provider = locationManager.getBestProvider(criteria, true); | |
// Getting Current Location From GPS | |
Location location = locationManager.getLastKnownLocation(provider); | |
if(location!=null){ | |
onLocationChanged(location); | |
} | |
locationManager.requestLocationUpdates(provider, 20000, 0, this); | |
LatLng origin = new LatLng(mLatitude, mLongitude); | |
LatLng dest = new LatLng(latChosen, longChosen); | |
// Getting URL to the Google Directions API | |
String url = getDirectionsUrl(origin, dest); | |
DownloadTask downloadTask = new DownloadTask(); | |
// Start downloading json data from Google Directions API | |
downloadTask.execute(url); | |
} | |
// otherMarker(); | |
} | |
@Override | |
public void onLocationChanged(Location location) { | |
// Draw the marker, if destination location is not set | |
mLatitude = location.getLatitude(); | |
mLongitude = location.getLongitude(); | |
LatLng point = new LatLng(mLatitude, mLongitude); | |
mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(point)); | |
mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12)); | |
drawMarker(point); | |
} | |
@Override | |
public void onStatusChanged(String provider, int status, Bundle extras) { | |
} | |
@Override | |
public void onProviderEnabled(String provider) { | |
} | |
@Override | |
public void onProviderDisabled(String provider) { | |
} | |
/** | |
* this method used to get LatLng of origin and destination | |
* @param origin | |
* @param dest | |
* @return | |
*/ | |
private String getDirectionsUrl(LatLng origin,LatLng dest){ | |
// Origin of route | |
String str_origin = "origin="+origin.latitude+","+origin.longitude; | |
// Destination of route | |
String str_dest = "destination="+dest.latitude+","+dest.longitude; | |
// Sensor enabled | |
String sensor = "sensor=false"; | |
// Building the parameters to the web service | |
String parameters = str_origin+"&"+str_dest+"&"+sensor; | |
// Output format | |
String output = "json"; | |
// Building the url to the web service | |
String url = "https://maps.googleapis.com/maps/api/directions/"+output+"?"+parameters; | |
return url; | |
} | |
/** | |
* this method used to download json's data from URL | |
* @param strUrl | |
* @return | |
* @throws IOException | |
*/ | |
private String downloadUrl(String strUrl) throws IOException { | |
String data = ""; | |
InputStream iStream = null; | |
HttpURLConnection urlConnection = null; | |
try{ | |
URL url = new URL(strUrl); | |
// Creating an http connection to communicate with url | |
urlConnection = (HttpURLConnection) url.openConnection(); | |
// Connecting to url | |
urlConnection.connect(); | |
// Reading data from url | |
iStream = urlConnection.getInputStream(); | |
BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); | |
StringBuffer sb = new StringBuffer(); | |
String line = ""; | |
while( ( line = br.readLine()) != null){ | |
sb.append(line); | |
} | |
data = sb.toString(); | |
br.close(); | |
}catch(Exception e){ | |
Log.d("TAG","Exception while downloading url"+ e.toString()); | |
}finally{ | |
iStream.close(); | |
urlConnection.disconnect(); | |
} | |
return data; | |
} | |
/** A class to download data from Google Directions URL */ | |
private class DownloadTask extends AsyncTask<String,Void,String> { | |
// Downloading data in non-ui thread | |
@Override | |
protected String doInBackground(String... url) { | |
// For storing data from web service | |
String data = ""; | |
try{ | |
// Fetching the data from web service | |
data = downloadUrl(url[0]); | |
}catch(Exception e){ | |
Log.d("Background Task",e.toString()); | |
} | |
return data; | |
} | |
// Executes in UI thread, after the execution of | |
// doInBackground() | |
@Override | |
protected void onPostExecute(String result) { | |
super.onPostExecute(result); | |
ParserTask parserTask = new ParserTask(); | |
// Invokes the thread for parsing the JSON data | |
parserTask.execute(result); | |
} | |
} | |
/** A class to parse the Google Directions in JSON format */ | |
private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String,String>>> >{ | |
// Parsing the data in non-ui thread | |
@Override | |
protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) { | |
JSONObject jObject; | |
List<List<HashMap<String, String>>> routes = null; | |
try{ | |
jObject = new JSONObject(jsonData[0]); | |
DirectionsJSONParser parser = new DirectionsJSONParser(); | |
// Starts parsing data | |
routes = parser.parse(jObject); | |
}catch(Exception e){ | |
e.printStackTrace(); | |
} | |
return routes; | |
} | |
// Executes in UI thread, after the parsing process | |
@Override | |
protected void onPostExecute(List<List<HashMap<String, String>>> result) { | |
ArrayList<LatLng> points = null; | |
PolylineOptions lineOptions = null; | |
// Traversing through all the routes | |
for(int i=0;i<result.size();i++){ | |
points = new ArrayList<LatLng>(); | |
lineOptions = new PolylineOptions(); | |
// Fetching i-th route | |
List<HashMap<String, String>> path = result.get(i); | |
// Fetching all the points in i-th route | |
for(int j=0;j<path.size();j++){ | |
HashMap<String,String> point = path.get(j); | |
double lat = Double.parseDouble(point.get("lat")); | |
double lng = Double.parseDouble(point.get("lng")); | |
LatLng position = new LatLng(lat, lng); | |
points.add(position); | |
} | |
// Adding all the points in the route to LineOptions | |
lineOptions.addAll(points); | |
lineOptions.width(2); | |
lineOptions.color(Color.RED); | |
} | |
// Drawing polyline in the Google Map for the i-th route | |
mGoogleMap.addPolyline(lineOptions); | |
} | |
} | |
/** | |
* this method used to draw a marker from LatLng | |
* @param point | |
*/ | |
private void drawMarker(LatLng point){ | |
// Creating MarkerOptions | |
MarkerOptions options = new MarkerOptions(); | |
options.position(point); | |
options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)); | |
options.title("Hi You!"); | |
options.snippet("Your Location"); | |
mGoogleMap.addMarker(options).showInfoWindow(); | |
//map others | |
mGoogleMap.addMarker(new MarkerOptions().position(new LatLng(latChosen, longChosen)).title(namePlace).snippet("Your Destination")).showInfoWindow(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment