Android如何在Google地图上显示标记之间的路线 [英] Android How to show route between markers on googlemaps

查看:102
本文介绍了Android如何在Google地图上显示标记之间的路线的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个应用程序,显示用户的位置并将标记放置到该位置。用户移动后。标记将被删除,并创建一个新的标记。现在。我想将A点和B点的标记硬编码到应用程序中,并在地图上显示路线。它应使用地图上最近的道路。我已经做了一些研究,但只找到5年前的旧代码。任何人都可以通过这种方式引导我。



点A和点B位于LocationChanged方法中。

  import com.google.android.gms.maps.CameraUpdateFactory; 
导入com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;

import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
导入com.google.android.gms.maps.model.Marker;
导入com.google.android.gms.maps.model.MarkerOptions;

导入android.content.Context;
导入android.content.Intent;
导入android.location.Criteria;
导入android.location.Location;
导入android.location.LocationListener;
导入android.location.LocationManager;
导入android.os.Bundle;
导入android.provider.Settings;
导入android.support.v4.app.FragmentActivity;
导入android.widget.Toast;

公共类MainActivity扩展FragmentActivity实现LocationListener {
私有GoogleMap地图;
私人LocationManager locationManager;
私有字符串提供程序;
LatLng坐标;
标记startPerc;

@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);


LocationManager服务=(LocationManager)getSystemService(LOCATION_SERVICE);
boolean enabledGPS = service
.isProviderEnabled(LocationManager.GPS_PROVIDER);
boolean enabledWiFi = service
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

//检查是否启用,如果不发送用户到GSP设置
//更好的解决方法是显示一个对话框并建议
//进入设置
if(!enabledGPS){
Toast.makeText(this,GPS signal not found,Toast.LENGTH_LONG).show();
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}
locationManager =(LocationManager)getSystemService(Context.LOCATION_SERVICE);
//定义标准如何选择位置提供商 - >使用
//默认
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria,false);
位置位置= locationManager.getLastKnownLocation(provider);

//初始化位置字段
if(location!= null){
Toast.makeText(this,Selected Provider+ provider,
Toast.LENGTH_SHORT )。显示();
onLocationChanged(location);
} else {

//做某事
}


}

