0

Edit I've made some changes to my classes but I'm still having the same issue. I cannot figure out while it will crash when I start the app. I read somewhere that maybe it cannot find previous location if it doesn't exist? Perhaps there is a better way for me to get Latitude and Longitude of user's location since all I want is the gps coordinates.

Manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="viaan.carl.doordingdefender" >

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

I have an app I'm trying to put together to grab a user's current gps location and using those coordinates to grab data via JSON to report back to the user. I initially got the app to work to display the gps coordinates back but now I cannot get it to open properly. I'm not sure where to look but here is my Main Class:

public class MainActivity extends ActionBarActivity implements LocationListener{

private TextView latitudeField;
private TextView longitudeField;
private LocationManager locManager;
private String provider;

myGPS gps = new myGPS(this);

/**
 * Called when the activity is first created.
 */


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

    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new ServiceHandler()).commit();
    }
    latitudeField = (TextView)findViewById(R.id.TextView02);
    longitudeField = (TextView)findViewById(R.id.TextView04);

    //Get the location manager
    locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    //Define the criteria how to select the location provider -> use default
    Criteria criteria = new Criteria();
    provider = locManager.getBestProvider(criteria, false);
    Location location = locManager.getLastKnownLocation(provider);

    if (location != null) {
        System.out.println("Provider " + provider + " has been selected.");
        onLocationChanged(location);
    } else {
        latitudeField.setText("Location not available");
        longitudeField.setText("Location not available");
    }
}

@Override
public void onLocationChanged(Location location) {
    int lat = (int) location.getLatitude();
    int lng = (int) location.getLongitude();

    gps.setLat(lat);
    gps.setLng(lng);

}

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

}

@Override
public void onProviderEnabled(String provider) {
    Toast.makeText(this, "Enabled new provider " + provider, Toast.LENGTH_SHORT).show();
}

@Override
public void onProviderDisabled(String provider) {
    Toast.makeText(this, "Disabled provider" + provider, Toast.LENGTH_SHORT).show();
}


}

This class is to get and hold the latitude and longitude:

public class myGPS {

private int lat;
private int lng;
SharedPreferences prefs;

public myGPS(Activity activity) {
    prefs = activity.getPreferences(Activity.MODE_PRIVATE);
}


void setLng(int lng) {
    this.lng = lng;
}

    int getLat() {
    return lat;
}

    int getLng() {
    return lng;
}

void setLat(int lat) {
    this.lat = lat;
}
}

This class is to display the results:

public class ServiceHandler extends Fragment {


Handler handler;

TextView detailsField;

myGPS gps = new myGPS(getActivity());


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_wind, container, false);
    detailsField = (TextView) rootView.findViewById(R.id.details_field);
    return rootView;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    windData(gps.getLat(), gps.getLng());
}

private static final String OPEN_WEATHER_MAP_API =
        "api.openweathermap.org/data/2.5/weather?lat=%d&lon=%d&imperial";


private void windData(final Integer lat, final Integer lng) {
    new Thread() {


        public void run() {
            final JSONObject json = windFetch.getJSON(getActivity(), lat, lng);
            if (json == null) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getActivity(),
                                getActivity().getString(R.string.place_not_found),
                                Toast.LENGTH_LONG).show();
                    }
                });
            } else {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        renderWeather(json);
                    }
                });
            }
        }
    }.start();
}

private void renderWeather(JSONObject json) {
    try {
        JSONObject wind = json.getJSONObject("wind");
        int Deg = (int) Math.round((wind.getDouble("deg") - 11.25) / 22.5);

        String windDir = null;

        switch (Deg) {
            case 0:
                windDir = "N";
                break;
            case 1:
                windDir = "NNE";
                break;
            case 2:
                windDir = "NE";
                break;
            case 3:
                windDir = "ENE";
                break;
            case 4:
                windDir = "E";
                break;
            case 5:
                windDir = "ESE";
                break;
            case 6:
                windDir = "SE";
                break;
            case 7:
                windDir = "SSE";
                break;
            case 8:
                windDir = "S";
                break;
            case 9:
                windDir = "SSW";
                break;
            case 10:
                windDir = "SW";
                break;
            case 11:
                windDir = "WSW";
                break;
            case 12:
                windDir = "W";
                break;
            case 13:
                windDir = "WNW";
                break;
            case 14:
                windDir = "NW";
                break;
            case 15:
                windDir = "NNW";
                break;
        }

        detailsField.setText(
                wind.getString("Wind Speed: " + wind.getString("speed") + "mi/hr " +
                        windDir));
    } catch (Exception e) {
        Log.e("SimpleWeather", "One or more fields not found in the JSON  data");
    }
}


