0

I am trying to get the distance between two places my origin place latitudes and longitudes are hard coded in the program and the destination latitudes and longitudes are retrieved by geocoding the user entry in the search box

But when i click the button which executes onClick() method in MapsActivity.java the following error is showed:

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
    at org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
    at org.json.JSONTokener.nextValue(JSONTokener.java:94)
    at org.json.JSONObject.<init>(JSONObject.java:156)
    at org.json.JSONObject.<init>(JSONObject.java:173)
    at com.example.itachi.com.mmaps.DataParser.parseDirections(DataParser.java:55)
    at com.example.itachi.com.mmaps.GetDirectionsData.onPostExecute(GetDirectionsData.java:30)
    at com.example.itachi.com.mmaps.GetDirectionsData.onPostExecute(GetDirectionsData.java:9)
    at android.os.AsyncTask.finish(AsyncTask.java:651)
    at android.os.AsyncTask.-wrap1(AsyncTask.java)
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5461)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

MapsActivity.java:

    public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener, LocationListener {

    private GoogleMap mMap;
    //Google Api
    private GoogleApiClient client;
    //Location Request Object
    private LocationRequest locationRequest;
    //Location
    private Location lastLocation;
    //Marker
    private Marker currentLocation;
    //Request Location Code
    public static final int REQUEST_LOCATION_CODE = 99;
    //Origin lat lang
    double latitude,longitude;
    //destination lat lang
    double end_latitude, end_longitude;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            checkLocationPermission();
        }

        // Obtain the SupportMapFragment and get notified when the map is ready to be used.
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch(requestCode){
            case REQUEST_LOCATION_CODE:
                if(grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                    //WHEN PERMISSIONS ARE GRANTED
                    if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
                        if(client == null){
                            buildGoogleApiClient();
                        }
                        mMap.setMyLocationEnabled(true);
                    }
                }
                else {
                    Toast.makeText(this, "Permissions Denied", Toast.LENGTH_SHORT).show();
                }
                return;
        }
    }



    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
       if(ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
           buildGoogleApiClient();
           mMap.setMyLocationEnabled(true);
       }


    }

    protected synchronized void buildGoogleApiClient() {
        //Here we build out Google api and then connect

        client = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this).addOnConnectionFailedListener(this)
                .addApi(LocationServices.API).build();
        client.connect();
    }

    @Override
    public void onConnected(@Nullable Bundle bundle) {

        //Here we request the location regularly and update the location for a specific interval

        locationRequest = new LocationRequest();
        locationRequest.setInterval(1000);
        locationRequest.setFastestInterval(1000);
        locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            //noinspection deprecation
            LocationServices.FusedLocationApi.requestLocationUpdates(client, locationRequest, this);
        }


    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }

    @Override
    public void onLocationChanged(Location location) {
        lastLocation = location;
        //Checking if there is any previous location shared
        if(currentLocation != null){
            //if there is any other location shared remove it
            currentLocation.remove();
        }
        //getting the lat and lang of the location and saving them to LatLang
        LatLng latlng = new LatLng(location.getLatitude(), location.getLongitude());

        //Setting the marker like its properties , position and etc,.,.
        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.position(latlng);
        markerOptions.title("Current Location");
        markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_BLUE));
        //Appending these properties to the marker
        currentLocation = mMap.addMarker(markerOptions);
        //Move the screen as per the locations saved
        mMap.moveCamera(CameraUpdateFactory.newLatLng(latlng));
        mMap.animateCamera(CameraUpdateFactory.zoomBy(10));
        //After getting the location and updating the marker we have to stop requesting
        if(client != null){
            //removing the location updating api
            //noinspection deprecation
            LocationServices.FusedLocationApi.removeLocationUpdates(client, this);
        }

    }

    //Create a method to check the permissions
    public boolean checkLocationPermission(){
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
            if(ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.ACCESS_FINE_LOCATION)){
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},REQUEST_LOCATION_CODE);
            }
            else{
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION},REQUEST_LOCATION_CODE);

            }
            return false;
        }
        return true;
    }


    public void onClick(View view){
        if(view.getId() == R.id.B_search){
            mMap.clear();
            //Collecting the distance using api
            Object dataTransfer[] = new Object[2];
            String url = getDirectionUrl();
            GetDirectionsData getDirectionsData = new GetDirectionsData();
            dataTransfer[0] = mMap;
            dataTransfer[1] = url;

            getDirectionsData.execute(dataTransfer);


            // collecting the text entered by the person
            EditText tf_location = findViewById(R.id.TF_Location);
            String location = tf_location.getText().toString();
            List<Address> addressList = null;
            MarkerOptions mo = new MarkerOptions();

            if(location != ""){
                //create an object for geocoding the location
                Geocoder geoCoder = new Geocoder(this);

                try {
                    addressList = geoCoder.getFromLocationName(location, 5);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                for (int i=0; i<addressList.size();i++){
                    Address myAddress = addressList.get(i);
                    LatLng latLng = new LatLng(myAddress.getLatitude(),myAddress.getLongitude());
                    end_latitude = myAddress.getLatitude();
                    end_longitude = myAddress.getLongitude();
                    Log.d("lat by pavan gadu",String.valueOf(end_latitude));
                    Log.d("lon",String.valueOf(end_longitude));
                    mo.position(latLng);
                    mo.title("search results");
                    mMap.addMarker(mo);
                    mMap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
                }
            }
        }
    }
    private String getDirectionUrl(){
        latitude = 15.5997300;
        longitude = 79.6064320;
        StringBuilder googleDorectionsUrl = new StringBuilder("https://maps.googleapis.com/maps/api/directions/json?");
        //append the origin(tghis is of three ways -1.)send the place name , 2.)send the place lat lang 3.)send the place id
        googleDorectionsUrl.append("origin"+latitude+","+longitude);
        //append the destination
        googleDorectionsUrl.append("&destination"+end_latitude+","+end_longitude);
        //append the key
        googleDorectionsUrl.append("&key="+"AIzaSyCAcfy-02UHSu2F6WeQ1rhQhkCr51eBL9g");
        //return the url
        Log.d("Url sending pan gadu:",googleDorectionsUrl.toString());
        return  googleDorectionsUrl.toString();

    }
}