/ *请求更新于启动* /
@Override
保护无效的onResume(){
super.onResume();
locationManager.requestLocationUpdates(provider,300,1,this);

$ b $ *当Activity暂停时移除locationlistener更新* /
@Override
protected void onPause(){
super.onPause() ;
locationManager.removeUpdates(this);


@Override
public void onLocationChanged(Location location){

double lat = location.getLatitude();
double lng = location.getLongitude();
Toast.makeText(this,Location+ lat +,+ lng,
Toast.LENGTH_LONG).show();
LatLng坐标=新LatLng(lat,lng);
Toast.makeText(this,Location+ coordinate.latitude +,+ coordinate.longitude,
Toast.LENGTH_LONG).show();
if(map!= null){
map.clear();
}
//map.clear();
GoogleMap地图;
if(startPerc!= null){
startPerc.remove(); $($ Support
$ b map =((SupportMapFragment)getSupportFragmentManager()。findFragmentById(R.id.map))。getMap();
startPerc = map.addMarker(new MarkerOptions()
.position(coordinate)
.title(Start)
.snippet(Your Position)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)));
map.moveCamera(CameraUpdateFactory.newLatLngZoom(coordinate,20));



map.addMarker(new MarkerOptions()
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
.position(new LatLng
.title(Point A)
.snippet(Bus Stop)
.flat(true));

map.addMarker(new MarkerOptions()
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
.position(new LatLng(3.214507,101.749697))
.title(Point B)
.snippet(Bus Stop)
.flat(true));



startPerc.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher));



$ b覆盖
public void onProviderDisabled(String provider){
Toast.makeText(this,Enabled new provider + provider,
Toast.LENGTH_SHORT).show();



$ b @Override
public void onProviderEnabled(String provider){
Toast.makeText(this,Disabled provider+提供者,
Toast.LENGTH_SHORT).show();



$ b @Override
public void onStatusChanged(String provider,int status,Bundle extras){
// TODO Auto-生成的方法存根

}
void延迟(int秒){
long Time = 0;
Time = System.currentTimeMillis();
while(System.currentTimeMillis()< Time +(Seconds * 1000));
}
}

K Neeraj提供的新代码。它仍然崩溃,请检查。

  import java.io.BufferedReader; 
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
导入java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.json.JSONObject;

import com.google.android.gms.maps.CameraUpdateFactory;
导入com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;

import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
导入com.google.android.gms.maps.model.Marker;
导入com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolylineOptions;

导入android.content.Context;
导入android.content.Intent;
导入android.graphics.Color;
导入android.location.Criteria;
导入android.location.Location;
导入android.location.LocationListener;
导入android.location.LocationManager;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.provider.Settings;
导入android.support.v4.app.FragmentActivity;
导入android.util.Log;
导入android.widget.Toast;

公共类MainActivity扩展FragmentActivity实现LocationListener {
私有GoogleMap地图;
私人LocationManager locationManager;
私有字符串提供程序;
LatLng坐标;
标记startPerc;

@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);



LocationManager服务=(LocationManager)getSystemService(LOCATION_SERVICE);
boolean enabledGPS = service
.isProviderEnabled(LocationManager.GPS_PROVIDER);
boolean enabledWiFi = service
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

//检查是否启用,如果不发送用户到GSP设置
//更好的解决方法是显示一个对话框并建议
//进入设置
if(!enabledGPS){
Toast.makeText(this,GPS signal not found,Toast.LENGTH_LONG).show();
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}

locationManager =(LocationManager)getSystemService(Context.LOCATION_SERVICE);
//定义标准如何选择位置提供商 - >使用
//默认
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria,false);
位置位置= locationManager.getLastKnownLocation(provider);



//初始化位置字段
if(location!= null){
Toast.makeText(this,Selected Provider+ provider ,
Toast.LENGTH_SHORT).show();
onLocationChanged(location);
} else {

//做某事
}


}


/ *在启动时请求更新* /
@Override
保护无效onResume(){
super.onResume();
locationManager.requestLocationUpdates(provider,300,1,this);

$ b $ *当Activity暂停时移除locationlistener更新* /
@Override
protected void onPause(){
super.onPause() ;
locationManager.removeUpdates(this);


@Override
public void onLocationChanged(Location location){

double lat = location.getLatitude();
double lng = location.getLongitude();
Toast.makeText(this,Location+ lat +,+ lng,
Toast.LENGTH_LONG).show();
LatLng坐标=新LatLng(lat,lng);
Toast.makeText(this,Location+ coordinate.latitude +,+ coordinate.longitude,
Toast.LENGTH_LONG).show();



if(map!= null){
map.clear();
}

GoogleMap地图;
if(startPerc!= null){
startPerc.remove(); $($ Support
$ b map =((SupportMapFragment)getSupportFragmentManager()。findFragmentById(R.id.map))。getMap();
startPerc = map.addMarker(new MarkerOptions()
.position(coordinate)
.title(Start)
.snippet(Your Position)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)));
map.moveCamera(CameraUpdateFactory.newLatLngZoom(coordinate,12));




startPerc.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher));

//指定您的出发地和目的地
//这些点是您的标记坐标
LatLng origin = new LatLng(3.214732,101.747047);
LatLng dest = new LatLng(3.214507,101.749697);

//获取Google路线API的网址
String url = getDirectionsUrl(origin,dest);

DownloadTask downloadTask = new DownloadTask();

//开始从Google Directions API下载json数据
downloadTask.execute(url);
}


private String getDirectionsUrl(LatLng origin,LatLng dest){


//路由的起源
字符串str_origin =origin =+ origin.latitude +,+ origin.longitude;

//路线
的目的地String str_dest =destination =+ dest.latitude +,+ dest.longitude;

//启用传感器
String sensor =sensor = false;

//将参数构建到Web服务
字符串参数= str_origin +&+ str_dest +&+ sensor;

//输出格式
字符串输出=json;

//将网址构建到网络服务
String url =https://maps.googleapis.com/maps/api/directions/\"+output+\"?\"+parameters;

返回网址;
}


$ b / **从url下载json数据的方法* /
private String downloadUrl(String strUrl)throws IOException {
String data =;
InputStream iStream = null;
HttpURLConnection urlConnection = null;
尝试{
URL url = new URL(strUrl);

//创建一个http连接与url进行通信
urlConnection =(HttpURLConnection)url.openConnection();

//连接到url
urlConnection.connect();

//从url读取数据
iStream = urlConnection.getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

StringBuffer sb = new StringBuffer();

String line =; ((line = br.readLine())!= null){
sb.append(line);
while
}

data = sb.toString();

br.close();

} catch(Exception e){
Log.d(下载url时出现异常,e.toString());
} finally {
iStream.close();
urlConnection.disconnect();
}
返回数据;
}

//从url传递数据
private class DownloadTask extends AsyncTask< String,Void,String> {

//将数据下载非ui线程
@Override
保护字符串doInBackground(String ... url){

//用于存储来自web服务的数据
String data = ;

尝试{
//从Web服务获取数据
data = downloadUrl(url [0]);
} catch(Exception e){
Log.d(Background Task,e.toString());
}
返回数据;


//执行
// doInBackground()
@Override
保护void onPostExecute(String result) {
super.onPostExecute(result);

ParserTask parserTask = new ParserTask();

//调用解析JSON数据的线程
parserTask.execute(result);


$ b $ **一个以JSON格式解析Google Places的类* /
私有类ParserTask扩展AsyncTask< String,Integer,List< List< ; HashMap中<字符串,字符串>>> > {

//解析非ui线程中的数据
@Override
protected List< List< HashMap< String,String>>>> doInBackground(String ... jsonData){

JSONObject jObject;
List< List< HashMap< String,String>>> routes = null;

尝试{
jObject = new JSONObject(jsonData [0]);
DirectionsJSONParser解析器= new DirectionsJSONParser();

//开始解析数据
routes = parser.parse(jObject);
} catch(Exception e){
e.printStackTrace();
}
返回路线;
}

//在解析过程之后在UI线程中执行
@Override
protected void onPostExecute(List< List< HashMap< String,String>> >结果){
ArrayList< LatLng> points = null;
PolylineOptions lineOptions = null;
MarkerOptions markerOptions = new MarkerOptions();
$ b $ //遍历所有路由
for(int i = 0; i< result.size(); i ++){
points = new ArrayList< LatLng>() ;
lineOptions = new PolylineOptions();

//获取第i条路线
List< HashMap< String,String>> path = result.get(i);

//获取第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);
}

//将路线中的所有点添加到LineOptions
lineOptions.addAll(points);
lineOptions.width(2);
lineOptions.color(Color.RED);
}

//在Google Map中为第i条路线绘制多段线
map.addPolyline(lineOptions);





$ b @覆盖
public void onProviderDisabled(String provider){
Toast。 makeText(这个Enabled new provider+ provider,
Toast.LENGTH_SHORT).show();



$ b @Override
public void onProviderEnabled(String provider){
Toast.makeText(this,Disabled provider+提供者,
Toast.LENGTH_SHORT).show();



$ b @Override
public void onStatusChanged(String provider,int status,Bundle extras){
// TODO Auto-生成的方法存根

}
void延迟(int秒){
long Time = 0;
Time = System.currentTimeMillis();
while(System.currentTimeMillis()< Time +(Seconds * 1000));




$ b然后我创建了一个新的DirectionJSONParser.java

  import java.util.ArrayList; 
import java.util.HashMap;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

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

public class DirectionsJSONParser {

/ **接收JSONObject并返回包含经度和纬度的列表* /
public List< List< HashMap< 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;

尝试{

jRoutes = jObject.getJSONArray(routes);
$ b $ **遍历所有路由* /
for(int i = 0; i< jRoutes.length(); i ++){
jLegs =((JSONObject)jRoutes。得到(I))getJSONArray( 腿)。
List path = new ArrayList< HashMap< String,String>>();
$ b $ **遍历所有的腿* /
for(int j = 0; j jSteps =((JSONObject)jLegs。得到(J))getJSONArray( 步)。
$ b $ **遍历所有步骤* /
for(int k = 0; k String polyline =;
polyline =(String)((JSONObject)((JSONObject)jSteps.get(k))。get(polyline))。get(points);
列表< LatLng> list = decodePoly(polyline);
$ b $ **遍历所有点* /
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);
}
}
routes.add(path);
}
}

} catch(JSONException e){
e.printStackTrace();
} catch(Exception e){
}

return routes;
}
/ **
*解码折线点的方法
* Courtesy:http://jeffreysambells.com/2010/05/27/decoding-polylines-from-google -maps-direction-api-with-java
* * /
private List< LatLng> decodePoly(字符串编码){

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 + = 5;
} while(b> = 0x20);
int dlat =((result& 1)!= 0?〜(result>> 1):( result>> 1));
lat + = dlat;

shift = 0;
结果= 0;
do {
b = encoded.charAt(index ++) - 63;
result | =(b& 0x1f)<<转移;
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;


$ / code $ / pre

解决方案

  @Override 
public void onLocationChanged(Location location){
....
startPerc.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher));

//指定您的出发地和目的地
//这些点是您的标记坐标
LatLng origin = new LatLng(3.214732,101.747047);
LatLng dest = new LatLng(3.214507,101.749697);

//获取Google路线API的网址
String url = getDirectionsUrl(origin,dest);

DownloadTask downloadTask = new DownloadTask();

//开始从Google Directions API下载json数据
downloadTask.execute(url);
}


private String getDirectionsUrl(LatLng origin,LatLng dest){


//路由的起源
字符串str_origin =origin =+ origin.latitude +,+ origin.longitude;

//路线
的目的地String str_dest =destination =+ dest.latitude +,+ dest.longitude;

//启用传感器
String sensor =sensor = false;

//将参数构建到Web服务
字符串参数= str_origin +&+ str_dest +&+ sensor;

//输出格式
字符串输出=json;

//将网址构建到网络服务
String url =https://maps.googleapis.com/maps/api/directions/\"+output+\"?\"+parameters;

返回网址;
}


$ b / **从url下载json数据的方法* /
private String downloadUrl(String strUrl)throws IOException {
String data =;
InputStream iStream = null;
HttpURLConnection urlConnection = null;
尝试{
URL url = new URL(strUrl);

//创建一个http连接与url进行通信
urlConnection =(HttpURLConnection)url.openConnection();

//连接到url
urlConnection.connect();

//从url读取数据
iStream = urlConnection.getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

StringBuffer sb = new StringBuffer();

String line =; ((line = br.readLine())!= null){
sb.append(line);
while
}

data = sb.toString();

br.close();

} catch(Exception e){
Log.d(下载url时出现异常,e.toString());
} finally {
iStream.close();
urlConnection.disconnect();
}
返回数据;
}

//从url传递数据
private class DownloadTask extends AsyncTask< String,Void,String> {

//将数据下载非ui线程
@Override
保护字符串doInBackground(String ... url){

//用于存储来自web服务的数据
String data = ;

尝试{
//从Web服务获取数据
data = downloadUrl(url [0]);
} catch(Exception e){
Log.d(Background Task,e.toString());
}
返回数据;


//执行
// doInBackground()
@Override
保护void onPostExecute(String result) {
super.onPostExecute(result);

ParserTask parserTask = new ParserTask();

//调用解析JSON数据的线程
parserTask.execute(result);


$ b $ **一个以JSON格式解析Google Places的类* /
私有类ParserTask扩展AsyncTask< String,Integer,List< List< ; HashMap中<字符串,字符串>>> > {

//解析非ui线程中的数据
@Override
protected List< List< HashMap< String,String>>>> doInBackground(String ... jsonData){

JSONObject jObject;
List< List< HashMap< String,String>>> routes = null;

尝试{
jObject = new JSONObject(jsonData [0]);
DirectionsJSONParser解析器= new DirectionsJSONParser();

//开始解析数据
routes = parser.parse(jObject);
} catch(Exception e){
e.printStackTrace();
}
返回路线;
}

//在解析过程之后在UI线程中执行
@Override
protected void onPostExecute(List< List< HashMap< String,String>> >结果){
ArrayList< LatLng> points = null;
PolylineOptions lineOptions = null;
MarkerOptions markerOptions = new MarkerOptions();
$ b $ //遍历所有路由
for(int i = 0; i< result.size(); i ++){
points = new ArrayList< LatLng>() ;
lineOptions = new PolylineOptions();

//获取第i条路线
List< HashMap< String,String>> path = result.get(i);

//获取第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);
}

//将路线中的所有点添加到LineOptions
lineOptions.addAll(points);
lineOptions.width(2);
lineOptions.color(Color.RED);
}

//在Google Map中为第i条路线绘制多段线
map.addPolyline(lineOptions);
}
}

查看本教程,



绘图在两个位置之间驾驶路线指引使用Google路线在Google Map Android Api v2



它显示了如何在两点之间绘制路线图。


I'm creating an App that will show the location of the user and put a marker to that position. After the user moves. The marker would be removed and a new marker would be created. Now. I want to make markers on Point A and Point B to be hardcoded into the app and show the route on the map. It shall use the nearest road on the map. I've done some research but only find old code which dated 5 years back. Could anyone be kind enough to guide me through this.

The Point A and Point B is on LocationChanged method.

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

import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import android.content.Context;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;

public class MainActivity extends FragmentActivity implements LocationListener {
    private GoogleMap map;
    private LocationManager locationManager;
    private String provider;
    LatLng coordinate;
    Marker startPerc;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
        boolean enabledGPS = service
                .isProviderEnabled(LocationManager.GPS_PROVIDER);
        boolean enabledWiFi = service
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        // Check if enabled and if not send user to the GSP settings
        // Better solution would be to display a dialog and suggesting to 
        // go to the settings
        if (!enabledGPS) {
            Toast.makeText(this, "GPS signal not found", Toast.LENGTH_LONG).show();
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);
        }
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    // Define the criteria how to select the location provider -> use
    // default
    Criteria criteria = new Criteria();
    provider = locationManager.getBestProvider(criteria, false);
    Location location = locationManager.getLastKnownLocation(provider);

    // Initialize the location fields
    if (location != null) {
        Toast.makeText(this, "Selected Provider " + provider,
                Toast.LENGTH_SHORT).show();
        onLocationChanged(location);
    } else {

        //do something
    }


}

/* Request updates at startup */
@Override
protected void onResume() {
    super.onResume();
    locationManager.requestLocationUpdates(provider, 300, 1, this);
}

/* Remove the locationlistener updates when Activity is paused */
@Override
protected void onPause() {
    super.onPause();
    locationManager.removeUpdates(this);
}

@Override
public void onLocationChanged(Location location) {

    double lat =  location.getLatitude();
    double lng = location.getLongitude();
    Toast.makeText(this, "Location " + lat+","+lng,
            Toast.LENGTH_LONG).show();
    LatLng coordinate = new LatLng(lat, lng);
    Toast.makeText(this, "Location " + coordinate.latitude+","+coordinate.longitude,
            Toast.LENGTH_LONG).show();
    if(map!=null){
        map.clear();
    }
    //map.clear();
    GoogleMap map;
    if(startPerc!=null){
        startPerc.remove();
    }
    map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    startPerc = map.addMarker(new MarkerOptions()
    .position(coordinate)
      .title("Start")
      .snippet("Your Position")
      .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)));
    map.moveCamera(CameraUpdateFactory.newLatLngZoom(coordinate, 20));



    map.addMarker(new MarkerOptions()
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
                    .position(new LatLng(3.214732, 101.747047))
                    .title("Point A")
                    .snippet("Bus Stop")
                    .flat(true));

    map.addMarker(new MarkerOptions()
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
                    .position(new LatLng(3.214507, 101.749697))
                    .title("Point B")
                    .snippet("Bus Stop")
                    .flat(true));



startPerc.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher));

}


@ Override
public void onProviderDisabled(String provider) {
    Toast.makeText(this, "Enabled new provider " + provider,
            Toast.LENGTH_SHORT).show();

}


@Override
public void onProviderEnabled(String provider) {
    Toast.makeText(this, "Disabled provider " + provider,
            Toast.LENGTH_SHORT).show();

}


@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}
void Delay(int Seconds){
    long Time = 0;
    Time = System.currentTimeMillis();
    while(System.currentTimeMillis() < Time+(Seconds*1000));
}
}

