update value of holder textview in AsyncTask - android

I'm using google direction API to get the duration between my location and nearby places and it's working. But, I face problem in setting the duration value where the value is in onPostExecute.I tried to make duration global but it does not work. By the way, my textview is in ViewHolder class.
public class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String,String>>> >{
String distance = "";
String duration = "";
// Parsing the data in non-ui thread
#Override
public 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
public void onPostExecute(List<List<HashMap<String, String>>> result) {
/*ArrayList<LatLng> points = null;
PolylineOptions lineOptions = null;
MarkerOptions markerOptions = new MarkerOptions();*/
if(result.size()<1){
Toast.makeText(context, "No Points", Toast.LENGTH_SHORT).show();
return;
}
// Traversing through all the routes
for(int i=0;i<result.size();i++){
// 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);
if(j==0){ // Get distance from the list
distance = (String)point.get("distance");
continue;
}else if(j==1){ // Get duration from the list
duration = (String)point.get("duration");
continue;
}
}
}
//holder.val.setText("value"+duration);
Toast.makeText(context,"Duration:"+duration ,Toast.LENGTH_LONG).show();
}

Related

How to draw more than one route, between origin and destination, googlemaps api?

I have a code to draw a route for the user. But, I would like it to be drawn, the alternative routes, too. I changed the URL by passing the parameter alternatives=true and also the source code to bring the other routes. But, it's just being drawn, just one route.
I made these changes, based on the questions and answers, also here on the page.
Code:
Map, receive the polylines and draw to user:
if (rota != null) {
map.addPolyline(ApplicationUtils.getApplicationUtils().getPolylineOptions());
//Adicionando ponto inicial
CircleOptions circle = new CircleOptions().center(ultimaLocation);
circle.fillColor(Color.DKGRAY);
circle.radius(15); // Em metros
map.addCircle(circle);
}
Calculate route:
public void calculateRoute(LatLng origin, LatLng dest, String mode, RotaListener rotaListener) {
this.rotaListener = rotaListener;
try {
// Getting URL to the Google Directions API
String url = getDirectionsUrl(origem, destino, modo);
Log.d(TAG, "URL DIRECTIONS = " + url);
DownloadTask downloadTask = new DownloadTask();
// Start downloading json data from Google Directions API
downloadTask.execute(url);
} catch (Exception e) {
rotaListener.onFailure(e);
}
}
private String getDirectionsUrl(LatLng origin, LatLng dest, String mode) {
// 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";
String str_mode = "mode=" + mode;
// Building the parameters to the web service
String parameters = str_origin + "&" + str_dest + "&" + sensor + "&" + str_mode +"&alternatives=true" ;
// Output format
String output = "json";
// Building the url to the web service
String url = "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters + "&key=" + MY_API_KEY;
;
return url;
}
/**
* 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) {
try {
// 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;
} catch (Exception e) {
rotaListener.onFailure(e);
return "";
}
}
// Executes in UI thread, after the execution of
// doInBackground()
#Override
protected void onPostExecute(String result) {
try {
super.onPostExecute(result);
ParserTask parserTask = new ParserTask();
// Invokes the thread for parsing the JSON data
if (rotaListener != null) {
rotaListener.onRotaChanged(result);
parserTask.execute(result);
}
} catch (Exception e) {
rotaListener.onFailure(e);
}
}
}
/**
* A class to parse the Google Directions in JSON format
*/
private class ParserTask extends AsyncTask<String, Integer, PolylineOptions> {
// Parsing the data in non-ui thread
#Override
protected PolylineOptions doInBackground(String... jsonData) {
try {
JSONObject jObject;
List<Rota> routes = null;
try {
jObject = new JSONObject(jsonData[0]);
DirectionsJSONParser parser = new DirectionsJSONParser();
// Starts parsing data
routes = parser.parse(jObject);
} catch (Exception e) {
e.printStackTrace();
}
ArrayList<LatLng> points = null;
PolylineOptions lineOptions = null;
// Traversing through all the routes
for (int i = 0; i < routes.size(); i++) {
points = new ArrayList<LatLng>();
lineOptions = new PolylineOptions();
// Fetching i-th route
List<HashMap<String, String>> path = routes.get(i).Pontos;
rotaListener.onTempoRotaChanged(routes.get(i).TempoEstimadoMin);
// 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(LARGURA_ROTA);
lineOptions.color(COR_ROTA);
lineOptions.geodesic(true);
ApplicationUtils.getApplicationUtils().setPolylineOptions(lineOptions);
}
return lineOptions;
} catch (Exception e) {
rotaListener.onFailure(e);
return null;
}
}
// Executes in UI thread, after the parsing process
#Override
protected void onPostExecute(PolylineOptions result) {
// Drawing polyline in the Google Map for the i-th route
try {
if (rotaListener != null) {
rotaListener.onInstrucoesRotaChanged(result);
rotaListener = null;
}
} catch (Exception e) {
rotaListener.onFailure(e);
}
}
}
public class DirectionsJSONParser {
/**
* Receives a JSONObject and returns a list of lists containing latitude and longitude
*/
public List<Rota> parse(JSONObject jObject) {
List<Rota> routes = new ArrayList<Rota>();
JSONArray jRoutes = null;
JSONArray jLegs = null;
JSONArray jSteps = null;
JSONObject jDuration = null;
Rota rota;
try {
jRoutes = jObject.getJSONArray("routes");
/** Traversing all routes */
for (int i = 0; i < jRoutes.length(); i++) {
jLegs = ((JSONObject) jRoutes.get(i)).getJSONArray("legs");
List path = new ArrayList<HashMap<String, String>>();
/** Traversing all legs */
for (int j = 0; j < jLegs.length(); j++) {
jSteps = ((JSONObject) jLegs.get(j)).getJSONArray("steps");
rota = new Rota();
jDuration = ((JSONObject) jLegs.get(j)).getJSONObject("duration");
if (jDuration != null) {
rota.TempoEstimadoMin = jDuration.getInt("value") / 60;
}
/** Traversing all steps */
for (int k = 0; k < jSteps.length(); k++) {
String polyline = "";
polyline = (String) ((JSONObject) ((JSONObject) jSteps.get(k)).get("polyline")).get("points");
List<LatLng> list = decodePoly(polyline);
/** Traversing all points */
for (int l = 0; l < list.size(); l++) {
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("lat", Double.toString(((LatLng) list.get(l)).latitude));
hm.put("lng", Double.toString(((LatLng) list.get(l)).longitude));
path.add(hm);
}
}
rota.Pontos = path;
routes.add(rota);
}
}
} catch (JSONException e) {
e.printStackTrace();
} catch (Exception e) {
}
return routes;
}
If possible, I would like some help so that I can draw more than one route for the user.
Thank you!
I think you should be doing this inside of the doInBackground task:
for (int i = 0; i < routes.size(); i++) {
...
// Adding all the points in the route to LineOptions
lineOptions.addAll(points);
lineOptions.width(LARGURA_ROTA);
// Change the color with every new iteration of the route
lineOptions.color(COR_ROTA);
lineOptions.geodesic(true);
ApplicationUtils.getApplicationUtils().setPolylineOptions(lineOptions)
map.addPolyline(ApplicationUtils.getApplicationUtils().getPolylineOptions());
lineOptions = null;
}
We're using slightly different libraries, but this is what my code looks like (encoded path is a string representing a group of lat/lons):
pathDynamic = new PolylineOptions().width(15).color(Color.RED);
pathDynamic.addAll(decode(item.getEncodedPath()));
if (mMap != null) {
mMap.addPolyline(pathDynamic);
}
I resolved by changing my parser class.
Adding points in each iteration of FOR to specific variables
private class ParserTask1 extends AsyncTask<String, Integer, List<List<List<HashMap<String, String>>>>> {
// Parsing the data in non-ui thread
#Override
protected List<List<List<HashMap<String, String>>>> doInBackground(String... jsonData) {
JSONObject jObject;
List<List<List<HashMap<String, String>>>> routes = null;
try {
jObject = new JSONObject(jsonData[0]);
DirectionsJSONParser1 parser = new DirectionsJSONParser1();
// 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<List<HashMap<String, String>>>> result) {
ArrayList<LatLng> points = null;
PolylineOptions lineOptions = new PolylineOptions();
PolylineOptions lineOptions1 = null;
List<LatLng> aline1 = new ArrayList<LatLng>();
List<LatLng> aline2 = new ArrayList<LatLng>();
List<LatLng> aline3 = new ArrayList<LatLng>();
Rota rota = new Rota();
List<HashMap<String, String>> rotaNumero = new ArrayList<>();
HashMap<String, String> pointNumber = null;
if (result != null) {
int i = 0;
Log.d(SHETTY, "onPostExecute: result size " + result.size());
while (i < result.size()) {
// for(int i=0;i<result.size();i++){
//result.size()
//int g= i-1;
points = new ArrayList<LatLng>();
// lineOptions = new PolylineOptions();
// if(i==1){
// }else{
List<List<HashMap<String, String>>> path1 = result.get(i);
for (int s = 0; s < path1.size(); s++) {
Log.d("pathsize1", path1.size() + "");
// Fetching i-th route
List<HashMap<String, String>> path = path1.get(s);
Log.d("pathsize", path.size() + "");
// Fetching all the points in i-th route
for (int j = 0; j < path.size(); j++) {
lineOptions1 = new PolylineOptions();
HashMap<String, String> point = path.get(j);
pointNumber = path.get(j);
double lat = Double.parseDouble(point.get("lat"));
double lng = Double.parseDouble(point.get("lng"));
LatLng position = new LatLng(lat, lng);
// Log.d("latlng", position.toString());
points.add(position);
}
}
if (i == 0) {
rotaNumero.add(pointNumber);
ApplicationUtils.getApplicationUtils().setPoints(rotaNumero);
aline1.addAll(points);
ApplicationUtils.getApplicationUtils().setAline1(aline1);
rotaNumero.clear();
} else if (i == 1) {
rotaNumero.add(pointNumber);
ApplicationUtils.getApplicationUtils().setPoints2(rotaNumero);
aline2.addAll(points);
ApplicationUtils.getApplicationUtils().setAline2(aline2);
rotaNumero.clear();
} else if (i == 2) {
rotaNumero.add(pointNumber);
ApplicationUtils.getApplicationUtils().setPoints2(rotaNumero);
aline3.addAll(points);
ApplicationUtils.getApplicationUtils().setAline3(aline3);
rotaNumero.clear();
}
// Adding all the points in the route to LineOptions
i++;
}
try {
if (rotaListener != null) {
rotaListener.onInstrucoesRotaChanged(lineOptions.addAll(ApplicationUtils.getApplicationUtils().getAline1()));
rotaListener = null;
}
} catch (Exception e) {
rotaListener.onFailure(e);
}
}
}
}
After inserting the points, in my class where I have the map, I draw the routes.
private void drawRoutes() {
line1 = new PolylineOptions().width(10).color(baseActivity.getResources().getColor(R.color.btn_map_inserir_pressed));
line2 = new PolylineOptions().width(10).color(baseActivity.getResources().getColor(R.color.verde_novo));
line3 = new PolylineOptions().width(10).color(baseActivity.getResources().getColor(R.color.azul));
line1.addAll(ApplicationUtils.getApplicationUtils().getAline1());
map.addPolyline(line1);
if (ApplicationUtils.getApplicationUtils().getAline2() != null) {
line2.addAll(ApplicationUtils.getApplicationUtils().getAline2());
map.addPolyline(line2);
}
if (ApplicationUtils.getApplicationUtils().getAline3() != null) {
line3.addAll(ApplicationUtils.getApplicationUtils().getAline3());
map.addPolyline(line3);
}
}

How to create multi polyline with multiple color in google map android?

This may be asked many time but none of the solutions worked for me when i try to plot multiple routes with different polyline i need to show the each polyline with different color but what am getting is black color polyline which i haven't used anywhere let me post my screen shot of the map
Let me post my colde ,am using google map api for fetching location;
public class GetDistance extends AsyncTask<Double, Void, String> {
private ProgressDialog pd;
private static final int READ_TIMEOUT = 6000;
private static final int CONNECTION_TIMEOUT = 6000;
#Override
protected void onPreExecute() {
super.onPreExecute();
pd = new ProgressDialog(VisitTravel.this);
pd.setMessage("Please wait");
pd.show();
}
#Override
protected String doInBackground(Double... strings) {
URL url;
try {
url = new URL("http://maps.googleapis.com/maps/api/directions/json?origin=" + strings[0] + "," + strings[1] + "&destination=" + strings[2] + "," + strings[3] + "&sensor=false&units=metric&mode=driving&alternatives=true");
HttpURLConnection conn;
conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(READ_TIMEOUT);
conn.setConnectTimeout(CONNECTION_TIMEOUT);
conn.setRequestMethod("POST");
InputStream in;
in = new BufferedInputStream(conn.getInputStream());
StringBuilder buffer = new StringBuilder();
BufferedReader reader;
reader = new BufferedReader(new InputStreamReader(in));
String inputLine;
while ((inputLine = reader.readLine()) != null)
buffer.append(inputLine).append("\n");
if (buffer.length() == 0) {
// Stream was empty. No point in parsing.
Log.e("empty", "empty");
}
JsonResponse = buffer.toString();
Log.d("response", JsonResponse);
} catch (IOException e1) {
e1.printStackTrace();
}
return JsonResponse;
}
#Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
pd.dismiss();
new ParserTask().execute(result);
}
}
This is paresertask code:
private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {
private ArrayList<LatLng> points;
#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]);
DirectionJSONParser parser = new DirectionJSONParser();
// Starts parsing data
routes = parser.parse(jObject);
} catch (Exception e) {
e.printStackTrace();
}
return routes;
}
#Override
protected void onPostExecute(List<List<HashMap<String, String>>> result) {
PolylineOptions polylineOptionss=null;
// MarkerOptions markerOptions = new MarkerOptions();
// Traversing through all the routes
for (int i = 0; i < result.size(); i++) {
points = new ArrayList<>();
// 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);
if (j == 0) {
duration = point.get("duration");
Log.d("duration", duration);
continue;
}
double lat = Double.parseDouble(point.get("lat"));
double lng = Double.parseDouble(point.get("lng"));
LatLng position = new LatLng(lat, lng);
points.add(position);
}
polylineOptionss=new PolylineOptions();
// Adding all the points in the route to LineOptions
polylineOptionss.addAll(points);
// polylineOptions.width(7);
// Random rnd = new Random();
// int color = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
//Here only am creating polyline for different points but am getting black
if(i==0) {
PolylineOptions polylineOptions0=new PolylineOptions();
polylineOptions0.addAll(points);
// mGoogleMap.setTrafficEnabled(true);
polylineOptions0.width(15);
polylineOptions0.color(Color.parseColor("#9c27b0"));
polylineOptions0.geodesic(true);
mGoogleMap.addPolyline(polylineOptions0);
}
else if(i==1){
PolylineOptions polylineOptions1=new PolylineOptions();
polylineOptions1.addAll(points);
polylineOptions1.geodesic(true);
polylineOptions1.width(15);
// mGoogleMap.setTrafficEnabled(true);
mGoogleMap.addPolyline(polylineOptions1);
polylineOptions1.color(Color.parseColor("#ffffff"));
}
else if(i==2){
PolylineOptions polylineOptions2=new PolylineOptions();
polylineOptions2.addAll(points);
polylineOptions2.geodesic(true);
polylineOptions2.width(15);
mGoogleMap.addPolyline(polylineOptions2);
// mGoogleMap.setTrafficEnabled(true);
polylineOptions2.color(Color.parseColor("#ffffff"));
}
else {
PolylineOptions polylineOptions3=new PolylineOptions();
polylineOptions3.addAll(points);
// mGoogleMap.setTrafficEnabled(true);
polylineOptions3.width(15);
polylineOptions3.geodesic(true);
mGoogleMap.addPolyline(polylineOptions3);
polylineOptions3.color(Color.parseColor("#ffffff"));
}
}
CameraAnimation(polylineOptionss);
// mGoogleMap.addPolyline(polylineOptions);
// Drawing polyline in the Google Map for the i-th route
}
Can someone please tell me how to differentiate the polyline with different colors am struggling with this. Thanks in advance!!!
Just move your polylineOptions.color(); code before mGoogleMap.addPolyline().
For example:
polylineOptions1.color(Color.parseColor("#ffffff"));
mGoogleMap.addPolyline(polylineOptions1);

