【问题标题】:google map polyline is not working on android version 5.0(lollipop)谷歌地图折线不适用于 android 版本 5.0(棒棒糖)
【发布时间】:2016-07-02 20:59:18
【问题描述】:

我正在尝试为 googlemap 绘制折线,它在 android 版本 4.4(kitkat) 中运行良好,但在 android 5.0(lollipop) 中无法运行。在棒棒糖工作也应该怎么做。你能帮我解决这个问题吗这是我的谷歌地图代码

public class MapLocation extends FragmentActivity implements OnMarkerClickListener {

    GoogleMap map;
    ArrayList<LatLng> markerPoints;

    LatLng origin,dest1,dest2,dest3;    
    Marker marker1,marker2,marker3;

    PolylineOptions lineOptions = new PolylineOptions();

    Polyline line ;
    int pos;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.gmap_direction);

        markerPoints = new ArrayList<LatLng>();

        // Getting reference to SupportMapFragment of the activity_main
        SupportMapFragment fm = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);

        // Getting Map for the SupportMapFragment
        map = fm.getMap();      

        if(map!=null){

            // Enable MyLocation Button in the Map
            map.setMyLocationEnabled(true);     

            // Getting LocationManager object from System Service LOCATION_SERVICE
            LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

            // Creating a criteria object to retrieve provider
            Criteria criteria = new Criteria();

            // Getting the name of the best provider
            String provider = locationManager.getBestProvider(criteria, true);

            // Getting Current Location
            Location location = locationManager.getLastKnownLocation(provider);
            pos = getIntent().getIntExtra("pos",0); 
            try{
            switch (pos) {

               case 1:

                   dest2 = new LatLng(18.545981, 73.902132);
                   marker2 = map.addMarker(new MarkerOptions().position(dest2).title("Vivero International Preschool").snippet("PUNE,KALYANINAGAR").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
                   break;
               case 2:

                   dest2 = new LatLng(17.429122, 78.412745);
                   marker2 =  map.addMarker(new MarkerOptions().position(dest2).title("Vivero International Preschool").snippet("Jubilee Hills").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
                   break;
               case 3:

                   dest2 =  new LatLng(19.115177, 72.909486);
                   marker2 = map.addMarker(new MarkerOptions().position(dest2).title("Vivero International Preschool").snippet("MUMBAI, POWAI").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
                   break;
               case 4:

                   dest2 = new LatLng(18.545981, 73.902132);
                   marker2 =  map.addMarker(new MarkerOptions().position(dest2).title("Vivero International Preschool").snippet("PUNE,MAGARPATTA").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
                   break;
               case 5:

                   dest2 = new LatLng(12.924438, 77.631537);
                   marker2 =  map.addMarker(new MarkerOptions().position(dest2).title("Vivero International Preschool").snippet("Koramangala").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
                   break;
               case 6:

                   dest2 =  new LatLng(12.9044019,77.6690773);
                   marker2 = map.addMarker(new MarkerOptions().position(dest2).title("Vivero International Preschool").snippet("Sarjapur").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
                   break;
               case 7:

                   dest2 = new LatLng(12.972442, 77.639195);
                   marker2 =  map.addMarker(new MarkerOptions().position(dest2).title("Vivero International Preschool").snippet("Indiranagar").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
                   break;
               case 8:

                   dest2 = new LatLng(12.968719, 77.747883);
                   marker2 =  map.addMarker(new MarkerOptions().position(dest2).title("Vivero International Preschool").snippet("Whitefield").icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
                   break;
                   //  dest1 = new LatLng(19.115177, 72.909486);
            }

            // Showing the current location in Google Map
            map.moveCamera(CameraUpdateFactory.newLatLng(dest2));

            // Zoom in the Google Map
            map.animateCamera(CameraUpdateFactory.zoomTo(15));     

            marker2.showInfoWindow();   


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

            String url = getDirectionsUrl(origin, dest2);               

            DownloadTask downloadTask = new DownloadTask();

            // Start downloading json data from Google Directions API
            downloadTask.execute(url);
            }
            }
            catch(Exception e){

            }
        }       
    }
    /** 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(4);
                lineOptions.color(Color.BLUE);

            }

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

【问题讨论】:

  • 请描述您的问题
  • @Xingchen 我正在显示带有标记和折线的谷歌地图,它在 android 4.4 之前工作正常,但 android 5.0 折线没有出现。折线意味着例如我想从当前位置(gps)画线到目标位置,因为我正在使用折线这工作到 4.4 但不能在 5.0 中工作这是我的问题
  • 你的意思是折线没有显示没有任何错误?
  • @Xingchen 我没有收到任何错误。我的问题是折线仅在 android 版本 5.0(lollipop) 上不显示,但它显示的是 android 版本 4.4(kitkat) 你能告诉我如何解决这个问题
  • addPolyLine 来自 Google Maps Android API v2,那么与 Android API 21 有什么关系?

标签: android google-maps android-5.0-lollipop polyline


【解决方案1】:

为您的onPostExecute 尝试修改后的代码:

@Override
protected void onPostExecute(List<List<HashMap<String, String>>> result) {
        ArrayList<LatLng> points = null;
        //PolylineOptions lineOptions = null;

        //MarkerOptions markerOptions = new MarkerOptions();

        points = new ArrayList<LatLng>();

        // 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(4);
            //lineOptions.color(Color.BLUE);

        }

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

        lineOptions.addAll(points);
        lineOptions.width(4);
        lineOptions.color(Color.BLUE); 
        line = map.addPolyline(lineOptions);
    }           

我将您的列表 points 实例移到 for 循环之前,并将 lineOptions 移到 for 循环之后。

希望对您有所帮助。

【讨论】:

  • 是的,它运行良好,非常感谢,但您能否解释一下这个问题的原因。我需要知道为什么以前它不工作,现在它是如何工作的
【解决方案2】:

现在谷歌又发布了一个新的 API,但他们没有正确更新文档。要连接到 API,您需要创建一个 Google Play 服务 API 客户端的实例。

 mGoogleApiClient = new GoogleApiClient.Builder(this)
    .addConnectionCallbacks(this)
    .addOnConnectionFailedListener(this)
    .addApi(LocationServices.API)
    .build();

连接到 Google Play 服务和位置服务 API 后,您可以获取用户设备的最后一个已知位置。当您的应用程序连接到这些时,您可以使用融合位置提供程序的 getLastLocation() 方法来检索设备位置。为此,您必须在您的类/活动中实现此接口

implements
    ConnectionCallbacks, OnConnectionFailedListener

然后你就可以找到这个实现的方法了

@Override
    public void onConnected(Bundle bundle) {
mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
                mGoogleApiClient);
        if (mLastLocation != null) {
            mLatitudeText.setText(String.valueOf(mLastLocation.getLatitude()));
            mLongitudeText.setText(String.valueOf(mLastLocation.getLongitude()));
        }
    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {

    }

这是我完整的code into this thread .文档is here

【讨论】:

    猜你喜欢
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-04
    • 1970-01-01
    相关资源
    最近更新 更多