GetDirectionsData.java class:

public class GetDirectionsData extends AsyncTask<Object, String, String> {
String url;
GoogleMap mMap;
String googleDirectionsData;
@Override
protected String doInBackground(Object... objects) {
    mMap = (GoogleMap) objects[0];
    url = (String)objects[1];
    DownloadUrl downloadUrl = new DownloadUrl();
    try {
        googleDirectionsData = downloadUrl.readUrl(url);
    } catch (Exception e) {
        e.printStackTrace();
    }

    return googleDirectionsData;
}
@Override
protected void onPostExecute(String s) {
    HashMap<String, String> directionsList = null;
    DataParser parser = new DataParser();
    directionsList = parser.parseDirections(s);
}

}

DataParser.java class :

public class DataParser {
private HashMap<String, String> getPlace(JSONObject googlePlaceJson){
    //Detailos about the place are being stored in the hashmap
    HashMap<String, String> googlePlacesMap = new HashMap<>();
    //Declaring all the primary data of the place to strings
    String placeName = "-NA-";
    String vicinity = "-NA-";
    String latitude = "";
    String longitude = "";
    String reference = "";
    //fetching dta from the given JSON object and parsing to string
    try{
        if(!googlePlaceJson.isNull("name")){

            placeName = googlePlaceJson.getString("name");

        }
        if(!googlePlaceJson.isNull("vicinity")){

            vicinity = googlePlaceJson.getString("vicinity");
        }
        latitude = googlePlaceJson.getJSONObject("geometry").getJSONObject("location").getString("lat");
        longitude = googlePlaceJson.getJSONObject("geometry").getJSONObject("location").getString("lng");

        reference =  googlePlaceJson.getString("reference");

        googlePlacesMap.put("place_name", placeName);
        googlePlacesMap.put("vicinity", vicinity);
        googlePlacesMap.put("lat", latitude);
        googlePlacesMap.put("lng", longitude);
        googlePlacesMap.put("reference", reference);


    }
    catch (JSONException e) {
        e.printStackTrace();
    }
    //finally return the data
    return  googlePlacesMap;
}
public HashMap<String, String> parseDirections (String jsonData){
    JSONArray jsonArray = null;
    JSONObject jsonObject;
    try {
        jsonObject = new JSONObject(jsonData);
        jsonArray = jsonObject.getJSONArray("routs");


    } catch (JSONException e) {
        e.printStackTrace();
    }
    return  getDuration(jsonArray);
}

private HashMap<String, String> getDuration(JSONArray googleDirectionsJson){
    HashMap<String, String> googleDirectionsMap = new HashMap<>();
    String duration = "";
    String distance = "";
    Log.d("Json response",googleDirectionsJson.toString());

    return googleDirectionsMap;
}

}

DownloadUrl.java is:

    public String readUrl(String myUrl){

    String data ="";
    InputStream inputStream = null;
    HttpURLConnection urlConnection = null;
    try {
        //getting the url
        URL url = new URL(myUrl);
        //open connection
        urlConnection = (HttpURLConnection) url.openConnection();
        //connect the url
        urlConnection.connect();
        Log.d("message",":in urldownload");

        //Read the data
        inputStream = urlConnection.getInputStream();
        //feed it to BufferReader
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
        //open a string buffer
        StringBuffer sb = new StringBuffer();


        String line = "";
        while((line = br.readLine()) != null){
            //append all the data present in the string buffer in line(which is the string object)
            sb.append(line);
        }
        //parse the string buffer to actual string and save in data variabke
        data = sb.toString();
        //close the buffer
        br.close();


    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    finally {
        try {
            //close the streem buffer and url connection
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        urlConnection.disconnect();
    }

    return data;

}

}

Vemuri Pavan
  • 193
  • 3
  • 13
  • Sorry for the long codes, but I am not able to find whats wrong with the code – Vemuri Pavan Jun 21 '18 at 15:59
  • in the call to `new JSONObject(jsonData)`, are you sure that `jsonData` is not `null`? – Ted Hopp Jun 21 '18 at 16:03
  • The `Exception` says it's line 55 of `DataParser`. I can't see line numbers of your code here but you have to look at what property of the JSON you're parsing on that line and check the original JSON. The property will most likely not exist. – Sander Jun 21 '18 at 16:04
  • @Sander its in the parseDirections method try block first line – Vemuri Pavan Jun 21 '18 at 16:08
  • 1
    In that case it has nothing to do with calculating distances or parsing JSON. Read up on what NullPointerExceptions are and why they are happening. – Sander Jun 21 '18 at 16:22

0 Answers0