Android ProgressDialog stops spinning before the task is completed

I am using progress dialog in my Asynctask class on onpreExecte() method, and dismissing the dialog in onPostExecute while google makes the routes of the map. My problem is the wheel in dialog is stopping after 2-3 seconds but my background process is still working.
private class ParserTask extends
AsyncTask<String, Integer, List<List<HashMap<String, String>>>> {
#Override
protected void onPreExecute() {
dialog = new ProgressDialog(MapaViagem.this);
// setup your dialog here
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setTitle("Traçando Rotas");
dialog.setMessage("Aguarde...");
dialog.setCancelable(false);
dialog.show();
}
#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]);
PathJSONParser parser = new PathJSONParser();
routes = parser.parse(jObject);
} catch (Exception e) {
e.printStackTrace();
}
return routes;
}
#Override
protected void onPostExecute(List<List<HashMap<String, String>>> routes) {
ArrayList<LatLng> points = null;
PolylineOptions polyLineOptions = null;
// traversing through routes
for (int i = 0; i < routes.size(); i++) {
points = new ArrayList<LatLng>();
polyLineOptions = new PolylineOptions();
List<HashMap<String, String>> path = routes.get(i);
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);
}
polyLineOptions.addAll(points);
polyLineOptions.width(4);
polyLineOptions.color(Color.BLUE);
}
googleMap.addPolyline(polyLineOptions);
if (dialog.isShowing()) {
dialog.dismiss();
}
}
}
You must put all the "procesing" code inside the doInBackground, that means all the code you have inside the onPostExcecute. Only the things that modify the UI should be in the onPostExcecute (like for example show a message to the user, change text of a TextView, etc.), else you will get your UI stucked.
I had the same problem and resolved it this way.
Hope it helps