New code provided by K Neeraj. It still crash sadly please check.

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 org.json.JSONObject;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;

import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolylineOptions;

import android.content.Context;
import android.content.Intent;
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.provider.Settings;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.widget.Toast;

public class MainActivity extends FragmentActivity implements LocationListener {
    private GoogleMap map;
    private LocationManager locationManager;
    private String provider;
    LatLng coordinate;
    Marker startPerc;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
        boolean enabledGPS = service
                .isProviderEnabled(LocationManager.GPS_PROVIDER);
        boolean enabledWiFi = service
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        // Check if enabled and if not send user to the GSP settings
        // Better solution would be to display a dialog and suggesting to 
        // go to the settings
        if (!enabledGPS) {
            Toast.makeText(this, "GPS signal not found", Toast.LENGTH_LONG).show();
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);
        }

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        // Define the criteria how to select the location provider -> use
        // default
        Criteria criteria = new Criteria();
        provider = locationManager.getBestProvider(criteria, false);
        Location location = locationManager.getLastKnownLocation(provider);



        // Initialize the location fields
        if (location != null) {
            Toast.makeText(this, "Selected Provider " + provider,
                    Toast.LENGTH_SHORT).show(); 
            onLocationChanged(location);
        } else {

        //do something
    }


}


/* Request updates at startup */
@Override
protected void onResume() {
    super.onResume();
    locationManager.requestLocationUpdates(provider, 300, 1, this);
}

