2016-04-07 11 views
-1

私はアンドロイドで道路の方向を描きたいと思います。私は何度も試してみましたが、私はいつもあなたの助けGoogleマップヌルオブジェクトリファレンスでインタフェースメソッド 'int java.util.List.size()'を呼び出そうとしています

行き方パーサ

public class DirectionsJSONParser { 

public List<List<HashMap<String, String>>> parse(JSONObject jObject) { 

    List<List<HashMap<String, String>>> routes = new ArrayList<List<HashMap<String, String>>>(); 

    JSONArray jRoutes = null; 
    JSONArray jLegs = null; 
    JSONArray jSteps = null; 


    try { 

     jRoutes = jObject.getJSONArray("routes"); 

     for (int i=0 ; i<jRoutes.length(); i++) 
     { 
      jLegs = ((JSONObject)jRoutes.get(i)).getJSONArray("legs"); 
      List path = new ArrayList<HashMap<String, String>>(); 

      for (int j=0; j<jLegs.length(); j++) 
      { 
       jSteps = ((JSONObject)jLegs.get(j)).getJSONArray("steps"); 


       for (int k=0; k<jSteps.length(); k++) 
       { 
        String polyline = ""; 
        polyline = (String)((JSONObject)((JSONObject)jSteps.get(k)).get("polyline")).get("points"); 
        List<LatLng> list = decodePoly(polyline); 

        for(int l=0; l<list.size(); l++) 
        { 
         HashMap<String, String> hm = new HashMap<String, String>(); 
         hm.put("lat", Double.toString(((LatLng)list.get(l)).latitude)); 
         hm.put("lng", Double.toString(((LatLng)list.get(l)).longitude)); 
         path.add(hm); 
        } 
       } 
       routes.add(path); 
      } 

     } 

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

    }catch (Exception e) 
    { 
    } 

    return routes; 
} 

private List<LatLng> decodePoly(String encoded) 
{ 
    List<LatLng> poly = new ArrayList<LatLng>(); 
    int index = 0, len = encoded.length(); 
    int lat = 0, lng = 0; 

    while (index < len) { 
     int b, shift = 0, result = 0; 
     do { 
      b = encoded.charAt(index++) - 63; 
      result |= (b & 0x1f) << shift; 
      shift += 5; 
     } while (b >= 0x20); 
     int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
     lat += dlat; 

     shift = 0; 
     result = 0; 
     do { 
      b = encoded.charAt(index++) - 63; 
      result |= (b & 0x1f) << shift; 
      shift += 5; 
     } while (b >= 0x20); 
     int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
     lng += dlng; 

     LatLng p = new LatLng((((double) lat/1E5)), 
       (((double) lng/1E5))); 
     poly.add(p); 
    } 
    return poly; 
} 

}

DirectionActivityに同じerror.Thankあなたを得る

public class DirectionActivity extends FragmentActivity { 

GoogleMap map; 
ArrayList<LatLng> markerPoints; 


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

    markerPoints = new ArrayList<LatLng>(); 
    map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.haritafragment)).getMap(); 

    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.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; 
    } 
    map.setMyLocationEnabled(true); 
    map.setOnMapClickListener(new GoogleMap.OnMapClickListener() { 
     @Override 
     public void onMapClick(LatLng point) { 
      if(markerPoints.size()>1) 
      { 
       markerPoints.clear(); 
       map.clear(); 
      } 

      markerPoints.add(point); 
      MarkerOptions options = new MarkerOptions(); 
      options.position(point); 

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

      if(markerPoints.size() >= 2) 
      { 
       LatLng origin = markerPoints.get(0); 
       LatLng dest = markerPoints.get(1); 

       String url = getDirectionsUrl(origin, dest); 

       DownloadTask downloadTask = new DownloadTask(); 
       downloadTask.execute(); 

      } 
     } 
    }); 
} 

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"; 

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

    return url; 
} 


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

     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; 
} 


// 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); 
    } 
} 


private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String,String>>>>{ 

    @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; 
    } 

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

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

}

とERROR

04-07 05:59:35.517 19387から19387/E/AndroidRuntime com.example.mapdemo:致命的な例外:メイン プロセス:com.example.mapdemo、PID:19387 java.lang.NullPointerException:ヌルオブジェクトリファレンスでインタフェースメソッド 'int java.util.List.size()'を呼び出そうとしました com.example.mapdemo.DirectionActivity $ ParserTask.onPostExecute(DirectionActivity.java:215) at com.example.mapdemo.DirectionActivity $ ParserTask.onPostExecute(DirectionActivity.java:189) android.os.AsyncTask.finish( AsyncTask.java:636) android.os.AsyncTask.access $ 500(AsyncTask.java:177) at android.os.AsyncTask $ InternalHandler.handleMessage(AsyncTask.java:653) android.os.Handler.dispatchMessage (Handler.java:102) android.os.Looper.loop(Looper.java:135) android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke (ネイティブメソッド) at java.lang.reflect.Mava.zip(0120) internal.os.ZygoteInit.main(ZygoteInit.ja VA:698)

enter image description here

答えて

0

をあなたはDownloadTaskにURLを渡していません。以下のようなものを試す

downloadTask.execute(url); 
関連する問題