地图路径未显示在Google地图上?

时间:2018-10-02 05:32:38

标签: android

我遇到的问题是,有时未显示连接Google地图上2个点的路径。但不是永远,有时也会出现。我该怎么办? 这是我在android中的代码

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){
        Toast.makeText(MainActivity.this,
                "Exception while downloading url",
                Toast.LENGTH_LONG).show();
    }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 = new ArrayList<LatLng>();;
        PolylineOptions lineOptions = new PolylineOptions();;
        lineOptions.width(8);
        lineOptions.color(Color.GREEN);
        MarkerOptions markerOptions = new MarkerOptions();
        // Traversing through all the routes
        for(int i=0;i<result.size();i++){
            // 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);

        }
        // Drawing polyline in the Google Map for the i-th route
        if(points.size()!=0)googleMap.addPolyline(lineOptions);//to avoid crash
    }

}

如何解决以上问题?请帮我。 还是访问延迟的服务器出现问题?

1 个答案:

答案 0 :(得分:0)

如果使用经度获取当前位置,则请实施此方法。它将在每次onLocationChanged时为您提供。

  @SuppressLint({"ClickableViewAccessibility"})
        @Override
        public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
    //      Start implementation for getting current location
            callTrackLocation();
        }

        @SuppressLint("MissingPermission")
        private void callTrackLocation() {
            if (latitude != 0.0 && longitude != 0.0 && !country.equalsIgnoreCase("")) {
                loc_func();
            }

            LocationListener locationListener = new LocationListener() {
                @Override
                public void onLocationChanged(Location location) {
                    longitude = location.getLongitude();
                    latitude = location.getLatitude();
                    Log.d("Location : ", location.toString());
                }

                @Override
                public void onStatusChanged(String provider, int status, Bundle extras) {

                }

                @Override
                public void onProviderEnabled(String provider) {

                }

                @Override
                public void onProviderDisabled(String provider) {

                }
            };

            if (Build.VERSION.SDK_INT < 23) {
                if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
                    Log.i(TAG, "onViewCreated: location manager in if condition");
                }
            } else {
                if (ActivityCompat.checkSelfPermission(Objects.requireNonNull(getActivity()), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    //      TODO: Consider calling
                    //      ActivityCompat#requestPermissions
                    //      here to request the missing permissions, and then overriding
                    //      public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults)
                    //      to handle the case where the user grants the permission. See the documentation
                    //      for ActivityCompat#requestPermissions for more details.
                    ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
                    return;
                } else {
                    if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                        Log.i(TAG, "onViewCreated: location manager in else if condition");
                        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
                    }
                }
            }

            Location location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

            if (location != null) {
                longitude = location.getLongitude();
                latitude = location.getLatitude();
            }
            if (latitude != 0.0 && longitude != 0.0) {
                loc_func();
            }
        }

        public void loc_func() {
            Log.i(TAG, "latitude: " + latitude + " longitude : " + longitude);
            Geocoder geocoder = new Geocoder(getActivity());
            List<Address> addresses = null;
            try {
                addresses = geocoder.getFromLocation(latitude, longitude, 1);
                if (addresses != null) {
                    Log.i(TAG, "latitude: " + latitude + " longitude : " + longitude + "  loc_func : " + addresses.get(0).getCountryName());
                    country = addresses.get(0).getCountryName();
                    String state = addresses.get(0).getAdminArea();
                    String city = addresses.get(0).getLocality();
                }

                // GetAllQuestionByUser();

                Log.e(TAG, "loc_func: Country : " + country);

            } catch (IOException e) {
                e.printStackTrace();
            }
        }