Я пытаюсь написать приложение для Android для доставки, поэтому мне нужно нарисовать путь, по которому грузоотправитель должен следовать по моей карте.Я добавил Google Maps API, и я могу получить свое местоположение и пункт назначения на карте (хранится в FireBase), но у меня возникли некоторые проблемы при рисовании маршрутов.
Вот мой код:
public class TrackingActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
FusedLocationProviderClient fusedLocationProviderClient;
LocationCallback locationCallback;
LocationRequest locationRequest;
Location mLastLocation;
Marker mCurrentMarket;
Polyline polyLine;
SessionManager sessionManager;
IGeoCoordinate mService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tracking);
mService = sessionManager.getGeoCodeService();
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
buildLocationRequest();
buildLocationCallBack();
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
fusedLocationProviderClient.requestLocationUpdates(locationRequest,locationCallback, Looper.myLooper());
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
fusedLocationProviderClient.getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
mLastLocation = location;
LatLng myLocation = new LatLng(location.getLatitude(), location.getLongitude());
mCurrentMarket = mMap.addMarker(new MarkerOptions().position(myLocation).title("My location"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(myLocation));
mMap.animateCamera(CameraUpdateFactory.zoomTo(16.0f));
}
});
}
Рисование маршрутов:
public void drawRoute(final LatLng myLocation, Colis_Livreur colis_livreur )
{
//CLEAR ALL POLYLNE
if(polyLine!=null)
{
polyLine.remove();
}
if (colis_livreur.getLatLng()!=null && !colis_livreur.getLatLng().isEmpty() )
{
String [] LatLng = colis_livreur.getLatLng().split(",");
LatLng colisLocation = new LatLng(Double.parseDouble(LatLng[0]),Double.parseDouble(LatLng[1]));
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.box);
bitmap = SessionManager.scaleBitmap(bitmap, 70, 70);
MarkerOptions marker = new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap(bitmap))
.title("Colis de " + sessionManager.getLivreurDetail().getTel())
.position(colisLocation);
mMap.addMarker(marker);
mService.getDirection(mLastLocation.getLatitude()+","+mLastLocation.getLongitude(),
colisLocation.latitude+","+colisLocation.longitude,"AIzaSyBqgc9e_SwSKwHc2QQe_6F5vdGjDW__Vfk").enqueue(new Callback<String>() {
@Override
public void onResponse(Call<String> call, Response<String> response) {
new ParserTask().execute(response.body().toString());
}
@Override
public void onFailure(Call<String> call, Throwable t) {
}
});
}
}
И функция, которая анализирует объект JSON:
private class ParserTask extends AsyncTask<String,Integer, List<List<HashMap<String,String>>>> {
@Override
protected List<List<HashMap<String, String>>> doInBackground(String... strings) {
JSONObject jObject;
List<List<HashMap<String,String>>> routes =null;
try{
jObject = new JSONObject(strings[0]);
DirectionJSONParser parser = new DirectionJSONParser();
routes = parser.parse(jObject);
}
catch (JSONException e ) {e.printStackTrace();}
return routes;
}
@Override
protected void onPostExecute(List<List<HashMap<String, String>>> lists) {
super.onPostExecute(lists);
ArrayList<LatLng> points = new ArrayList<LatLng>();;
PolylineOptions lineOptions = new PolylineOptions();;
lineOptions.width(10);
lineOptions.color(Color.RED);
// Traversing through all the routes
for(int i=0;i<lists.size();i++){
// Fetching i-th route
List<HashMap<String, String>> path = lists.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);
}
// Drawing polyline in the Google Map for the i-th route
if(lineOptions != null){mMap.addPolyline(lineOptions);}//to avoid crash
}
}
Я не получаю никакой ошибки, все работает нормально, за исключением того, что маршрутне отображается!