找到你要的答案

Q:Google maps and Unable to resovle host maps.googleapis.com

Q:谷歌地图无法解决主机maps.googleapis.com

I have a problem with google maps. I try to add poliline from my current position and position from marker. This is code:

public class MapsFragment extends Fragment implements GoogleMap.OnMarkerClickListener, LocationListener {

    static final LatLng CEK = new LatLng(50.293734, 18.680679);
    static final LatLng SPIRALA = new LatLng(50.285402, 18.677715);
    static final LatLng SPIRALA2 = new LatLng(50.285283, 18.678014);
    static final LatLng ZIEMOWIT_PIAST = new LatLng(50.287742, 18.675693);
    static final LatLng NOWA_HALA = new LatLng(50.289633, 18.679960);
    static final LatLng STOLOWKA = new LatLng(50.288337, 18.674267);
    static final LatLng RYNEK = new LatLng(50.294028, 18.665659);
    static final LatLng LAKA_IGROWA = new LatLng(50.288844, 18.679562);

    private static GoogleMap map;
    private ArrayList<Marker> markerPoints;
    private ArrayList<LatLng> mMarkerPoints;
    private HashMap<String, Event> haspMap;
    private Event cekEvent, spiralaEvent, spirala2Event, ziemowitEvent, nowaHalaEvent, stolowkaEvent, rynekEvent, lakaEvent;
    private double mLatitude=0;
    private double mLongitude=0;
    private Location currentBestLocation = null;
    private LocationManager locationManager;
    private LatLng currentPos;
    private Location location;
    private Polyline polyline;
    private static View v;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (v != null) {
            ViewGroup parent = (ViewGroup) v.getParent();
            if (parent != null)
                parent.removeView(v);
        }
        try {
            v = inflater.inflate(R.layout.fragment_map, container, false);
        } catch (InflateException e) {
            e.printStackTrace();
        }
        haspMap = new HashMap <String, Event>();
        mMarkerPoints = new ArrayList<>();
        locationManager = (LocationManager) getActivity().getSystemService(getActivity().LOCATION_SERVICE);
        setEventsData();
        try {
            initializeMap();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return v;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        ButterKnife.inject(this, view);
        try {
            initializeMap();

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

    }

    private void initializeMap() {
        if (map == null) {
            map = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            map.setOnMarkerClickListener(this);
            setPointsList();
        }
    }

    private void setPointsList(){
        markerPoints = new ArrayList<>();
        markerPoints.add(map.addMarker(new MarkerOptions()
                .position(CEK)));
        haspMap.put(markerPoints.get(markerPoints.size() - 1).getId(), cekEvent);
        markerPoints.add(map.addMarker(new MarkerOptions()
                .position(SPIRALA)));
        haspMap.put(markerPoints.get(markerPoints.size() - 1).getId(), spiralaEvent);
        markerPoints.add(map.addMarker(new MarkerOptions()
                .position(SPIRALA2)));
        haspMap.put(markerPoints.get(markerPoints.size() - 1).getId(), spirala2Event);
        markerPoints.add(map.addMarker(new MarkerOptions()
                .position(ZIEMOWIT_PIAST)));
        haspMap.put(markerPoints.get(markerPoints.size() - 1).getId(), ziemowitEvent);
        markerPoints.add(map.addMarker(new MarkerOptions()
                .position(NOWA_HALA)));
        haspMap.put(markerPoints.get(markerPoints.size() - 1).getId(), nowaHalaEvent);
        markerPoints.add(map.addMarker(new MarkerOptions()
                .position(STOLOWKA)));
        haspMap.put(markerPoints.get(markerPoints.size() - 1).getId(), stolowkaEvent);
        markerPoints.add(map.addMarker(new MarkerOptions()
                .position(RYNEK)));
        haspMap.put(markerPoints.get(markerPoints.size() - 1).getId(), rynekEvent);
        markerPoints.add(map.addMarker(new MarkerOptions()
                .position(LAKA_IGROWA)));
        haspMap.put(markerPoints.get(markerPoints.size() - 1).getId(), lakaEvent);
    }

    private void setEventsData(){
        cekEvent = new Event();
        cekEvent.setTitle("Kabareton Igrowy w Centrum Edukacyjno - Kongresowe");
        cekEvent.setDate("Poniedziałek, 11 maja, 18:00");
        cekEvent.setPlace("CEK, ul. Konarskiego 18B");
        spiralaEvent = new Event();
        spiralaEvent.setTitle("Występ ATR Remont w CKS Mrowisko, a następnie Jam Session w KS Spirala");
        spiralaEvent.setDate("Poniedziałek, 11 maja, 19:00");
        spiralaEvent.setPlace("Spirala, ul. Pszczyńska 85");
        spirala2Event = new Event();
        spirala2Event.setTitle("Gra Miejska");
        spirala2Event.setDate("Wtorek, 12 maja, 17:00");
        spirala2Event.setPlace("Spirala, ul. Pszczyńska 85");
        ziemowitEvent = new Event();
        ziemowitEvent.setTitle("Pokaz filmowy między Piastem, a Ziemowitem");
        ziemowitEvent.setDate("Wtorek, 12 maja, 19:00");
        ziemowitEvent.setPlace("Między Ziemowitem a Piastem, ul. Łużycka 30-32");
        nowaHalaEvent = new Event();
        nowaHalaEvent.setTitle("Dzień Sportu");
        nowaHalaEvent.setDate("Środa, 13 maja, 8:30");
        nowaHalaEvent.setPlace("Nowa Hala, ul. Kaszubska 28");
        stolowkaEvent = new Event();
        stolowkaEvent.setTitle("Wieczór z grami planszowymi na Stołówce \"Na Łużyckiej\"");
        stolowkaEvent.setDate("Środa, 13 maja, 17:30");
        stolowkaEvent.setPlace("Stołówka na Łużyckiej, ul. Łużycka 24");
        rynekEvent = new Event();
        rynekEvent.setTitle("Przekazanie klucza na gliwickim rynku, a następnie korowód!");
        rynekEvent.setDate("Czwartek, 14 maja, 16:00");
        rynekEvent.setPlace("Rynek");
        lakaEvent = new Event();
        lakaEvent.setTitle("W czwartek wystąpią: Funk Da System, Koniec Świata, Farben Lehre, Acid Drinkers!\n" +
                "A w piątek: Othalan, Prime, Małpa, Jamal, T.Love!\n");
        lakaEvent.setDate("Czwrartek i piątek, 14-15 maja");
        lakaEvent.setPlace("Łąka igrowa");
    }

    @Override
    public boolean onMarkerClick(final Marker marker) {
        for(Marker m : markerPoints){
            if (marker.getId().equals(m.getId())){
                showDialogInfo(m);
            }
        }
        return false;
    }

    private void showDialogMore(Marker m){
        LayoutInflater inflater = getLayoutInflater(getArguments());
        View dialogLayout = inflater.inflate(R.layout.dialog_more_info, null);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        TextView title = (TextView) dialogLayout.findViewById(R.id.dialogMoreTitle);
        TextView text = (TextView) dialogLayout.findViewById(R.id.dialogMoreText);

        Iterator iterator = haspMap.keySet().iterator();
        while(iterator.hasNext()) {
            String key=(String)iterator.next();
            Event ev = (Event)haspMap.get(key);
            if(m.getId().equals(key)) {
                if (ev.getTitle().equals(cekEvent.getTitle())) {
                    title.setText(getString(R.string.event_monday_title));
                    text.setText(getString(R.string.event_monday_text));
                } else if (ev.getTitle().equals(spiralaEvent.getTitle())) {
                    title.setText(getString(R.string.event_monday_title));
                    text.setText(getString(R.string.event_monday_text));
                } else if (ev.getTitle().equals(spirala2Event.getTitle())) {
                    title.setText(getString(R.string.event_tuesday_title));
                    text.setText(getString(R.string.event_tuesday_text));
                } else if (ev.getTitle().equals(ziemowitEvent.getTitle())) {
                    title.setText(getString(R.string.event_tuesday_title));
                    text.setText(getString(R.string.event_tuesday_text));
                } else if (ev.getTitle().equals(nowaHalaEvent.getTitle())) {
                    title.setText(getString(R.string.event_wednesday_title));
                    text.setText(getString(R.string.event_wednesday_text));
                } else if (ev.getTitle().equals(stolowkaEvent.getTitle())) {
                    title.setText(getString(R.string.event_wednesday_title));
                    text.setText(getString(R.string.event_wednesday_text));
                } else if (ev.getTitle().equals(rynekEvent.getTitle())) {
                    title.setText(getString(R.string.event_thursday_title));
                    text.setText(getString(R.string.event_thursday_text));
                } else if (ev.getTitle().equals(lakaEvent.getTitle())) {
                    title.setText(getString(R.string.event_thursday_title) + "\n" + getString(R.string.event_friday_title));
                    text.setText(getString(R.string.event_thursday_text) + "\n" + getString(R.string.event_friday_text));
                }
            }
        }

        builder.setView(dialogLayout);
        builder.show();
    }


    private void showDialogInfo(final Marker m){
        LayoutInflater inflater = getLayoutInflater(getArguments());
        final View dialogLayout = inflater.inflate(R.layout.dialog_marker, null);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        RelativeLayout layoutMore = (RelativeLayout) dialogLayout.findViewById(R.id.layoutMore);
        RelativeLayout layoutTrip = (RelativeLayout) dialogLayout.findViewById(R.id.layoutTrip);
        TextView textTitle = (TextView) dialogLayout.findViewById(R.id.textTitle);
        TextView textDate = (TextView) dialogLayout.findViewById(R.id.textDate);
        TextView textPlace = (TextView) dialogLayout.findViewById(R.id.textPlace);

        builder.setView(dialogLayout);
        final AlertDialog dialog = builder.create();

        Iterator iterator = haspMap.keySet().iterator();
        while(iterator.hasNext()) {
            String key=(String)iterator.next();
            Event ev = (Event)haspMap.get(key);
                if(m.getId().equals(key)) {
                    textTitle.setText(ev.getTitle());
                    textDate.setText(ev.getDate());
                    textPlace.setText(ev.getPlace());
                }
            }

        layoutMore.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showDialogMore(m);
            }
        });

        layoutTrip.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (location != null) {
                    if(polyline != null)
                        polyline.remove();
                    mMarkerPoints.clear();
                    mMarkerPoints.add(currentPos);
                    mMarkerPoints.add(m.getPosition());
                    LatLng origin = mMarkerPoints.get(0);
                    LatLng dest = mMarkerPoints.get(1);
                    String url = getDirectionsUrl(origin, dest);
                    DownloadTask downloadTask = new DownloadTask();
                    downloadTask.execute(url);
                    dialog.dismiss();
                } else {
                    drawRoute();
                    Toast.makeText(getActivity(), getString(R.string.toast_no_location), Toast.LENGTH_SHORT).show();
                }
            }
        });


        dialog.show();

    }

    private void zoomMapOnMarkers(){
        LatLngBounds.Builder builder = new LatLngBounds.Builder();
        for (Marker marker : markerPoints) {
            builder.include(marker.getPosition());
        }
        final LatLngBounds bounds = builder.build();
        map.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
            @Override
            public void onMapLoaded() {
                map.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 45));
                map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
            }
        });
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
            drawRoute();
        }else{
            showGPSDisabledAlertToUser();
        }

    }

    private void showGPSDisabledAlertToUser(){
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
        alertDialogBuilder.setMessage(getString(R.string.dialog_GPS))
                .setCancelable(false)
                .setPositiveButton("OK",
                        new DialogInterface.OnClickListener(){
                            public void onClick(DialogInterface dialog, int id){
                                Intent callGPSSettingIntent = new Intent(
                                        android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                                startActivity(callGPSSettingIntent);
                            }
                        });
        alertDialogBuilder.setNegativeButton("Cancel",
                new DialogInterface.OnClickListener(){
                    public void onClick(DialogInterface dialog, int id){
                        dialog.cancel();
                    }
                });
        AlertDialog alert = alertDialogBuilder.create();
        alert.show();
    }

    private void drawRoute(){
        map.setMyLocationEnabled(true);
        Criteria criteria = new Criteria();
        String provider = locationManager.getBestProvider(criteria, true);
        location = locationManager.getLastKnownLocation(provider);

        if(location!=null){
            onLocationChanged(location);
        }

        locationManager.requestLocationUpdates(provider, 20000, 0, this);

    }

    @Override
    public void onResume() {
        super.onResume();
        initializeMap();
    }

    private void drawMarker(LatLng point){
        mMarkerPoints.add(point);

        MarkerOptions options = new MarkerOptions();

        options.position(point);

        if(mMarkerPoints.size()==1){
            options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
        }else if(mMarkerPoints.size()==2){
            options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
        }

        // Add new marker to the Google Map Android API V2
        map.addMarker(options);
    }

    @Override
    public void onLocationChanged(Location locatione) {
        currentBestLocation = locatione;
        Criteria criteria = new Criteria();
        String provider = locationManager.getBestProvider(criteria, true);
        location = locationManager.getLastKnownLocation(provider);
        currentPos = new LatLng(currentBestLocation.getLatitude(), currentBestLocation.getLongitude());
        mMarkerPoints.add(currentPos);
        if(mMarkerPoints.size() < 2){

            mLatitude = locatione.getLatitude();
            mLongitude = locatione.getLongitude();
            LatLng point = new LatLng(mLatitude, mLongitude);

            map.moveCamera(CameraUpdateFactory.newLatLng(point));
            map.animateCamera(CameraUpdateFactory.zoomTo(12));

            drawMarker(point);
        }
    }

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

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }

    private String getDirectionsUrl(LatLng origin,LatLng dest){

        String str_origin = "origin="+origin.latitude+","+origin.longitude;

        String str_dest = "destination="+dest.latitude+","+dest.longitude;

        String sensor = "sensor=false";

        String parameters = str_origin+"&"+str_dest+"&"+sensor;

        String output = "json";

        String url = "https://maps.googleapis.com/maps/api/directions/"+output+"?"+parameters;

        return url;
    }

    private String downloadUrl(String strUrl) throws IOException {
        String data = "";
        InputStream iStream = null;
        HttpURLConnection urlConnection = null;
        try{
            URL url = new URL(strUrl);

            urlConnection = (HttpURLConnection) url.openConnection();

            //urlConnection.connect();
            urlConnection.setReadTimeout(10000 /* milliseconds */);
            urlConnection.setConnectTimeout(15000 /* milliseconds */);
            urlConnection.setRequestMethod("GET");
            urlConnection.setDoInput(true);
            // Starts the query
            urlConnection.connect();


            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){
            e.printStackTrace();
        }finally{
            iStream.close();
            urlConnection.disconnect();
        }
        return data;
    }

    /** A class to download data from Google Directions URL */
    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 Directions 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;

            // 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(6);
                lineOptions.color(Color.RED);
            }

            // Drawing polyline in the Google Map for the i-th route
            //map.addPolyline(lineOptions);
            polyline = map.addPolyline(lineOptions);
        }
    }

    @Override
    public void onDestroyView() {

        super.onDestroyView();
        Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));
        if (fragment != null){
            getActivity().getSupportFragmentManager().beginTransaction()
                    .remove(fragment)
                    .commit();
        }
    }
}

