我正在创建一个需要在印度两个地点之间使用行车距离的应用程序,我很困惑使用哪个API。用户将在应用程序中输入源和目标,其余应自动完成。
答案 0 :(得分:0)
我认为以下代码可以提供帮助。
Routing.java
public class Routing extends AsyncTask<LatLng, Void, Route>
{
private final GoogleMap map;
private LatLng start;
private LatLng dest;
private final LatLngBounds.Builder builder = new LatLngBounds.Builder();;
private final int[] lineColor = { Color.GREEN };
private final int pos;
public Routing(final Activity activity, final GoogleMap map) {
super();
this.map = map;
this.pos = 0;
}
private TextView txtDistance;
public Routing(final Activity activity, final GoogleMap map, final TextView txtDistance) {
super();
this.map = map;
this.pos = 0;
this.txtDistance = txtDistance;
}
@Override
protected Route doInBackground(final LatLng... points) {
try {
start = points[0];
dest = points[1];
Parser parser;
final String jsonURL = "http://maps.googleapis.com/maps/api/directions/json?";
final StringBuffer sBuf = new StringBuffer(jsonURL);
sBuf.append("origin=");
sBuf.append(start.latitude);
sBuf.append(',');
sBuf.append(start.longitude);
sBuf.append("&destination=");
sBuf.append(dest.latitude);
sBuf.append(',');
sBuf.append(dest.longitude);
sBuf.append("&sensor=true&mode=driving");
System.out.println("sbuf: " + sBuf.toString());
parser = new GoogleParser(sBuf.toString());
final Route route = parser.parse();
return route;
} catch (final Exception e) {}
return null;
}
@Override
protected void onPreExecute() {
/** Empty Method */
}// end onPreExecute method
@SuppressLint("ResourceAsColor")
@Override
protected void onPostExecute(final Route result) {
try {
if (result == null) {
map.moveCamera(CameraUpdateFactory.newLatLngZoom(dest, 15));
map.animateCamera(CameraUpdateFactory.zoomTo(18), 2000, null);
} else {
final String text = result.getTextLength();
final String startAddress = result.getStartAddress().toString().trim().replaceAll(", ", ",\n");
final String endAddress = result.getEndAddress().toString().trim().replaceAll(", ", ",\n");
txtDistance.setVisibility(View.GONE);
if (text != null) {
txtDistance.setVisibility(View.VISIBLE);
txtDistance.setBackgroundResource(android.R.color.holo_orange_light);
txtDistance.setText(" Total Distance : " + text + "\n Total Duration : " + result.getDuration() + " ");
}
final List<LatLng> directionPoint = result.getPoints();
final PolylineOptions rectLine = new PolylineOptions().width(10).color(lineColor[pos]);
for (int i = 0; i < directionPoint.size(); i++) {
rectLine.add(directionPoint.get(i));
}
map.addPolyline(rectLine);
final Marker startLocation = map.addMarker(new MarkerOptions().position(start).title(startAddress).snippet("Main Location").icon(BitmapDescriptorFactory.fromResource(R.drawable.markera)));
final Marker endLocation = map.addMarker(new MarkerOptions().position(dest).title(endAddress).snippet("Destination Location").icon(BitmapDescriptorFactory.fromResource(R.drawable.markerb)));
builder.include(startLocation.getPosition());
builder.include(endLocation.getPosition());
final LatLngBounds bounds = builder.build();
// Pan to see all markers in view.
final int padding = 100; // offset from edges of the map in pixels
final CameraUpdate cup = CameraUpdateFactory.newLatLngBounds(bounds, padding);
map.moveCamera(cup);
map.animateCamera(cup);
}
} catch (final Exception e) {
e.printStackTrace();
}
}// end onPostExecute method
}
在地图活动中添加以下行。
@Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (Utils.isGPSTurnOn(getApplicationContext())) {
onResume();
}
}
@Override
protected void onResume() {
super.onResume();
if (Utils.isConnected(getApplicationContext())) {
mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
mMap.setMyLocationEnabled(true);
final TextView txtDistance = (TextView) findViewById(R.id.txtSpeed);
new Routing(getParent(), mMap, txtDistance).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, start, end);
}
}
Utils.java
public class Utils
{
/**
* @Method used to checks if device having network connection or not.
* @param context the context
* @return <code>true</code> if the phone is connected
*/
public static boolean isConnected(final Context context) {
try {
final ConnectivityManager connMngr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo wifiNetwork = connMngr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (wifiNetwork != null && wifiNetwork.isConnectedOrConnecting()) { return true; }
final NetworkInfo mobileNetwork = connMngr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (mobileNetwork != null && mobileNetwork.isConnectedOrConnecting()) { return true; }
final NetworkInfo activeNetwork = connMngr.getActiveNetworkInfo();
if (activeNetwork != null && activeNetwork.isConnectedOrConnecting()) { return true; }
} catch (final Exception e) {
e.printStackTrace();
}
return false;
}
public static boolean isGPSTurnOn(final Context context) {
final LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
return manager.isProviderEnabled(LocationManager.GPS_PROVIDER);
}
}
activity_map.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment" />
<TextView
android:id="@+id/txtSpeed"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"
android:textStyle="bold"
android:text="@string/hello_world" />
</RelativeLayout>
答案 1 :(得分:0)
查看Google Places API,它拥有您需要的一切。