2017-06-20 3 views
1

Ich habe einen Fehler in dieser Codezeile (72). Ich habe schon eine Suche im Forum gemacht aber noch nichts gelöst, ich habe versucht auf getMapAsync() umzusteigen;Fehler getMap();

Es scheint, dass diese Funktion veraltet ist, aber wie dieser Code, den ich im Internet fand, weiß ich nicht, wie man es aktualisiert.

http://wptrafficanalyzer.in/blog/driving-route-from-my-location-to-destination-in-google-maps-android-api-v2/

public class MapsActivity extends FragmentActivity implements LocationListener { 

    GoogleMap mGoogleMap; 
    ArrayList<LatLng> mMarkerPoints; 
    double mLatitude = 0; 
    double mLongitude = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps); 

     // Getting Google Play availability status 
     int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext()); 

     if (status != ConnectionResult.SUCCESS) { // Google Play Services are not available 

      int requestCode = 10; 
      Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode); 
      dialog.show(); 

     } else { // Google Play Services are available 

      // Initializing 
      mMarkerPoints = new ArrayList<LatLng>(); 

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

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

      // Enable MyLocation Button in the Map 
      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, 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. 
       return; 
      } 
      mGoogleMap.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 From GPS 
      Location location = locationManager.getLastKnownLocation(provider); 

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

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

      // Setting onclick event listener for the map 
      mGoogleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { 

       @Override 
       public void onMapClick(LatLng point) { 

        // Already map contain destination location 
        if(mMarkerPoints.size()>1){ 

         FragmentManager fm = getSupportFragmentManager(); 
         mMarkerPoints.clear(); 
         mGoogleMap.clear(); 
         LatLng startPoint = new LatLng(mLatitude, mLongitude); 
         drawMarker(startPoint); 
        } 

        drawMarker(point); 

        // Checks, whether start and end locations are captured 
        if(mMarkerPoints.size() >= 2){ 
         LatLng origin = mMarkerPoints.get(0); 
         LatLng dest = mMarkerPoints.get(1); 

         // Getting URL to the Google Directions API 
         String url = getDirectionsUrl(origin, dest); 

         DownloadTask downloadTask = new DownloadTask(); 

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

    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; 
     String sensor = "sensor=false"; 

     // Sensor enabled 

     // 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){ 
      Log.d("Exception while downloading url", e.toString()); 
     }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(2); 
       lineOptions.color(Color.RED); 

      } 

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


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

     // Creating MarkerOptions 
     MarkerOptions options = new MarkerOptions(); 

     // Setting the position of the marker 
     options.position(point); 

     /** 
     * For the start location, the color of marker is GREEN and 
     * for the end location, the color of marker is RED. 
     */ 
     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 
     mGoogleMap.addMarker(options); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     // Draw the marker, if destination location is not set 
     if(mMarkerPoints.size() < 2){ 

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

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

      drawMarker(point); 
     } 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 
    } 
} 

Antwort

0

Das Problem ist, dass die Karte Instanziierung nicht beendet, wenn die onCreate läuft. Sie müssen Ihre Aufgaben je nach Karte starten, wenn Sie den Rückruf erhalten haben, dass die Map fertig geladen ist.

+0

Es kann Beispiel, wo ich ändern sollte Ich bin neu in Android. –

0

Sie sollten versuchen, Karte async, so etwas zu bekommen:

public class FindLocationActivity extends AppCompatActivity implements 
      OnMapReadyCallback { 

     private GoogleMap map; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_find_location); 

      SupportMapFragment mapFragment = 
        (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); 
      mapFragment.getMapAsync(this); 
     } 

     @Override 
     public void onMapReady(GoogleMap map) { 
      this.map = map; 
      //from this moment do whatever you want to do with map 
     } 
    } 

Sie becouse Karte wahrscheinlich Fehler immer noch nicht bereit, wenn Sie getMap() aufrufen und Sie null erhalten. Um das zu verhindern, sollten Sie immer map async erhalten, und wenn es fertig ist, machen Sie einige Operationen darauf.

Verwandte Themen