Showing posts with label Android Distance Direction. Show all posts
Showing posts with label Android Distance Direction. Show all posts

Monday, 11 March 2013

Android Distance Direction With Google Map (JSON)

Output: 



NOTE: Check  your Android Manifest..

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
</uses-permission>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".JsonMapActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<uses-library android:name="com.google.android.maps" >
</uses-library>
</application>
</manifest>
view raw Manifest.xml hosted with ❤ by GitHub

My Layout.xml

<linearlayout android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<button android:id="@+id/btnPutAddress"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="Put New Address" >
</button>
<com .google.android.maps.mapview=""
android:apikey="your key"
android:id="@+id/mpBranch"
android:layout_height="fill_parent"
android:layout_width="fill_parent" />
<linearlayout android:id="@+id/zoom"
android:layout_alignparentbottom="true"
android:layout_centerhorizontal="true"
android:layout_height="wrap_content"
android:layout_width="wrap_content">
</linearlayout>
</linearlayout>
view raw My Layout.xml hosted with ❤ by GitHub

1) Create class MyOverLay which extends Overlay
public class MyOverLay extends Overlay
{
private GeoPoint gp1;
private GeoPoint gp2;
//private int mRadius=6;
private int mode=0;
private int defaultColor;
private String text="";
private Bitmap img = null;
Context mContext;
public MyOverLay(Context context,GeoPoint gp1,GeoPoint gp2,int mode) // GeoPoint is a int. (6E)
{
this.gp1 = gp1;
this.gp2 = gp2;
this.mode = mode;
this.mContext = context;
defaultColor = 999; // no defaultColor
}
public MyOverLay(GeoPoint gp1,GeoPoint gp2,int mode, int defaultColor)
{
this.gp1 = gp1;
this.gp2 = gp2;
this.mode = mode;
this.defaultColor = defaultColor;
}
public void setText(String t)
{
this.text = t;
}
public void setBitmap(Bitmap bitmap)
{
this.img = bitmap;
}
public int getMode()
{
return mode;
}
@Override
public boolean draw
(Canvas canvas, MapView mapView, boolean shadow, long when)
{
Projection projection = mapView.getProjection();
if (shadow == false)
{
Paint paint = new Paint();
paint.setAntiAlias(true);
Point point = new Point();
projection.toPixels(gp1, point);
// mode=1&#65306;start
if(mode==1)
{
if(defaultColor==999)
paint.setColor(Color.BLUE);
else
paint.setColor(defaultColor);
// start point
}
// mode=2&#65306;path
else if(mode==2)
{
if(defaultColor==999)
paint.setColor(Color.RED);
else
paint.setColor(defaultColor);
Point point2 = new Point();
projection.toPixels(gp2, point2);
paint.setStrokeWidth(5);
paint.setAlpha(120);
canvas.drawLine(point.x, point.y, point2.x,point2.y, paint);
}
/* mode=3&#65306;end */
else if(mode==3)
{
/* the last path */
if(defaultColor==999)
paint.setColor(Color.GREEN);
else
paint.setColor(defaultColor);
Point point2 = new Point();
projection.toPixels(gp2, point2);
paint.setStrokeWidth(5);
paint.setAlpha(120);
canvas.drawLine(point.x, point.y, point2.x,point2.y, paint);
/* end point */
}
}
return super.draw(canvas, mapView, shadow, when);
}
}
view raw MyOverLay.java hosted with ❤ by GitHub

2) Create another class CustomItemizedOverlay which extends ItemizedOverlay<OverlayItem>

 

class CustomItemizedOverlay extends ItemizedOverlay<OverlayItem> {
private final ArrayList<OverlayItem> mapOverlays = new ArrayList<OverlayItem>();
private Context context;
public CustomItemizedOverlay(Drawable defaultMarker) {
super(boundCenterBottom(defaultMarker));
}
public CustomItemizedOverlay(Drawable defaultMarker, Context context) {
this(defaultMarker);
this.context = context;
}
@Override
protected OverlayItem createItem(int i) {
return mapOverlays.get(i);
}
@Override
public int size() {
return mapOverlays.size();
}
public void addOverlay(OverlayItem overlay) {
mapOverlays.add(overlay);
this.populate();
}
@Override
protected boolean onTap(int index) {
OverlayItem item = mapOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(context);
dialog.setTitle(item.getTitle());dialog.setMessage(item.getSnippet());
dialog.setNeutralButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
dialog.show();
return true;
}
}

3) Now Create Main Activity which extends MapActivity




