direction api/E/RouteException: исключение JSONException при разборе аргумента RouteException. Msg: нет значения для error_message
Я изучаю создание карты Android с использованием api направления. вот мой код
манифест
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="~~~~~~~~~~~~" />
<meta-data android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Основное занятие
package com.example.myapplication;
import android.Manifest;
import android.content.pm.PackageManager;
import android.location.Location;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.FragmentActivity;
import com.directions.route.AbstractRouting;
import com.directions.route.Route;
import com.directions.route.RouteException;
import com.directions.route.Routing;
import com.directions.route.RoutingListener;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.maps.CameraUpdate;
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.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.Polyline;
import com.google.android.gms.maps.model.PolylineOptions;
import com.google.android.material.snackbar.Snackbar;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends FragmentActivity implements OnMapReadyCallback,
GoogleApiClient.OnConnectionFailedListener, RoutingListener {
//google map object
private GoogleMap mMap;
//current and destination location objects
Location myLocation=null;
Location destinationLocation=null;
protected LatLng start=null;
protected LatLng end=null;
//to get location permissions.
private final static int LOCATION_REQUEST_CODE = 23;
boolean locationPermission=false;
//polyline object
private List<Polyline> polylines=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//request location permission.
requestPermision();
//init google map fragment to show map.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
private void requestPermision()
{
if(ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
LOCATION_REQUEST_CODE);
}
else{
locationPermission=true;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case LOCATION_REQUEST_CODE: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//if permission granted.
locationPermission=true;
getMyLocation();
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
return;
}
}
}
//to get user location
private void getMyLocation(){
mMap.setMyLocationEnabled(true);
mMap.setOnMyLocationChangeListener(new GoogleMap.OnMyLocationChangeListener() {
@Override
public void onMyLocationChange(Location location) {
myLocation=location;
LatLng ltlng=new LatLng(location.getLatitude(),location.getLongitude());
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(
ltlng, 16f);
mMap.animateCamera(cameraUpdate);
}
});
//get destination location when user click on map
mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
end=latLng;
mMap.clear();
start=new LatLng(myLocation.getLatitude(),myLocation.getLongitude());
//start route finding
Findroutes(start,end);
}
});
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
getMyLocation();
}
// function to find Routes.
public void Findroutes(LatLng Start, LatLng End)
{
if(Start==null || End==null) {
Toast.makeText(MainActivity.this,"Unable to get location",Toast.LENGTH_LONG).show();
}
else
{
Routing routing = new Routing.Builder()
.travelMode(AbstractRouting.TravelMode.DRIVING)
.withListener(this)
.alternativeRoutes(true)
.waypoints(Start, End)
.key("~~~~~~~~") //also define your api key here.
.build();
routing.execute();
}
}
//Routing call back functions.
@Override
public void onRoutingFailure(RouteException e) {
View parentLayout = findViewById(android.R.id.content);
Snackbar snackbar= Snackbar.make(parentLayout, e.toString(), Snackbar.LENGTH_LONG);
snackbar.show();
// Findroutes(start,end);
}
@Override
public void onRoutingStart() {
Toast.makeText(MainActivity.this,"Finding Route...",Toast.LENGTH_LONG).show();
}
//If Route finding success..
@Override
public void onRoutingSuccess(ArrayList<Route> route, int shortestRouteIndex) {
CameraUpdate center = CameraUpdateFactory.newLatLng(start);
CameraUpdate zoom = CameraUpdateFactory.zoomTo(16);
if(polylines!=null) {
polylines.clear();
}
PolylineOptions polyOptions = new PolylineOptions();
LatLng polylineStartLatLng=null;
LatLng polylineEndLatLng=null;
polylines = new ArrayList<>();
//add route(s) to the map using polyline
for (int i = 0; i <route.size(); i++) {
if(i==shortestRouteIndex)
{
polyOptions.color(getResources().getColor(R.color.colorPrimary));
polyOptions.width(7);
polyOptions.addAll(route.get(shortestRouteIndex).getPoints());
Polyline polyline = mMap.addPolyline(polyOptions);
polylineStartLatLng=polyline.getPoints().get(0);
int k=polyline.getPoints().size();
polylineEndLatLng=polyline.getPoints().get(k-1);
polylines.add(polyline);
}
else {
}
}
//Add Marker on route starting position
MarkerOptions startMarker = new MarkerOptions();
startMarker.position(polylineStartLatLng);
startMarker.title("My Location");
mMap.addMarker(startMarker);
//Add Marker on route ending position
MarkerOptions endMarker = new MarkerOptions();
endMarker.position(polylineEndLatLng);
endMarker.title("Destination");
mMap.addMarker(endMarker);
}
@Override
public void onRoutingCancelled() {
Findroutes(start,end);
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Findroutes(start,end);
}
}
I found this example code on youtube videos(https://www.youtube.com/watch?v=58AxNh2cWRU) to studying. So when I touch the destination after run app my mobliephone using gps location. system show error message
2020-06-12 16:35:29.890 1031-1146/com.example.myapplication E/RouteException: JSONException while parsing RouteException argument. Msg: No value for error_message
I searched this error. but I don't know what error means... (I hide my api key)