2015-02-23 3 views
0

Я пытаюсь нарисовать полилинию для googlemap, она отлично работает до версии Android 4.4 (kitkat), но она не работает в android 5.0 (lollipop). что делать для работы в леденец. не могли бы вы помочь мне мотыгу, чтобы решить эта проблему выдает это мой Google Map кодgoogle map polyline не работает в 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); 
     }   
    } 
} 
+0

, пожалуйста, опишите вашу проблему – Xcihnegn

+0

@ Xingchen Я показываю карту google с маркером и полилинией, она отлично работает с Android 4.4, но не работает. poly line означает, например, я хочу нарисовать линию из текущего местоположения (gps) в целевое местоположение для того, что я использую polyline, это работает до 4.4, но не работает в 5.0. Это моя проблема. –

+0

Вы имеете в виду, что полилиния не отображается без каких-либо ошибок? – Xcihnegn

ответ

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 петля.

Надеюсь, что эта помощь.

+0

ya он работает хорошо, спасибо, но не могли бы вы объяснить причину этой проблемы. мне нужно знать, почему раньше он не работал, и теперь, как он работает –

0

Теперь снова Google выпустил новый API, но они не обновили документацию должным образом. Чтобы подключиться к API, вам необходимо создать экземпляр клиента API сервисов Google Play.

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

Смежные вопросы