public static JSONObject getJSON(Context context, Integer lat, Integer lng) {
    try {
        URL url = new URL(String.format(OPEN_WEATHER_MAP_API, lat, lng));
        HttpURLConnection connection =
                (HttpURLConnection) url.openConnection();

        connection.addRequestProperty("x-api-key",
                context.getString(R.string.open_weather_maps_app_id));

        BufferedReader reader = new BufferedReader(
                new InputStreamReader(connection.getInputStream()));

        StringBuffer json = new StringBuffer(1024);
        String tmp = "";
        while ((tmp = reader.readLine()) != null)
            json.append(tmp).append("\n");
        reader.close();

        JSONObject data = new JSONObject(json.toString());

        if (data.getInt("cod") != 200) {
            return null;
        }

        return data;
    } catch (Exception e) {
        return null;
    }
}
}

LogCat

06-05 09:05:56.427  25284-25284/? D/dalvikvm﹕ Late-enabling CheckJNI
06-05 09:05:56.439  25284-25284/? E/Trace﹕ error opening trace file: No such file or directory (2)
06-05 09:05:56.455  25284-25284/? I/dalvikvm﹕ Could not find method android.view.ViewGroup.onNestedScrollAccepted, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.onNestedScrollAccepted
06-05 09:05:56.455  25284-25284/? W/dalvikvm﹕ VFY: unable to resolve virtual method 12215: Landroid/view/ViewGroup;.onNestedScrollAccepted (Landroid/view/View;Landroid/view/View;I)V
06-05 09:05:56.455  25284-25284/? D/dalvikvm﹕ VFY: replacing opcode 0x6f at 0x0000
06-05 09:05:56.455  25284-25284/? I/dalvikvm﹕ Could not find method android.view.ViewGroup.onStopNestedScroll, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.onStopNestedScroll
06-05 09:05:56.455  25284-25284/? W/dalvikvm﹕ VFY: unable to resolve virtual method 12221: Landroid/view/ViewGroup;.onStopNestedScroll (Landroid/view/View;)V
06-05 09:05:56.455  25284-25284/? D/dalvikvm﹕ VFY: replacing opcode 0x6f at 0x0000
06-05 09:05:56.455  25284-25284/? I/dalvikvm﹕ Could not find method android.support.v7.internal.widget.ActionBarOverlayLayout.stopNestedScroll, referenced from method android.support.v7.internal.widget.ActionBarOverlayLayout.setHideOnContentScrollEnabled
06-05 09:05:56.455  25284-25284/? W/dalvikvm﹕ VFY: unable to resolve virtual method 9786: Landroid/support/v7/internal/widget/ActionBarOverlayLayout;.stopNestedScroll ()V
06-05 09:05:56.455  25284-25284/? D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x000e
06-05 09:05:56.459  25284-25284/? I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getChangingConfigurations, referenced from method android.support.v7.internal.widget.TintTypedArray.getChangingConfigurations
06-05 09:05:56.459  25284-25284/? W/dalvikvm﹕ VFY: unable to resolve virtual method 393: Landroid/content/res/TypedArray;.getChangingConfigurations ()I
06-05 09:05:56.459  25284-25284/? D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
06-05 09:05:56.459  25284-25284/? I/dalvikvm﹕ Could not find method android.content.res.TypedArray.getType, referenced from method android.support.v7.internal.widget.TintTypedArray.getType
06-05 09:05:56.459  25284-25284/? W/dalvikvm﹕ VFY: unable to resolve virtual method 415: Landroid/content/res/TypedArray;.getType (I)I
06-05 09:05:56.459  25284-25284/? D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
06-05 09:05:56.459  25284-25284/? I/dalvikvm﹕ Could not find method android.content.res.Resources.getDrawable, referenced from method android.support.v7.internal.widget.ResourcesWrapper.getDrawable
06-05 09:05:56.459  25284-25284/? W/dalvikvm﹕ VFY: unable to resolve virtual method 356: Landroid/content/res/Resources;.getDrawable (ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
06-05 09:05:56.459  25284-25284/? D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
06-05 09:05:56.459  25284-25284/? I/dalvikvm﹕ Could not find method android.content.res.Resources.getDrawableForDensity, referenced from method android.support.v7.internal.widget.ResourcesWrapper.getDrawableForDensity
06-05 09:05:56.459  25284-25284/? W/dalvikvm﹕ VFY: unable to resolve virtual method 358: Landroid/content/res/Resources;.getDrawableForDensity (IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
06-05 09:05:56.459  25284-25284/? D/dalvikvm﹕ VFY: replacing opcode 0x6e at 0x0002
06-05 09:05:56.475  25284-25284/? D/AndroidRuntime﹕ Shutting down VM
06-05 09:05:56.475  25284-25284/? W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0xa619f908)
06-05 09:05:56.475  25284-25284/? E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{viaan.carl.doordingdefender/viaan.carl.doordingdefender.MainActivity}: java.lang.NullPointerException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
        at android.app.ActivityThread.access$600(ActivityThread.java:141)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5041)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
        at viaan.carl.doordingdefender.myGPS.<init>(myGPS.java:18)
        at viaan.carl.doordingdefender.ServiceHandler.<init>(ServiceHandler.java:35)
        at viaan.carl.doordingdefender.MainActivity.onCreate(MainActivity.java:30)
        at android.app.Activity.performCreate(Activity.java:5104)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
