0
votes

I develop simple application that detects the location of android device and display its values in text Views

The application crashes once it starts throwing RuntimeException.

Following is GPS.java

public class GPS extends Activity implements LocationListener {
    private TextView latituteField;
    private TextView longitudeField;
    private LocationManager locationManager;
    private String provider;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gps);
        latituteField = (TextView) findViewById(R.id.TextView02);
        longitudeField = (TextView) findViewById(R.id.TextView04);

        LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
        boolean enabled = service
                .isProviderEnabled(LocationManager.GPS_PROVIDER);

        if (!enabled) {
            Intent intent = new Intent(
                    android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);
        }

      Criteria criteria = new Criteria();
     provider = locationManager.getBestProvider(criteria,false);
    Location location = locationManager.getLastKnownLocation(provider);

        if (location != null) {
            Log.d("PROVIDER", "Provider " + provider + " has been selected.");

            onLocationChanged(location);
        } else {
            latituteField.setText("Location not available");
            longitudeField.setText("Location not available");
        }
    }

Log is as following :

10-09 16:49:35.733: E/AndroidRuntime(1616): FATAL EXCEPTION: main 10-09 16:49:35.733: E/AndroidRuntime(1616): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.gps/com.example.gps.GPS}: java.lang.NullPointerException 10-09 16:49:35.733: E/AndroidRuntime(1616): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 10-09 16:49:35.733: E/AndroidRuntime(1616): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 10-09 16:49:35.733: E/AndroidRuntime(1616): at android.app.ActivityThread.access$600(ActivityThread.java:123) 10-09 16:49:35.733: E/AndroidRuntime(1616): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 10-09 16:49:35.733: E/AndroidRuntime(1616): at android.os.Handler.dispatchMessage(Handler.java:99) 10-09 16:49:35.733: E/AndroidRuntime(1616): at android.os.Looper.loop(Looper.java:137) 10-09 16:49:35.733: E/AndroidRuntime(1616): at android.app.ActivityThread.main(ActivityThread.java:4424) 10-09 16:49:35.733: E/AndroidRuntime(1616): at java.lang.reflect.Method.invokeNative(Native Method) 10-09 16:49:35.733: E/AndroidRuntime(1616): at java.lang.reflect.Method.invoke(Method.java:511) 10-09 16:49:35.733: E/AndroidRuntime(1616): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 10-09 16:49:35.733: E/AndroidRuntime(1616): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 10-09 16:49:35.733: E/AndroidRuntime(1616): at dalvik.system.NativeStart.main(Native Method) 10-09 16:49:35.733: E/AndroidRuntime(1616): Caused by: java.lang.NullPointerException 10-09 16:49:35.733: E/AndroidRuntime(1616): at com.example.gps.GPS.onCreate(GPS.java:44) 10-09 16:49:35.733: E/AndroidRuntime(1616): at android.app.Activity.performCreate(Activity.java:4465) 10-09 16:49:35.733: E/AndroidRuntime(1616): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 10-09 16:49:35.733: E/AndroidRuntime(1616): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 10-09 16:49:35.733: E/AndroidRuntime(1616): ... 11 more

2
Can you attach crash log here?Rajiv Ratan
Check for all permissions in manifest file and please attach the log.Prachi
You have call MainActivity class but u want to call gps class. replace MainActivity with GPS in AndroidMenifestfileRohit
I edit the post sorry for bad formatting but I don't know how to post it in well formatMenna-Allah Sami
yea , I know that this line makes the app crash but I don't know whyMenna-Allah Sami

2 Answers

0
votes

It looks like problem is while showing location setting screen.

Use below code for enabling/disabling GPS

public void turnGPSOn() {

 Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
 intent.putExtra("enabled", true);
 this.ctx.sendBroadcast(intent);

String provider = Settings.Secure.getString(ctx.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
if(!provider.contains("gps"))
    { 
    //if gps is disabled
    final Intent poke = new Intent();
    poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); 
    poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
    poke.setData(Uri.parse("3")); 
    this.ctx.sendBroadcast(poke);
}

}

public void turnGPSOff() {

String provider = Settings.Secure.getString(ctx.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
if(provider.contains("gps")){ //if gps is enabled
    final Intent poke = new Intent();
    poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
    poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
    poke.setData(Uri.parse("3")); 
    this.ctx.sendBroadcast(poke);
}

}

0
votes

I guess you might have found your solution. But I posted this answer for people who might have same type of issue in future.You have only declared locationManager but have not yet initialised it. But you have later declared new LocationManager called service. So you can either use the service as LocationManager for your activity or either initialise locationManager like this.

public class GPS extends Activity implements LocationListener {
private TextView latituteField;
private TextView longitudeField;
private LocationManager locationManager;
private String provider;


@Override 
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gps);
    latituteField = (TextView) findViewById(R.id.TextView02);
    longitudeField = (TextView) findViewById(R.id.TextView04);

    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);//now you have initialised locationManager, and is available for use.
    LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);//Declared and initialised new LocationManager service but only accessible inside onCreate method. 
    boolean enabled = locationManager
            .isProviderEnabled(LocationManager.GPS_PROVIDER);

    if (!enabled) {
        Intent intent = new Intent(
                android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        startActivity(intent);
    } 

  Criteria criteria = new Criteria();
 provider = locationManager.getBestProvider(criteria,false);
Location location = locationManager.getLastKnownLocation(provider);

    if (location != null) { 
        Log.d("PROVIDER", "Provider " + provider + " has been selected.");

        onLocationChanged(location); 
    } else { 
        latituteField.setText("Location not available");
        longitudeField.setText("Location not available");
    } 
} `

Now there wont be any null Pointer exception.