I have current location and position from marker and when click to draw polyline I get Unable to resolve host "maps.googleapis.com": No address associated with hostname. And application crash. When start again everything works fine and polyline add to map. Any idea why?

我有一个谷歌地图的问题。我试着从我的当前位置和位置标记添加博友。这是代码:

public class MapsFragment extends Fragment implements GoogleMap.OnMarkerClickListener, LocationListener {

    static final LatLng CEK = new LatLng(50.293734, 18.680679);
    static final LatLng SPIRALA = new LatLng(50.285402, 18.677715);
    static final LatLng SPIRALA2 = new LatLng(50.285283, 18.678014);
    static final LatLng ZIEMOWIT_PIAST = new LatLng(50.287742, 18.675693);
    static final LatLng NOWA_HALA = new LatLng(50.289633, 18.679960);
    static final LatLng STOLOWKA = new LatLng(50.288337, 18.674267);
    static final LatLng RYNEK = new LatLng(50.294028, 18.665659);
    static final LatLng LAKA_IGROWA = new LatLng(50.288844, 18.679562);

    private static GoogleMap map;
    private ArrayList<Marker> markerPoints;
    private ArrayList<LatLng> mMarkerPoints;
    private HashMap<String, Event> haspMap;
    private Event cekEvent, spiralaEvent, spirala2Event, ziemowitEvent, nowaHalaEvent, stolowkaEvent, rynekEvent, lakaEvent;
    private double mLatitude=0;
    private double mLongitude=0;
    private Location currentBestLocation = null;
    private LocationManager locationManager;
    private LatLng currentPos;
    private Location location;
    private Polyline polyline;
    private static View v;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (v != null) {
            ViewGroup parent = (ViewGroup) v.getParent();
            if (parent != null)
                parent.removeView(v);
        }
        try {
            v = inflater.inflate(R.layout.fragment_map, container, false);
        } catch (InflateException e) {
            e.printStackTrace();
        }
        haspMap = new HashMap <String, Event>();
        mMarkerPoints = new ArrayList<>();
        locationManager = (LocationManager) getActivity().getSystemService(getActivity().LOCATION_SERVICE);
        setEventsData();
        try {
            initializeMap();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return v;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        ButterKnife.inject(this, view);
        try {
            initializeMap();

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

    }

    private void initializeMap() {
        if (map == null) {
            map = ((SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            map.setOnMarkerClickListener(this);
            setPointsList();
        }
    }

    private void setPointsList(){
        markerPoints = new ArrayList<>();
        markerPoints.add(map.addMarker(new MarkerOptions()
                .position(CEK)));
        haspMap.put(markerPoints.get(markerPoints.size() - 1).getId(), cekEvent);
        markerPoints.add(map.addMarker(new MarkerOptions()
                .position(SPIRALA)));
        haspMap.put(markerPoints.get(markerPoints.size() - 1).getId(), spiralaEvent);
        markerPoints.add(map.addMarker(new MarkerOptions()
                .position(SPIRALA2)));
        haspMap.put(markerPoints.get(markerPoints.size() - 1).getId(), spirala2Event);
        markerPoints.add(map.addMarker(new MarkerOptions()
                .position(ZIEMOWIT_PIAST)));
        haspMap.put(markerPoints.get(markerPoints.size() - 1).getId(), ziemowitEvent);
        markerPoints.add(map.addMarker(new MarkerOptions()
                .position(NOWA_HALA)));
        haspMap.put(markerPoints.get(markerPoints.size() - 1).getId(), nowaHalaEvent);
        markerPoints.add(map.addMarker(new MarkerOptions()
                .position(STOLOWKA)));
        haspMap.put(markerPoints.get(markerPoints.size() - 1).getId(), stolowkaEvent);
        markerPoints.add(map.addMarker(new MarkerOptions()
                .position(RYNEK)));
        haspMap.put(markerPoints.get(markerPoints.size() - 1).getId(), rynekEvent);
        markerPoints.add(map.addMarker(new MarkerOptions()
                .position(LAKA_IGROWA)));
        haspMap.put(markerPoints.get(markerPoints.size() - 1).getId(), lakaEvent);
    }

    private void setEventsData(){
        cekEvent = new Event();
        cekEvent.setTitle("Kabareton Igrowy w Centrum Edukacyjno - Kongresowe");
        cekEvent.setDate("Poniedziałek, 11 maja, 18:00");
        cekEvent.setPlace("CEK, ul. Konarskiego 18B");
        spiralaEvent = new Event();
        spiralaEvent.setTitle("Występ ATR Remont w CKS Mrowisko, a następnie Jam Session w KS Spirala");
        spiralaEvent.setDate("Poniedziałek, 11 maja, 19:00");
        spiralaEvent.setPlace("Spirala, ul. Pszczyńska 85");
        spirala2Event = new Event();
        spirala2Event.setTitle("Gra Miejska");
        spirala2Event.setDate("Wtorek, 12 maja, 17:00");
        spirala2Event.setPlace("Spirala, ul. Pszczyńska 85");
        ziemowitEvent = new Event();
        ziemowitEvent.setTitle("Pokaz filmowy między Piastem, a Ziemowitem");
        ziemowitEvent.setDate("Wtorek, 12 maja, 19:00");
        ziemowitEvent.setPlace("Między Ziemowitem a Piastem, ul. Łużycka 30-32");
        nowaHalaEvent = new Event();
        nowaHalaEvent.setTitle("Dzień Sportu");
        nowaHalaEvent.setDate("Środa, 13 maja, 8:30");
        nowaHalaEvent.setPlace("Nowa Hala, ul. Kaszubska 28");
        stolowkaEvent = new Event();
        stolowkaEvent.setTitle("Wieczór z grami planszowymi na Stołówce \"Na Łużyckiej\"");
        stolowkaEvent.setDate("Środa, 13 maja, 17:30");
        stolowkaEvent.setPlace("Stołówka na Łużyckiej, ul. Łużycka 24");
        rynekEvent = new Event();
        rynekEvent.setTitle("Przekazanie klucza na gliwickim rynku, a następnie korowód!");
        rynekEvent.setDate("Czwartek, 14 maja, 16:00");
        rynekEvent.setPlace("Rynek");
        lakaEvent = new Event();
        lakaEvent.setTitle("W czwartek wystąpią: Funk Da System, Koniec Świata, Farben Lehre, Acid Drinkers!\n" +
                "A w piątek: Othalan, Prime, Małpa, Jamal, T.Love!\n");
        lakaEvent.setDate("Czwrartek i piątek, 14-15 maja");
        lakaEvent.setPlace("Łąka igrowa");
    }

    @Override
    public boolean onMarkerClick(final Marker marker) {
        for(Marker m : markerPoints){
            if (marker.getId().equals(m.getId())){
                showDialogInfo(m);
            }
        }
        return false;
    }

    private void showDialogMore(Marker m){
        LayoutInflater inflater = getLayoutInflater(getArguments());
        View dialogLayout = inflater.inflate(R.layout.dialog_more_info, null);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        TextView title = (TextView) dialogLayout.findViewById(R.id.dialogMoreTitle);
        TextView text = (TextView) dialogLayout.findViewById(R.id.dialogMoreText);

        Iterator iterator = haspMap.keySet().iterator();
        while(iterator.hasNext()) {
            String key=(String)iterator.next();
            Event ev = (Event)haspMap.get(key);
            if(m.getId().equals(key)) {
                if (ev.getTitle().equals(cekEvent.getTitle())) {
                    title.setText(getString(R.string.event_monday_title));
                    text.setText(getString(R.string.event_monday_text));
                } else if (ev.getTitle().equals(spiralaEvent.getTitle())) {
                    title.setText(getString(R.string.event_monday_title));
                    text.setText(getString(R.string.event_monday_text));
                } else if (ev.getTitle().equals(spirala2Event.getTitle())) {
                    title.setText(getString(R.string.event_tuesday_title));
                    text.setText(getString(R.string.event_tuesday_text));
                } else if (ev.getTitle().equals(ziemowitEvent.getTitle())) {
                    title.setText(getString(R.string.event_tuesday_title));
                    text.setText(getString(R.string.event_tuesday_text));
                } else if (ev.getTitle().equals(nowaHalaEvent.getTitle())) {
                    title.setText(getString(R.string.event_wednesday_title));
                    text.setText(getString(R.string.event_wednesday_text));
                } else if (ev.getTitle().equals(stolowkaEvent.getTitle())) {
                    title.setText(getString(R.string.event_wednesday_title));
                    text.setText(getString(R.string.event_wednesday_text));
                } else if (ev.getTitle().equals(rynekEvent.getTitle())) {
                    title.setText(getString(R.string.event_thursday_title));
                    text.setText(getString(R.string.event_thursday_text));
                } else if (ev.getTitle().equals(lakaEvent.getTitle())) {
                    title.setText(getString(R.string.event_thursday_title) + "\n" + getString(R.string.event_friday_title));
                    text.setText(getString(R.string.event_thursday_text) + "\n" + getString(R.string.event_friday_text));
                }
            }
        }

        builder.setView(dialogLayout);
        builder.show();
    }


    private void showDialogInfo(final Marker m){
        LayoutInflater inflater = getLayoutInflater(getArguments());
        final View dialogLayout = inflater.inflate(R.layout.dialog_marker, null);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        RelativeLayout layoutMore = (RelativeLayout) dialogLayout.findViewById(R.id.layoutMore);
        RelativeLayout layoutTrip = (RelativeLayout) dialogLayout.findViewById(R.id.layoutTrip);
        TextView textTitle = (TextView) dialogLayout.findViewById(R.id.textTitle);
        TextView textDate = (TextView) dialogLayout.findViewById(R.id.textDate);
        TextView textPlace = (TextView) dialogLayout.findViewById(R.id.textPlace);

        builder.setView(dialogLayout);
        final AlertDialog dialog = builder.create();

        Iterator iterator = haspMap.keySet().iterator();
        while(iterator.hasNext()) {
            String key=(String)iterator.next();
            Event ev = (Event)haspMap.get(key);
                if(m.getId().equals(key)) {
                    textTitle.setText(ev.getTitle());
                    textDate.setText(ev.getDate());
                    textPlace.setText(ev.getPlace());
                }
            }

        layoutMore.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showDialogMore(m);
            }
        });

        layoutTrip.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (location != null) {
                    if(polyline != null)
                        polyline.remove();
                    mMarkerPoints.clear();
                    mMarkerPoints.add(currentPos);
                    mMarkerPoints.add(m.getPosition());
                    LatLng origin = mMarkerPoints.get(0);
                    LatLng dest = mMarkerPoints.get(1);
                    String url = getDirectionsUrl(origin, dest);
                    DownloadTask downloadTask = new DownloadTask();
                    downloadTask.execute(url);
                    dialog.dismiss();
                } else {
                    drawRoute();
                    Toast.makeText(getActivity(), getString(R.string.toast_no_location), Toast.LENGTH_SHORT).show();
                }
            }
        });


        dialog.show();

    }

    private void zoomMapOnMarkers(){
        LatLngBounds.Builder builder = new LatLngBounds.Builder();
        for (Marker marker : markerPoints) {
            builder.include(marker.getPosition());
        }
        final LatLngBounds bounds = builder.build();
        map.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() {
            @Override
            public void onMapLoaded() {
                map.animateCamera(CameraUpdateFactory.newLatLngBounds(bounds, 45));
                map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
            }
        });
        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
            drawRoute();
        }else{
            showGPSDisabledAlertToUser();
        }

    }

    private void showGPSDisabledAlertToUser(){
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
        alertDialogBuilder.setMessage(getString(R.string.dialog_GPS))
                .setCancelable(false)
                .setPositiveButton("OK",
                        new DialogInterface.OnClickListener(){
                            public void onClick(DialogInterface dialog, int id){
                                Intent callGPSSettingIntent = new Intent(
                                        android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                                startActivity(callGPSSettingIntent);
                            }
                        });
        alertDialogBuilder.setNegativeButton("Cancel",
                new DialogInterface.OnClickListener(){
                    public void onClick(DialogInterface dialog, int id){
                        dialog.cancel();
                    }
                });
        AlertDialog alert = alertDialogBuilder.create();
        alert.show();
    }

    private void drawRoute(){
        map.setMyLocationEnabled(true);
        Criteria criteria = new Criteria();
        String provider = locationManager.getBestProvider(criteria, true);
        location = locationManager.getLastKnownLocation(provider);

        if(location!=null){
            onLocationChanged(location);
        }

        locationManager.requestLocationUpdates(provider, 20000, 0, this);

    }

    @Override
    public void onResume() {
        super.onResume();
        initializeMap();
    }

    private void drawMarker(LatLng point){
        mMarkerPoints.add(point);

        MarkerOptions options = new MarkerOptions();

        options.position(point);

        if(mMarkerPoints.size()==1){
            options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
        }else if(mMarkerPoints.size()==2){
            options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
        }

        // Add new marker to the Google Map Android API V2
        map.addMarker(options);
    }

    @Override
    public void onLocationChanged(Location locatione) {
        currentBestLocation = locatione;
        Criteria criteria = new Criteria();
        String provider = locationManager.getBestProvider(criteria, true);
        location = locationManager.getLastKnownLocation(provider);
        currentPos = new LatLng(currentBestLocation.getLatitude(), currentBestLocation.getLongitude());
        mMarkerPoints.add(currentPos);
        if(mMarkerPoints.size() < 2){

            mLatitude = locatione.getLatitude();
            mLongitude = locatione.getLongitude();
            LatLng point = new LatLng(mLatitude, mLongitude);

            map.moveCamera(CameraUpdateFactory.newLatLng(point));
            map.animateCamera(CameraUpdateFactory.zoomTo(12));

            drawMarker(point);
        }
    }

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

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }

    private String getDirectionsUrl(LatLng origin,LatLng dest){

        String str_origin = "origin="+origin.latitude+","+origin.longitude;

        String str_dest = "destination="+dest.latitude+","+dest.longitude;

        String sensor = "sensor=false";

        String parameters = str_origin+"&"+str_dest+"&"+sensor;

        String output = "json";

        String url = "https://maps.googleapis.com/maps/api/directions/"+output+"?"+parameters;

        return url;
    }

    private String downloadUrl(String strUrl) throws IOException {
        String data = "";
        InputStream iStream = null;
        HttpURLConnection urlConnection = null;
        try{
            URL url = new URL(strUrl);

            urlConnection = (HttpURLConnection) url.openConnection();

            //urlConnection.connect();
            urlConnection.setReadTimeout(10000 /* milliseconds */);
            urlConnection.setConnectTimeout(15000 /* milliseconds */);
            urlConnection.setRequestMethod("GET");
            urlConnection.setDoInput(true);
            // Starts the query
            urlConnection.connect();


            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){
            e.printStackTrace();
        }finally{
            iStream.close();
            urlConnection.disconnect();
        }
        return data;
    }

    /** A class to download data from Google Directions URL */
    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 Directions 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;

            // 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(6);
                lineOptions.color(Color.RED);
            }

            // Drawing polyline in the Google Map for the i-th route
            //map.addPolyline(lineOptions);
            polyline = map.addPolyline(lineOptions);
        }
    }

    @Override
    public void onDestroyView() {

        super.onDestroyView();
        Fragment fragment = (getFragmentManager().findFragmentById(R.id.map));
        if (fragment != null){
            getActivity().getSupportFragmentManager().beginTransaction()
                    .remove(fragment)
                    .commit();
        }
    }
}

I have current location and position from marker and when click to draw polyline I get Unable to resolve host "maps.googleapis.com": No address associated with hostname. And application crash. When start again everything works fine and polyline add to map. Any idea why?

answer1: 回答1:

I resolve my problem using:

  urlConnection.setReadTimeout(15000 /* milliseconds */);
            urlConnection.setConnectTimeout(15000 /* milliseconds */);
            urlConnection.setDoInput(true);

我解决我的问题使用:

  urlConnection.setReadTimeout(15000 /* milliseconds */);
            urlConnection.setConnectTimeout(15000 /* milliseconds */);
            urlConnection.setDoInput(true);
android