public class JsonMapActivity extends MapActivity {
/** Called when the activity is first created. */
static double srclongitute, destlongitute;
static double srclatitude, destlatitude;
static String distance_km = "";
MapView mapView;
private JsonMapActivity _activity;
GeoPoint srcGeoPoint, destGeoPoint;
private static List<Overlay> mOverlays;
static String distance = "";
JSONObject jsonObj;
static String _path, start_address, end_address;
Drawable srcdrawable;
static String GPsLoc;
Context context = this;
Button btnDialog;
LocationManager locationManager;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
jsonObj = getLocationInfo("GandhiNagar", "Surat");
Toast.makeText(getApplicationContext(), "" + jsonObj.length(), 5)
.show();
if (getLatLong(jsonObj)) {
Log.i("srcLati", "" + srclatitude);
Log.i("srcLungi", "" + srclongitute);
Log.i("destLati", "" + destlatitude);
Log.i("destLungi", "" + destlongitute);
}
_activity = this;
mapView = (MapView) findViewById(R.id.mpBranch);
mapView.setBuiltInZoomControls(true);
mapView.displayZoomControls(true);
mapView.setClickable(true);
srcGeoPoint = new GeoPoint((int) (srclatitude * 1E6),
(int) (srclongitute * 1E6));
destGeoPoint = new GeoPoint((int) (destlatitude * 1E6),
(int) (destlongitute * 1E6));
List<Overlay> mapOverlays = mapView.getOverlays();
srcdrawable = getApplicationContext().getResources().getDrawable(
R.drawable.map_user);// // user
CustomItemizedOverlay srcitemizedOverlay = new CustomItemizedOverlay(
srcdrawable, this);
OverlayItem srcoverlayitem = new OverlayItem(srcGeoPoint,
"My Location", start_address);
Drawable destdrawable = this.getResources().getDrawable(
R.drawable.map_restaurant); // rest
CustomItemizedOverlay destitemizedOverlay = new CustomItemizedOverlay(
destdrawable, this);
OverlayItem destoverlayitem = new OverlayItem(destGeoPoint,
"FoodCorner Branch", end_address);
srcitemizedOverlay.addOverlay(srcoverlayitem);
destitemizedOverlay.addOverlay(destoverlayitem);
mapOverlays.add(srcitemizedOverlay);
mapOverlays.add(destitemizedOverlay);
connectAsyncTask _connectAsyncTask = new connectAsyncTask();
_connectAsyncTask.execute();
mOverlays = mapView.getOverlays();
mapView.getController().animateTo(srcGeoPoint);
mapView.getController().setZoom(8);
}
@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
public static JSONObject getLocationInfo(String origin, String dest) {
StringBuilder stringBuilder = new StringBuilder();
try {
origin = origin.replaceAll(" ", "%20");
dest = dest.replaceAll(" ", "%20");
HttpPost httppost = new HttpPost(
"http://maps.googleapis.com/maps/api/directions/json?origin="
+ origin + "&destination=" + dest + "&sensor=false");
// http://maps.googleapis.com/maps/api/directions/json?origin=Chicago,IL&destination=Los+Angeles,CA&sensor=false
HttpClient client = new DefaultHttpClient();
HttpResponse response;
stringBuilder = new StringBuilder();
response = client.execute(httppost);
HttpEntity entity = response.getEntity();
InputStream stream = entity.getContent();
int b;
while ((b = stream.read()) != -1) {
stringBuilder.append((char) b);
}
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
JSONObject jsonObject = new JSONObject();
try {
jsonObject = new JSONObject(stringBuilder.toString());
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return jsonObject;
}
// --------------------------------------------------------------------------
// class Asych task
private class connectAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
// SHOW YOU PROGRESS BAR HERE
}
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
return null;
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if (_path != null) {
Overlay ol = new MyOverLay(_activity, srcGeoPoint, srcGeoPoint,
1);
mOverlays.add(ol);
List<GeoPoint> _geopoints = decodePoly(_path);
GeoPoint gp1;
GeoPoint gp2;
gp2 = _geopoints.get(0);
for (int i = 1; i < _geopoints.size(); i++) // the last one
// would be
// crash
{
gp1 = gp2;
gp2 = _geopoints.get(i);
Overlay ol1 = new MyOverLay(gp1, gp2, 2, Color.BLUE);
mOverlays.add(ol1);
}
Overlay ol2 = new MyOverLay(_activity, destGeoPoint,
destGeoPoint, 3);
mOverlays.add(ol2);
// DISMISS PROGRESS BAR HERE
} else {
// showAlert AS "Unable to find the route"
}
Overlay ol2 = new MyOverLay(_activity, destGeoPoint, destGeoPoint,
3);
mOverlays.add(ol2);
// DISMISS PROGRESS BAR HERE
}
}// end of class
// --------------------------------------------------------------------------
private List<GeoPoint> decodePoly(String encoded) {
List<GeoPoint> poly = new ArrayList<GeoPoint>();
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;
GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6),
(int) (((double) lng / 1E5) * 1E6));
poly.add(p);
}
return poly;
}
// --------------------------------------------------
public static boolean getLatLong(JSONObject jsonObject) {
try {
JSONObject jsonOb = ((JSONArray) jsonObject.get("routes"))
.getJSONObject(0);
JSONArray jsonArray = jsonOb.getJSONArray("legs");
JSONObject j1 = jsonArray.getJSONObject(0);
srclatitude = j1.getJSONObject("start_location").getDouble("lat");
srclongitute = j1.getJSONObject("start_location").getDouble("lng");
destlatitude = j1.getJSONObject("end_location").getDouble("lat");
destlongitute = j1.getJSONObject("end_location").getDouble("lng");
start_address = j1.getString("start_address");
end_address = j1.getString("end_address");
JSONObject ja = j1.getJSONObject("distance");
// Log.i("jsonOb size", "" + ja.getString("text"));
JSONObject ja_line = jsonOb.getJSONObject("overview_polyline");
// Log.i("ja_line size", "" + ja_line.getString("points"));
_path = ja_line.getString("points");
} catch (JSONException e) {
return false;
}
return true;
}
public class MyLocationListener implements LocationListener
{
@Override
public void onLocationChanged(Location loc)
{
GPsLoc=new Double(loc.getLatitude()).toString()+",";
GPsLoc+=loc.getLongitude();
String Text = "My current location is: " + "Latitud = "
+ loc.getLatitude() + "Longitud = " + loc.getLongitude();
Toast.makeText(getApplicationContext(), Text, Toast.LENGTH_SHORT)
.show();
}
@Override
public void onProviderDisabled(String provider)
{
Toast.makeText(getApplicationContext(), "Gps Disabled",
Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderEnabled(String provider)
{
Toast.makeText(getApplicationContext(), "Gps Enabled",
Toast.LENGTH_SHORT).show();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
{
}
}/* End of Class MyLocationListener */
}