-3

I get the latitude and longitude from my device as well as from server. It displays as well. But when i try to calculate the distance, the app crashes.

This is my MainActivity.java

import android.Manifest;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import static com.android.volley.Request.Method.GET;
import static com.example.john.bustrackclient.R.id.textView4;

public class MainActivity extends AppCompatActivity implements View.OnClickListener,LocationListener {

    LocationManager locationManager;
    String mprovider;
    String latitude, longitude,latitude1,longitude1;

    private EditText editTextId;
    private Button buttonGet;
    private TextView textViewResult,textView6;

    private ProgressDialog loading;

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

        editTextId = (EditText) findViewById(R.id.editTextId);
        buttonGet = (Button) findViewById(R.id.buttonGet);
        textViewResult = (TextView) findViewById(R.id.textViewResult);

        buttonGet.setOnClickListener(this);

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        Criteria criteria = new Criteria();

        mprovider = locationManager.getBestProvider(criteria, false);

        if (mprovider != null && !mprovider.equals("")) {
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            Location location = locationManager.getLastKnownLocation(mprovider);
            locationManager.requestLocationUpdates(mprovider, 15000, 1, this);

            if (location != null)
                onLocationChanged(location);
            else
                Toast.makeText(getBaseContext(), "No Location Provider Found Check Your Code", Toast.LENGTH_SHORT).show();
        }
    }

    public void onLocationChanged(Location location) {
        TextView latitude = (TextView) findViewById(R.id.textView2);
        TextView longitude = (TextView) findViewById(R.id.textView3);

        latitude.setText("Latitude: " + location.getLatitude());
        longitude.setText("Longitude: " + location.getLongitude());

    }

    public void onStatusChanged(String s, int i, Bundle bundle) {
    }

    public void onProviderEnabled(String s) {
    }

    public void onProviderDisabled(String s) {
    }


    private void getData() {
        String destination = editTextId.getText().toString().trim();
        if (destination.equals("")) {
            Toast.makeText(this, "Please enter your destination", Toast.LENGTH_LONG).show();
            return;
        }
        loading = ProgressDialog.show(this, "Please wait...", "Fetching...", false, false);

        String url = Config.DATA_URL + editTextId.getText().toString().trim();

        StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
            @Override
            public void onResponse(String response) {
                loading.dismiss();
                showJSON(response);
            }
        },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Toast.makeText(MainActivity.this, error.getMessage().toString(), Toast.LENGTH_LONG).show();
                    }
                });

        RequestQueue requestQueue = Volley.newRequestQueue(this);
        requestQueue.add(stringRequest);
    }

    private void showJSON(String response){
        latitude1="";
        longitude1="";
        try {
            JSONObject jsonObject = new JSONObject(response);
            JSONArray result = jsonObject.getJSONArray(Config.JSON_ARRAY);
            JSONObject updata = result.getJSONObject(0);
            latitude1 = updata.getString(Config.KEY_LATITUDE);
            longitude1 = updata.getString(Config.KEY_LONGITUDE);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        textViewResult.setText("Latitude: "+latitude1+"\nLongitude: "+longitude1);
    }



    @Override
    public void onClick(View v)
    {

        getData();
        int MILLION = 1000000;
        int EARTH_RADIUS_KM = 6371;

        double lati1=Double.parseDouble(latitude);
        double long1=Double.parseDouble(longitude);
        double lati2=Double.parseDouble(latitude1);
        double long2=Double.parseDouble(longitude1);

        double lat1 = lati1 / MILLION;
        double lon1 = long1 / MILLION;
        double lat2 = lati2 / MILLION;
        double lon2 = long2 / MILLION;

        double lat1Rad = Math.toRadians(lat1);
        double lat2Rad = Math.toRadians(lat2);
        double deltaLonRad = Math.toRadians(lon2 - lon1);

        double dist = Math
                .acos(Math.sin(lat1Rad) * Math.sin(lat2Rad) + Math.cos(lat1Rad)
                        * Math.cos(lat2Rad) * Math.cos(deltaLonRad))
                * EARTH_RADIUS_KM;

        String distance=Double.toString(dist);
        textView6.setText(distance);
    }
}

This is my logcat