at android.app.ActivityThread.access$600(ActivityThread.java:141)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)

1 Answers1

0

Go to your phone settings and allow GPS and WiFi locations allowed. This method...

provider = locManager.getBestProvider(criteria, false);

...does not care if you have turned your GPS on or not. Mostly will try to get the location from the GPS instead of the WiFi.

Also, check on your manifest if you have added the following line:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

This will ensure that you app can access to the Internet to upload and download the JSON and to check for location services.

Later in your code inside the onCreate method add the following lines:

locManager.requestLocationUpdates(provider, 0L, 0.0F, this);

This will actually call for the location manager to start requesting your location.

chntgomez
  • 2,058
  • 3
  • 19
  • 31
  • It doesn't seem to correct my issue with my app crashing when I try to start it up. Somebody suggested I post a stacktrace to help me find the issue though. – Carl Francis Jun 01 '15 at 16:54
  • Yes, we could help you if you can post the stacktrace – chntgomez Jun 01 '15 at 16:58
  • Is the stacktrace the same as logcat – Carl Francis Jun 01 '15 at 17:20
  • Yes, you can check wherever the exception is thrown. – chntgomez Jun 01 '15 at 19:02
  • I think the issue might be near the end on this line: public void updateWind (Integer lat, Integer lng) { ServiceHandler sh = (ServiceHandler)getSupportFragmentManager() .findFragmentById(R.id.container); sh.updateWind(lat, lng); – Carl Francis Jun 01 '15 at 19:03
  • You have a Nullpointer exception because you are forcing the execution of onLocationChanged. This method will call himself when the device founds your position. – chntgomez Jun 01 '15 at 21:02
  • How am I forcing execution of onLocationChanged? I'm still new to this so I'm not sure what I need to change to not force it. – Carl Francis Jun 02 '15 at 12:40
  • In your coude you are calling "onLocationChanged". That method calls automatically when the device founds your position. Just erase that line. – chntgomez Jun 02 '15 at 15:12
  • Ok. I understand that now. I am still however getting a crash when I have updateWind(lat, lng); included into the code. This makes me wonder if I have an issue with my code within that class or my service handler class. – Carl Francis Jun 02 '15 at 15:24
  • I updated my log cat and my code a bit but still haven't discovered the issue. Could it be I'm misusing LocationListener? – Carl Francis Jun 04 '15 at 15:59
  • Yes! You are not calling the method to get location updates. Check my answer with the edits. – chntgomez Jun 04 '15 at 18:16
  • I updated my code with your suggestion and updated my logcat. Still something not initializing correctly. – Carl Francis Jun 05 '15 at 14:18
  • Move this line: myGPS gps = new myGPS(this); To the "onCreate()" body. – chntgomez Jun 11 '15 at 23:04