-1

Hey guys I am trying to find the co ordinates of the current device using the GPS and Network based. I am testing this code for API 23. But this code is returning a NullPointerException. The Code is given below:

public class AndroidLocationActivity extends Activity {

    Button btnGPSShowLocation;
    Button btnNWShowLocation;

    private static final int MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 2;

    protected LocationManager locationManager;
    Location location;

    private static final long MIN_DISTANCE_FOR_UPDATE = 10;
    private static final long MIN_TIME_FOR_UPDATE = 1000 * 60 * 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_android_location);
        btnGPSShowLocation = (Button) findViewById(R.id.btnGPSShowLocation);
        btnNWShowLocation = (Button) findViewById(R.id.btnNWShowLocation);

    }

    public void mGPS(View view){
        Location gpsLocation = getLocation(LocationManager.GPS_PROVIDER);
        if (gpsLocation != null) {
            double latitude = gpsLocation.getLatitude();
            double longitude = gpsLocation.getLongitude();
            Toast.makeText(getApplicationContext(), "Mobile Location (GPS): \nLatitude: " + latitude + "\nLongitude: " + longitude, Toast.LENGTH_LONG).show();
        }
        else {
            showSettingsAlert("GPS");
        }
    }

    public void mNW(View view){
        Location nwLocation =getLocation(LocationManager.NETWORK_PROVIDER);
        if (nwLocation != null) {
            double latitude = nwLocation.getLatitude();
            double longitude = nwLocation.getLongitude();
            Toast.makeText(getApplicationContext(), "Mobile Location (NW): \nLatitude: " + latitude + "\nLongitude: " + longitude, Toast.LENGTH_LONG).show();
        }
        else {
            showSettingsAlert("NETWORK");
        }
    }

    public void showSettingsAlert(String provider) {
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(
                AndroidLocationActivity.this);

        alertDialog.setTitle(provider + " SETTINGS");

        alertDialog.setMessage(provider + " is not enabled! Want to go to settings menu?");

        alertDialog.setPositiveButton("Settings",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                        AndroidLocationActivity.this.startActivity(intent);
                    }
                });

        alertDialog.setNegativeButton("Cancel",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });

        alertDialog.show();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    public Location getLocation(String provider) {
        if (locationManager.isProviderEnabled(provider)) {
            if(ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION)!=PackageManager.PERMISSION_GRANTED){
                ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.ACCESS_FINE_LOCATION},MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);

            }
            else {
                locationManager.requestLocationUpdates(provider, MIN_TIME_FOR_UPDATE, MIN_DISTANCE_FOR_UPDATE, (LocationListener) this);
                if (locationManager != null) {
                    location = locationManager.getLastKnownLocation(provider);
                    return location;
                }
            }
        }
        return null;
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 ) {
                    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                        Toast.makeText(this, "Permission Granted", Toast.LENGTH_SHORT).show();

                    }
                    else if(grantResults[0]==PackageManager.PERMISSION_DENIED) {
                        Toast.makeText(this, "Permission Denied", Toast.LENGTH_SHORT).show();
                    }
                    else {

                        Toast.makeText(this, "Never Ask Again", Toast.LENGTH_SHORT).show();
                    }
                }
                return;
            }
        }
    }
}

The Code is returning the following errors:

FATAL EXCEPTION: main Process: com.cetpainfotech.locationtrackerapplication, PID: 29068 java.lang.IllegalStateException: Could not execute method for android:onClick at android.view.View$DeclaredOnClickListener.onClick(View.java:4461) at android.view.View.performClick(View.java:5207) at android.view.View$PerformClick.run(View.java:21177) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5441) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at android.view.View$DeclaredOnClickListener.onClick(View.java:4456) at android.view.View.performClick(View.java:5207)  at android.view.View$PerformClick.run(View.java:21177)  at android.os.Handler.handleCallback(Handler.java:739)  at android.os.Handler.dispatchMessage(Handler.java:95)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5441)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.location.LocationManager.isProviderEnabled(java.lang.String)' on a null object reference at com.cetpainfotech.locationtrackerapplication.AndroidLocationActivity.getLocation(AndroidLocationActivity.java:108) at com.cetpainfotech.locationtrackerapplication.AndroidLocationActivity.mGPS(AndroidLocationActivity.java:52) at java.lang.reflect.Method.invoke(Native Method)  at android.view.View$DeclaredOnClickListener.onClick(View.java:4456)  at android.view.View.performClick(View.java:5207)  at android.view.View$PerformClick.run(View.java:21177)  at android.os.Handler.handleCallback(Handler.java:739)  at android.os.Handler.dispatchMessage(Handler.java:95)  at android.os.Looper.loop(Looper.java:148)  at android.app.ActivityThread.main(ActivityThread.java:5441)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)

I have made the condition that if the function getLocation() returns null then it will show an alert dialog box. Instead it is showing Null Pointer Exception when i click on the button.

I have already registered onClick methods (mGPS and mNW) in the XML file.

Alexey Subach
  • 11,903
  • 7
  • 34
  • 60
pm2br
  • 49
  • 7
  • 2
    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) – Marvin Feb 02 '17 at 17:33
  • Thanks but I already know what is NullPointerException. But my problem here is that despite being given an else condition in mGPS() and mNW() for handling null this code is throwing an exception. – pm2br Feb 02 '17 at 17:40
  • 1
    Welcome to StackOverflow. This "duplicate" comment means you should take more time to find out what exactly is null before posting a question here asking why this may be the case. How to find out? If you don't know much about programming, start by reading the linked post. If you know how to debug or how to write to Logcat, now is a good time to do it. What is null in your code? – Bö macht Blau Feb 02 '17 at 17:47
  • Your locationManager contains null because you have only created a reference of LocationManager and thats why it is throwing NullPointerException. – gunjan maheshwari Feb 02 '17 at 17:58

2 Answers2

2

But my problem here is that despite being given an else condition in mGPS() and mNW() for handling null this code is throwing an exception

Your exception is throw because the if statement is evaluated, but the variable is null.

if (locationManager.isProviderEnabled(provider)) {

This is a proper null-check.

if (locationManager != null && locationManager.isProviderEnabled(provider)) {

} else {

}

You should actually initialize your variable and put a line like this in onCreate

locationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
OneCricketeer
  • 179,855
  • 19
  • 132
  • 245
0

You aren't initializing your locationManager, therefore when you call locationManager.isProviderEnabled(provider) it fails with a NullPointerException

This is shown in your stack trace, right here

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.location.LocationManager.isProviderEnabled(java.lang.String)' on a null object reference