计算距离

时间:2017-04-19 19:30:01

标签: java android

我从设备和服务器获取经度和纬度。它也显示出来。但是当我尝试计算距离时,应用程序会崩溃。

这是我的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);
    }
}

这是我的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

从logcat,我认为这可能是转换错误......但我不确定。

任何帮助表示赞赏!!!

1 个答案:

答案 0 :(得分:0)

检查这里返回的内容:

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

好像你的JSON响应包含无效数据,或者你期望它实际上有什么不同。在这种情况下,似乎没有名称的字段,其值由Config.KEY_LATITUDE定义。