/* Remove the locationlistener updates when Activity is paused */
@Override
protected void onPause() {
    super.onPause();
    locationManager.removeUpdates(this);
}

@Override
public void onLocationChanged(Location location) {

    double lat =  location.getLatitude();
    double lng = location.getLongitude();
    Toast.makeText(this, "Location " + lat+","+lng,
            Toast.LENGTH_LONG).show();
    LatLng coordinate = new LatLng(lat, lng);
    Toast.makeText(this, "Location " + coordinate.latitude+","+coordinate.longitude,
            Toast.LENGTH_LONG).show();



    if(map!=null){
        map.clear();
    }

    GoogleMap map;
    if(startPerc!=null){
        startPerc.remove();
    }
    map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    startPerc = map.addMarker(new MarkerOptions()
    .position(coordinate)
      .title("Start")
      .snippet("Your Position")
      .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)));
    map.moveCamera(CameraUpdateFactory.newLatLngZoom(coordinate, 12));




    startPerc.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher));

 // Assign your origin and destination
 // These points are your markers coordinates
 LatLng origin = new LatLng(3.214732, 101.747047);
 LatLng dest = new LatLng(3.214507, 101.749697);

 // 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);
 }


 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;
 }



 /** A method to download json data from url */
     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;
 }

 // Fetches data from url passed
 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 Places 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;
         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);

                 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
         map.addPolyline(lineOptions);
     }
 }