Continuously update marker when location changed on Android

I'm trying to implement an simple navigation app using Google maps. Initially I developed a code for marking two Geo points on map and showing route between them.
Now I am trying to move the first marker towards second marker (destination) based on users location.
For this I used LocationListener and implemented code in onLocationChanged.
The problem is onLocationChanged is not getting fired and marker is not moving based on user location.
Here is my code.
MapActivity.java
public class MapActivity extends FragmentActivity implements OnMapClickListener, LocationListener{
private GoogleMap gMap;
private ArrayList<LatLng> markersArray; //Marker points ArrayList
private ArrayList<Marker> markers;
private MarkerOptions options; //Marker options
String distance="";
String duration="";
private TextView travelDetails;
private ProgressDialog pDialog;
private double lattitude=0.0;
private double longitude=0.0;
Marker mMarker;
String bestAvailableProvider;
private LocationManager mLocationManager;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
//Loading Google Maps
try{
loadMapView();
markersArray=new ArrayList<LatLng>();
markers=new ArrayList<Marker>();
gMap.setOnMapClickListener(this);
gMap.setMyLocationEnabled(true);
gMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
travelDetails=(TextView) findViewById(R.id.lbl_traveldetails);
pDialog=new ProgressDialog(MapActivity.this);
}catch(Exception e){
e.printStackTrace();
}
}
/*
* This method loads map
*
*/
private void loadMapView(){
if (gMap==null) {
gMap=((SupportMapFragment)getSupportFragmentManager()
.findFragmentById(R.id.map_fragment)).getMap();
}
mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
// Specify Location Provider criteria
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setSpeedRequired(false);
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,this);
}
/*
* catches onclick event of map
* #see com.google.android.gms.maps.GoogleMap.OnMapClickListener#onMapClick(com.google.android.gms.maps.model.LatLng)
*/
#Override
public void onMapClick(LatLng point) {
//Clearing markers in map
if (markersArray.size()>1) {
markersArray.clear();
gMap.clear();
}
//Adding marker to array
markersArray.add(point);
//marking point on Map
addMarkerOnMap(point);
//Drawing route when two markers are placed
if(markersArray.size() >= 2){
LatLng origin = markersArray.get(0);
LatLng dest = markersArray.get(1);
String url = getDirectionsUrl(origin, dest);
DownloadTask downloadTask = new DownloadTask();
downloadTask.execute(url);
}
}
/*
* This method places markers on map
*/
private void addMarkerOnMap(LatLng point){
//Marking points on map
options=new MarkerOptions();
options.position(point);
//Setting marker icons
if (markersArray.size()==1) {
//Source marker point
options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
}else if(markersArray.size()==2){
//Destination marker point
options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
}
//adding marker point to map
try{
Marker mMarker=gMap.addMarker(options);
markers.add(mMarker);
}catch(Exception e){
e.printStackTrace();
}
}
/*
* Getting direction url between two points
*
*/
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";
String url = "https://maps.googleapis.com/maps/api/directions/"+output+"?"+parameters;
return url;
}
/*
* passing the direction url
*
*/
private class DownloadTask extends AsyncTask<String, Void, String>{
#Override
protected void onPreExecute() {
super.onPreExecute();
pDialog.show();
pDialog.setMessage("Loading route...");
pDialog.setCancelable(false);
}
// 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);
}
}
/*
* downloading from url
*
*/
private String downloadUrl(String strUrl) throws IOException{
String data = "";
InputStream iStream = null;
HttpURLConnection urlConnection = null;
try{
URL url = new URL(strUrl);
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("Exception while downloading url", e.toString());
}finally{
iStream.close();
urlConnection.disconnect();
}
return data;
}
private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String,String>>>>{
#Override
protected void onPreExecute() {
super.onPreExecute();
}
#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;
}
#Override
protected void onPostExecute(List<List<HashMap<String, String>>> result) {
ArrayList<LatLng> points = null;
PolylineOptions lineOptions = null;
// MarkerOptions markerOptions = new MarkerOptions();
// 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);
if(j==0){ // Get distance from the list
distance = (String)point.get("distance");
continue;
}else if(j==1){ // Get duration from the list
duration = (String)point.get("duration");
continue;
}
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(5);
lineOptions.color(Color.BLUE);
}
// Drawing polyline in the Google Map for the i-th route
try{
gMap.addPolyline(lineOptions);
travelDetails.setText("Distance:"+distance+"Duration:"+duration);
pDialog.dismiss();
}catch (Exception e) {
if (pDialog.isShowing()) {
pDialog.dismiss();
}
Toast.makeText(getApplicationContext(), "No Road route found.", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
}
#Override
protected void onResume() {
super.onResume();
loadMapView();
}
#Override
protected void onPause() {
super.onPause();
mLocationManager.removeUpdates(this);
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.map, menu);
return true;
}
/*
* (non-Javadoc)
* #see com.google.android.gms.maps.LocationSource.OnLocationChangedListener#onLocationChanged(android.location.Location)
*/
#Override
public void onLocationChanged(Location location) {
Log.e("loca", ""+location.getLatitude());
try {
if(markersArray.size()>0){
lattitude=location.getLatitude();
longitude=location.getLongitude();
LatLng mLatLng=new LatLng(lattitude, longitude);
Marker newMarker=markers.get(0);
newMarker.setPosition(mLatLng);
gMap.animateCamera(CameraUpdateFactory.newLatLng(mLatLng));
}
} catch (Exception e) {
e.printStackTrace();
}
}
#Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
#Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
#Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
DirectionsJsonParser.java
public class DirectionsJsonParser {
public List<List<HashMap<String,String>>> parse(JSONObject jObject){
List<List<HashMap<String, String>>> routes = new ArrayList<List<HashMap<String,String>>>() ;
JSONArray jRoutes = null;
JSONArray jLegs = null;
JSONArray jSteps = null;
JSONObject jDistance = null;
JSONObject jDuration = null;
try {
jRoutes = jObject.getJSONArray("routes");
for(int i=0;i<jRoutes.length();i++){
jLegs = ( (JSONObject)jRoutes.get(i)).getJSONArray("legs");
List path = new ArrayList<HashMap<String, String>>();
for(int j=0;j<jLegs.length();j++){
jSteps = ( (JSONObject)jLegs.get(j)).getJSONArray("steps");
/** Getting distance from the json data */
jDistance = ((JSONObject) jLegs.get(j)).getJSONObject("distance");
HashMap<String, String> hmDistance = new HashMap<String, String>();
hmDistance.put("distance", jDistance.getString("text"));
/** Getting duration from the json data */
jDuration = ((JSONObject) jLegs.get(j)).getJSONObject("duration");
HashMap<String, String> hmDuration = new HashMap<String, String>();
hmDuration.put("duration", jDuration.getString("text"));
/** Adding distance object to the path */
path.add(hmDistance);
/** Adding duration object to the path */
path.add(hmDuration);
/** Getting poly points */
for(int k=0;k<jSteps.length();k++){
String polyline = "";
polyline = (String)((JSONObject)((JSONObject)jSteps.get(k)).get("polyline")).get("points");
List<LatLng> list = decodePoly(polyline);
for(int l=0;l<list.size();l++){
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("lat", Double.toString(((LatLng)list.get(l)).latitude) );
hm.put("lng", Double.toString(((LatLng)list.get(l)).longitude) );
path.add(hm);
}
}
/** Adding poly points */
routes.add(path);
}
}
} catch (JSONException e) {
e.printStackTrace();
}catch (Exception e){
}
return routes;
}
private List<LatLng> decodePoly(String encoded) {
List<LatLng> poly = new ArrayList<LatLng>();
int index = 0, len = encoded.length();
int lat = 0, lng = 0;
while (index < len) {
int b, shift = 0, result = 0;
do {
b = encoded.charAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
lat += dlat;
shift = 0;
result = 0;
do {
b = encoded.charAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
lng += dlng;
LatLng p = new LatLng((((double) lat / 1E5)),
(((double) lng / 1E5)));
poly.add(p);
}
return poly;
}
}
I think you have not used location provider , use googleapiclient
and read about this topic , it allows you to show your current position on map when location changed, that provides you your current locations.
Hint
Implements GoogleApiClient.ConnectionCallbacks , GoogleApiClient.OnConnectionFailedListener
in your activity then you can easily do that.

Android Google Map set country

I am new in developing with android google play sdk.
I want my map have a search function but it only specify on my country.
Let just say i live in Singapore, when i search a location, i want my engine only search on my country. How to set it ??
This is my Java Code
public class NearbyActivity extends FragmentActivity {
Button mBtnFind;
GoogleMap mMap;
EditText etPlace;
LatLng myPosition;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nearby);
// Getting reference to the find button
mBtnFind = (Button) findViewById(R.id.btn_show);
// Getting reference to the SupportMapFragment
SupportMapFragment mapFragment = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
// Getting reference to the Google Map
mMap = mapFragment.getMap();
// Getting reference to EditText
etPlace = (EditText) findViewById(R.id.et_place);
// Setting click event listener for the find button
mBtnFind.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
// Getting the place entered
String location = etPlace.getText().toString();
if(location==null || location.equals("")){
Toast.makeText(getBaseContext(), "No Place is entered", Toast.LENGTH_SHORT).show();
return;
}
String url = "https://maps.googleapis.com/maps/api/geocode/json?";
try {
// encoding special characters like space in the user input place
location = URLEncoder.encode(location, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
String address = "address=" + location;
String sensor = "sensor=false";
// url , from where the geocoding data is fetched
url = url + address + "&" + sensor;
// Instantiating DownloadTask to get places from Google Geocoding service
// in a non-ui thread
DownloadTask downloadTask = new DownloadTask();
// Start downloading the geocoding places
downloadTask.execute(url);
}
});
mMap.setMyLocationEnabled(true);
mMap.getUiSettings().setCompassEnabled(true);
mMap.getUiSettings().setMyLocationButtonEnabled(true);
mMap.getUiSettings().setRotateGesturesEnabled(true);
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
Location location = locationManager.getLastKnownLocation(provider);
if(location!=null){
double latitude = location.getLatitude();
double longitude = location.getLongitude();
LatLng latLng = new LatLng(latitude, longitude);
myPosition = new LatLng(latitude, longitude);
CameraUpdate center=CameraUpdateFactory.newLatLng(myPosition);
CameraUpdate zoom=CameraUpdateFactory.zoomTo(15);
mMap.moveCamera(center);
mMap.animateCamera(zoom);
mMap.addCircle(new CircleOptions()
.center(myPosition)
.radius(450)
.strokeColor(Color.LTGRAY)
.fillColor(0x2000FFFF));
}
}
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("Exception while downloading url", e.toString());
}finally{
iStream.close();
urlConnection.disconnect();
}
return data;
}
/** A class, to download Places from Geocoding webservice */
private class DownloadTask extends AsyncTask<String, Integer, String>{
String data = null;
// Invoked by execute() method of this object
#Override
protected String doInBackground(String... url) {
try{
data = downloadUrl(url[0]);
}catch(Exception e){
Log.d("Background Task",e.toString());
}
return data;
}
// Executed after the complete execution of doInBackground() method
#Override
protected void onPostExecute(String result){
// Instantiating ParserTask which parses the json data from Geocoding webservice
// in a non-ui thread
ParserTask parserTask = new ParserTask();
// Start parsing the places in JSON format
// Invokes the "doInBackground()" method of the class ParseTask
parserTask.execute(result);
}
}
/** A class to parse the Geocoding Places in non-ui thread */
class ParserTask extends AsyncTask<String, Integer, List<HashMap<String,String>>>{
JSONObject jObject;
// Invoked by execute() method of this object
#Override
protected List<HashMap<String,String>> doInBackground(String... jsonData) {
List<HashMap<String, String>> places = null;
GeocodeJSONParser parser = new GeocodeJSONParser();
try{
jObject = new JSONObject(jsonData[0]);
/** Getting the parsed data as a an ArrayList */
places = parser.parse(jObject);
}catch(Exception e){
Log.d("Exception",e.toString());
}
return places;
}
// Executed after the complete execution of doInBackground() method
#Override
protected void onPostExecute(List<HashMap<String,String>> list){
// Clears all the existing markers
mMap.clear();
for(int i=0;i<list.size();i++){
// Creating a marker
MarkerOptions markerOptions = new MarkerOptions();
// Getting a place from the places list
HashMap<String, String> hmPlace = list.get(i);
// Getting latitude of the place
double lat = Double.parseDouble(hmPlace.get("lat"));
// Getting longitude of the place
double lng = Double.parseDouble(hmPlace.get("lng"));
// Getting name
String name = hmPlace.get("formatted_address");
LatLng latLng = new LatLng(lat, lng);
// Setting the position for the marker
markerOptions.position(latLng);
// Setting the title for the marker
markerOptions.title(name);
// Placing a marker on the touched position
mMap.addMarker(markerOptions);
// Locate the first location
if(i==0)
mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
}
}
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
And this is my GEOcodeJSON :
public class GeocodeJSONParser {
/** Receives a JSONObject and returns a list */
public List<HashMap<String,String>> parse(JSONObject jObject){
JSONArray jPlaces = null;
try {
/** Retrieves all the elements in the 'places' array */
jPlaces = jObject.getJSONArray("results");
} catch (JSONException e) {
e.printStackTrace();
}
/** Invoking getPlaces with the array of json object
* where each json object represent a place
*/
return getPlaces(jPlaces);
}
private List<HashMap<String, String>> getPlaces(JSONArray jPlaces){
int placesCount = jPlaces.length();
List<HashMap<String, String>> placesList = new ArrayList<HashMap<String,String>>();
HashMap<String, String> place = null;
/** Taking each place, parses and adds to list object */
for(int i=0; i<placesCount; i++){
try {
/** Call getPlace with place JSON object to parse the place */
place = getPlace((JSONObject)jPlaces.get(i));
placesList.add(place);
} catch (JSONException e) {
e.printStackTrace();
}
}
return placesList;
}
/** Parsing the Place JSON object */
private HashMap<String, String> getPlace(JSONObject jPlace){
HashMap<String, String> place = new HashMap<String, String>();
String formatted_address = "-NA-";
String lat="";
String lng="";
try {
// Extracting formatted address, if available
if(!jPlace.isNull("formatted_address")){
formatted_address = jPlace.getString("formatted_address");
}
lat = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lat");
lng = jPlace.getJSONObject("geometry").getJSONObject("location").getString("lng");
place.put("formatted_address", formatted_address);
place.put("lat", lat);
place.put("lng", lng);
} catch (JSONException e) {
e.printStackTrace();
}
return place;
}
}
You can set a bias for your query to prefer one region. Note that this will only prefer the specific region without excluding all other ones.
Based on your query you will have something like this:
https://maps.googleapis.com/maps/api/geocode/json?address=THEADDRESS&region=XX&sensor=true
XX is the ccTLD code of the region, e.g. sg for Singapore.

Categories

Resources