04-19 15:27:27.717 28686-28686/? D/dalvikvm: Late-enabling CheckJNI
04-19 15:27:27.785 28686-28686/com.example.john.bustrackclient I/InstantRun: Instant Run Runtime started. Android package is com.example.john.bustrackclient, real application class is null.
04-19 15:27:27.785 28686-28686/com.example.john.bustrackclient W/InstantRun: No instant run dex files added to classpath
04-19 15:27:27.789 28686-28686/com.example.john.bustrackclient I/dalvikvm: Could not find method android.view.Window$Callback.onProvideKeyboardShortcuts, referenced from method android.support.v7.view.WindowCallbackWrapper.onProvideKeyboardShortcuts
04-19 15:27:27.789 28686-28686/com.example.john.bustrackclient W/dalvikvm: VFY: unable to resolve interface method 16119: Landroid/view/Window$Callback;.onProvideKeyboardShortcuts (Ljava/util/List;Landroid/view/Menu;I)V
04-19 15:27:27.789 28686-28686/com.example.john.bustrackclient D/dalvikvm: VFY: replacing opcode 0x72 at 0x0002
04-19 15:27:27.789 28686-28686/com.example.john.bustrackclient W/dalvikvm: VFY: unable to find class referenced in signature (Landroid/view/SearchEvent;)
04-19 15:27:27.789 28686-28686/com.example.john.bustrackclient I/dalvikvm: Could not find method android.view.Window$Callback.onSearchRequested, referenced from method android.support.v7.view.WindowCallbackWrapper.onSearchRequested
04-19 15:27:27.789 28686-28686/com.example.john.bustrackclient W/dalvikvm: VFY: unable to resolve interface method 16121: Landroid/view/Window$Callback;.onSearchRequested (Landroid/view/SearchEvent;)Z
04-19 15:27:27.789 28686-28686/com.example.john.bustrackclient D/dalvikvm: VFY: replacing opcode 0x72 at 0x0002
04-19 15:27:27.793 28686-28686/com.example.john.bustrackclient I/dalvikvm: Could not find method android.view.Window$Callback.onWindowStartingActionMode, referenced from method android.support.v7.view.WindowCallbackWrapper.onWindowStartingActionMode
04-19 15:27:27.793 28686-28686/com.example.john.bustrackclient W/dalvikvm: VFY: unable to resolve interface method 16125: Landroid/view/Window$Callback;.onWindowStartingActionMode (Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;
04-19 15:27:27.793 28686-28686/com.example.john.bustrackclient D/dalvikvm: VFY: replacing opcode 0x72 at 0x0002
04-19 15:27:27.793 28686-28686/com.example.john.bustrackclient I/dalvikvm: Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.widget.TintTypedArray.getChangingConfigurations
04-19 15:27:27.793 28686-28686/com.example.john.bustrackclient W/dalvikvm: VFY: unable to resolve virtual method 697: Landroid/content/res/TypedArray;.getChangingConfigurations ()I
04-19 15:27:27.793 28686-28686/com.example.john.bustrackclient D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002
04-19 15:27:27.797 28686-28686/com.example.john.bustrackclient I/dalvikvm: Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.widget.TintTypedArray.getType
04-19 15:27:27.797 28686-28686/com.example.john.bustrackclient W/dalvikvm: VFY: unable to resolve virtual method 719: Landroid/content/res/TypedArray;.getType (I)I
04-19 15:27:27.797 28686-28686/com.example.john.bustrackclient D/dalvikvm: VFY: replacing opcode 0x6e at 0x0008
04-19 15:27:27.833 28686-28686/com.example.john.bustrackclient I/dalvikvm: Could not find method android.widget.FrameLayout.startActionModeForChild, referenced from method android.support.v7.widget.ActionBarContainer.startActionModeForChild
04-19 15:27:27.833 28686-28686/com.example.john.bustrackclient W/dalvikvm: VFY: unable to resolve virtual method 16553: Landroid/widget/FrameLayout;.startActionModeForChild (Landroid/view/View;Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;
04-19 15:27:27.837 28686-28686/com.example.john.bustrackclient D/dalvikvm: VFY: replacing opcode 0x6f at 0x0002
04-19 15:27:27.881 28686-28686/com.example.john.bustrackclient I/dalvikvm: Could not find method android.content.Context.getColorStateList, referenced from method android.support.v7.content.res.AppCompatResources.getColorStateList
04-19 15:27:27.881 28686-28686/com.example.john.bustrackclient W/dalvikvm: VFY: unable to resolve virtual method 430: Landroid/content/Context;.getColorStateList (I)Landroid/content/res/ColorStateList;
04-19 15:27:27.881 28686-28686/com.example.john.bustrackclient D/dalvikvm: VFY: replacing opcode 0x6e at 0x0006
04-19 15:27:27.881 28686-28686/com.example.john.bustrackclient I/dalvikvm: Could not find method android.content.res.Resources.getDrawable, referenced from method android.support.v7.widget.ResourcesWrapper.getDrawable
04-19 15:27:27.889 28686-28686/com.example.john.bustrackclient W/dalvikvm: VFY: unable to resolve virtual method 660: Landroid/content/res/Resources;.getDrawable (ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
04-19 15:27:27.889 28686-28686/com.example.john.bustrackclient D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002
04-19 15:27:27.889 28686-28686/com.example.john.bustrackclient I/dalvikvm: Could not find method android.content.res.Resources.getDrawableForDensity, referenced from method android.support.v7.widget.ResourcesWrapper.getDrawableForDensity
04-19 15:27:27.889 28686-28686/com.example.john.bustrackclient W/dalvikvm: VFY: unable to resolve virtual method 662: Landroid/content/res/Resources;.getDrawableForDensity (IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
04-19 15:27:27.889 28686-28686/com.example.john.bustrackclient D/dalvikvm: VFY: replacing opcode 0x6e at 0x0002
04-19 15:27:27.909 28686-28686/com.example.john.bustrackclient E/dalvikvm: Could not find class 'android.graphics.drawable.RippleDrawable', referenced from method android.support.v7.widget.AppCompatImageHelper.hasOverlappingRendering
04-19 15:27:27.909 28686-28686/com.example.john.bustrackclient W/dalvikvm: VFY: unable to resolve instanceof 157 (Landroid/graphics/drawable/RippleDrawable;) in Landroid/support/v7/widget/AppCompatImageHelper;
04-19 15:27:27.909 28686-28686/com.example.john.bustrackclient D/dalvikvm: VFY: replacing opcode 0x20 at 0x000c
04-19 15:27:28.093 28686-28686/com.example.john.bustrackclient D/libEGL: loaded /system/lib/egl/libEGL_genymotion.so

                                                                         [ 04-19 15:27:28.105 28686:28686 D/         ]
                                                                         HostConnection::get() New Host Connection established 0xb85a4440, tid 28686
04-19 15:27:28.125 28686-28686/com.example.john.bustrackclient D/libEGL: loaded /system/lib/egl/libGLESv1_CM_genymotion.so
04-19 15:27:28.129 28686-28686/com.example.john.bustrackclient D/libEGL: loaded /system/lib/egl/libGLESv2_genymotion.so
04-19 15:27:28.237 28686-28686/com.example.john.bustrackclient W/EGL_genymotion: eglSurfaceAttrib not implemented
04-19 15:27:28.325 28686-28686/com.example.john.bustrackclient E/OpenGLRenderer: Getting MAX_TEXTURE_SIZE from GradienCache
04-19 15:27:28.381 28686-28686/com.example.john.bustrackclient E/OpenGLRenderer: MAX_TEXTURE_SIZE: 8192
04-19 15:27:28.413 28686-28686/com.example.john.bustrackclient E/OpenGLRenderer: Getting MAX_TEXTURE_SIZE from Caches::initConstraints()
04-19 15:27:28.421 28686-28686/com.example.john.bustrackclient E/OpenGLRenderer: MAX_TEXTURE_SIZE: 8192
04-19 15:27:28.421 28686-28686/com.example.john.bustrackclient D/OpenGLRenderer: Enabling debug mode 0
04-19 15:27:28.465 28686-28686/com.example.john.bustrackclient D/dalvikvm: GC_FOR_ALLOC freed 262K, 10% free 3093K/3412K, paused 7ms, total 9ms
04-19 15:27:35.709 28686-28686/com.example.john.bustrackclient D/dalvikvm: GC_FOR_ALLOC freed 77K, 8% free 3317K/3592K, paused 3ms, total 3ms
04-19 15:27:35.709 28686-28686/com.example.john.bustrackclient I/dalvikvm-heap: Grow heap (frag case) to 4.369MB for 1127532-byte allocation
04-19 15:27:35.713 28686-28695/com.example.john.bustrackclient D/dalvikvm: GC_FOR_ALLOC freed 1K, 6% free 4417K/4696K, paused 4ms, total 4ms
04-19 15:27:35.737 28686-28686/com.example.john.bustrackclient D/AndroidRuntime: Shutting down VM
04-19 15:27:35.737 28686-28686/com.example.john.bustrackclient W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0xa4cebb20)
04-19 15:27:35.741 28686-28686/com.example.john.bustrackclient E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                 Process: com.example.john.bustrackclient, PID: 28686
                                                                                 java.lang.NullPointerException
                                                                                     at java.lang.StringToReal.parseDouble(StringToReal.java:244)
                                                                                     at java.lang.Double.parseDouble(Double.java:295)
                                                                                     at com.example.john.bustrackclient.MainActivity.onClick(MainActivity.java:151)
                                                                                     at android.view.View.performClick(View.java:4438)
                                                                                     at android.view.View$PerformClick.run(View.java:18422)
                                                                                     at android.os.Handler.handleCallback(Handler.java:733)
                                                                                     at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                     at android.os.Looper.loop(Looper.java:136)
                                                                                     at android.app.ActivityThread.main(ActivityThread.java:5001)
                                                                                     at java.lang.reflect.Method.invokeNative(Native Method)
                                                                                     at java.lang.reflect.Method.invoke(Method.java:515)
                                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
                                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
                                                                                     at dalvik.system.NativeStart.main(Native Method)
04-19 15:27:35.925 28686-28822/com.example.john.bustrackclient D/dalvikvm: GC_FOR_ALLOC freed 292K, 8% free 4644K/4996K, paused 11ms, total 11ms
04-19 15:27:38.701 28686-28686/com.example.john.bustrackclient I/Process: Sending signal. PID: 28686 SIG: 9

From the logcat, I think it could be a conversion error... But i am not sure.

Any help is appreciated!!!

John
  • 9
  • 7
  • 1
    So basically your app throws a NullPointerException? I think we may have already answered that question a time or two. – markspace Apr 19 '17 at 19:31
  • Possible duplicate of [What is a NullPointerException, and how do I fix it?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) – takendarkk Apr 19 '17 at 19:32
  • I suspect line 151. – markspace Apr 19 '17 at 19:33
  • @takendarkk That's inside java.lang though, not the OP's code. The OP's code is two lines below that on the stack trace. – markspace Apr 19 '17 at 19:39
  • What I don't get is why can't the OP read the stack trace? Is there an actual problem understanding what it says? (Edit: @takendarkk I did, two comments above yours.) – markspace Apr 19 '17 at 19:41
  • OK. I read about it. But I am not sure if I understood it. From what I did, the exception occurs when I am trying to convert it to double. So what is the right way to do it? – John Apr 19 '17 at 19:56
  • Well, if you don't understand "the right way", then you should go back to the "What is a NullPointerException" QA linked above, and read through that. Try to ask a question about that answer that you don't understand. The cause is actually really simple and always the same, it's the understanding that is important. – markspace Apr 19 '17 at 21:36

1 Answers1

0

Check what is returned here:

 latitude1 = updata.getString(Config.KEY_LATITUDE);
 longitude1 = updata.getString(Config.KEY_LONGITUDE);

Seems like your JSON response contains invalid data or you expecting something different that it actually is. In this case it seems there is no field with the name which value is defined by Config.KEY_LATITUDE.

snikolau
  • 111
  • 1
  • 4
  • When I print them, I am getting the latitude and longitude stored in the server. The app crashes only when I add the calculation part. – John Apr 19 '17 at 19:38
  • I would suggest to run the debugger, put breakpoint on line 131 `latitude1 = updata.getString(Config.KEY_LATITUDE);` and check what do you have stored in `updata` and check if it is what you expect. – snikolau Apr 19 '17 at 19:43