@ Override
public void onProviderDisabled(String provider) {
    Toast.makeText(this, "Enabled new provider " + provider,
            Toast.LENGTH_SHORT).show();

}


@Override
public void onProviderEnabled(String provider) {
    Toast.makeText(this, "Disabled provider " + provider,
            Toast.LENGTH_SHORT).show();

}


@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}
void Delay(int Seconds){
    long Time = 0;
    Time = System.currentTimeMillis();
    while(System.currentTimeMillis() < Time+(Seconds*1000));
}
}

Then I created a new DirectionJSONParser.java

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

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

public class DirectionsJSONParser {

    /** Receives a JSONObject and returns a list of lists containing latitude and longitude */
    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;

        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");

                    /** 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);
                    }
                }
            routes.add(path);
        }
    }

} catch (JSONException e) {
    e.printStackTrace();
}catch (Exception e){
}

return routes;
}
/**
* Method to decode polyline points
* Courtesy : http://jeffreysambells.com/2010/05/27/decoding-polylines-from-google-maps-direction-api-with-java
* */
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;
}
}

解决方案

@Override
public void onLocationChanged(Location location) {
....
 startPerc.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher));

// Assign your origin and destination
// These points are your markers coordinates
LatLng origin = new LatLng(3.214732, 101.747047);
LatLng dest = new LatLng(3.214507, 101.749697);

// 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);
}


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;
}



/** A method to download json data from url */
    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;
}

// Fetches data from url passed
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 Places 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;
        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);

                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
        map.addPolyline(lineOptions);
    }
}

Have a look at this tutorial,

Drawing Driving Route Directions Between Two Locations Using Google Directions In Google Map Android Api v2

It shows how to draw Route map between two points.

这篇关于Android如何在Google地图上显示标记之间的路线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