title: Error invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference
body: <p>All I am trying to do is let the user get a list of the places of types he likes. For example if the input was hospital my application would open google maps with the search string "Hospital". But as suggested in the documentation using the geocode like <code>geo:0,0?q=hospital</code> uri shows all the hospitals near the coordinates 0 latitude &amp; 0 longitude. So when I tried to get the users coordinates first by using the following code.</p>
  
  <p>Places Decoder.java</p>
  
  <pre><code>package com.kkze.Mappy;
  
  import android.app.Activity;
  import android.app.AlertDialog;
  import android.content.Context;
  import android.content.DialogInterface;
  import android.content.Intent;
  import android.location.Criteria;
  import android.location.Location;
  import android.location.LocationManager;
  import android.net.Uri;
  import android.os.Build;
  import android.os.Bundle;
  import android.provider.Settings;
  import android.text.TextUtils;
  import android.util.Log;
  import android.widget.Toast;
  
  public class PlacesDecoder extends Activity {
  Intent intentThatCalled;
  public double latitude;
  public double longitude;
  public LocationManager locationManager;
  public Criteria criteria;
  public String bestProvider;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      intentThatCalled = getIntent();
      String voice2text = intentThatCalled.getStringExtra("v2txt");
      getLocation(voice2text);
  }
  public static boolean isLocationEnabled(Context context)
  {
      int locationMode = 0;
      String locationProviders;
      if(Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.KITKAT)
      {
          try
          {
              locationMode = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.LOCATION_MODE);
          } catch (Settings.SettingNotFoundException e) {
              e.printStackTrace();
          }
          return locationMode != Settings.Secure.LOCATION_MODE_OFF;
      }
      else
      {
          locationProviders = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
          return !TextUtils.isEmpty(locationProviders);
      }
  }
  
  public void getLocation(String voice2txt) {
      locationManager = (LocationManager)  this.getSystemService(Context.LOCATION_SERVICE);
      criteria = new Criteria();
      bestProvider = String.valueOf(locationManager.getBestProvider(criteria, true)).toString();
      Location location = locationManager.getLastKnownLocation(bestProvider);
      if (isLocationEnabled(PlacesDecoder.this)) {
              Log.e("TAG", "GPS is on");
              latitude = location.getLatitude();
              longitude = location.getLongitude();
              Toast.makeText(PlacesDecoder.this, "latitude:" + latitude + " longitude:" + longitude, Toast.LENGTH_SHORT).show();
              searchNearestPlace(voice2txt);
  
          }
      else
      {
          AlertDialog.Builder notifyLocationServices = new AlertDialog.Builder(PlacesDecoder.this);
          notifyLocationServices.setTitle("Switch on Location Services");
          notifyLocationServices.setMessage("Location Services must be turned on to complete this action. Also please take note that if on a very weak network connection,  such as 'E' Mobile Data or 'Very weak Wifi-Connections' it may take even 15 mins to load. If on a very weak network connection as stated above, location returned to application may be null or nothing and cause the application to crash.");
          notifyLocationServices.setPositiveButton("Ok, Open Settings", new DialogInterface.OnClickListener() {
              @Override
              public void onClick(DialogInterface dialog, int which) {
                  Intent openLocationSettings = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                  PlacesDecoder.this.startActivity(openLocationSettings);
                  finish();
              }
          });
          notifyLocationServices.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
              @Override
              public void onClick(DialogInterface dialog, int which) {
                  finish();
              }
          });
          notifyLocationServices.show();
      }
  }
  
  public void searchNearestPlace(String v2txt) {
      Log.e("TAG", "Started");
      v2txt = v2txt.toLowerCase();
      String[] placesS = {"accounting", "airport", "aquarium", "atm", "attraction", "bakery", "bakeries", "bank", "bar", "cafe", "campground", "casino", "cemetery", "cemeteries", "church", "courthouse", "dentist", "doctor", "electrician", "embassy", "embassies", "establishment", "finance", "florist", "food", "grocery", "groceries", "supermarket", "gym", "health", "hospital", "laundry", "laundries", "lawyer", "library", "libraries", "locksmith", "lodging", "mosque", "museum", "painter", "park", "parking", "pharmacy", "pharmacies", "physiotherapist", "plumber", "police", "restaurant", "school", "spa", "stadium", "storage", "store", "synagog", "synagogue", "university", "universities", "zoo"};
      String[] placesM = {"amusement park", "animal care", "animal care", "animal hospital", "art gallery", "art galleries", "beauty salon", "bicycle store", "book store", "bowling alley", "bus station", "car dealer", "car rental", "car repair", "car wash", "city hall", "clothing store", "convenience store", "department store", "electronics store", "electronic store", "fire station", "funeral home", "furniture store", "gas station", "general contractor", "hair care", "hardware store", "hindu temple", "home good store", "homes good store", "home goods store", "homes goods store", "insurance agency", "insurance agencies", "jewelry store", "liquor store", "local government office", "meal delivery", "meal deliveries", "meal takeaway", "movie rental", "movie theater", "moving company", "moving companies", "night club", "pet store", "place of worship", "places of worship", "post office", "real estate agency", "real estate agencies", "roofing contractor", "rv park", "shoe store", "shopping mall", "subway station", "taxi stand", "train station", "travel agency", "travel agencies", "veterinary care"};
      int index;
      for (int i = 0; i &lt;= placesM.length - 1; i++) {
          Log.e("TAG", "forM");
          if (v2txt.contains(placesM[i])) {
              Log.e("TAG", "sensedM?!");
              index = i;
              Uri gmmIntentUri = Uri.parse("geo:" + latitude + "," + longitude + "?q=" + placesM[index]);
              Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
              mapIntent.setPackage("com.google.android.apps.maps");
              startActivity(mapIntent);
              finish();
          }
      }
      for (int i = 0; i &lt;= placesS.length - 1; i++) {
          Log.e("TAG", "forS");
          if (v2txt.contains(placesS[i])) {
              Log.e("TAG", "sensedS?!");
              index = i;
              Uri gmmIntentUri = Uri.parse("geo:" + latitude + "," + longitude + "?q=" + placesS[index]);
              Intent mapIntent = new Intent(Intent.ACTION_VIEW, gmmIntentUri);
              mapIntent.setPackage("com.google.android.apps.maps");
              startActivity(mapIntent);
              finish();
          }
      }
  }
  }
  </code></pre>
  
  <p>The problem is that always and always location returns null. And I know for a fact that another application Jarvis easily does the task as long as location is enabled, if not is simply asks the user to. But under the same conditions my application always crashes. </p>
  
  <p>What I have done: </p>
  
  <ol>
  <li>Spent Day and Night trying to solve this problem.</li>
  <li>Browsed through numerous pages on the topic.</li>
  <li>Tried different codes of my own.</li>
  </ol>
  
  <p>And it still happens. I am a beginner in Android.
  And please, please do help me. Is there no possible way to solve my problem? even thought that other application somehow manages to do it.</p>
  
  <p>This my LogCat.</p>
  
  <pre><code>Process: com.kkze.Mappy, PID: 6742
  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kkze.Mappy/com.kkze.Mappy.PlacesDecoder}: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference
          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2658)
          at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723)
          at android.app.ActivityThread.access$900(ActivityThread.java:172)
          at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1422)
          at android.os.Handler.dispatchMessage(Handler.java:102)
          at android.os.Looper.loop(Looper.java:145)
          at android.app.ActivityThread.main(ActivityThread.java:5832)
          at java.lang.reflect.Method.invoke(Native Method)
          at java.lang.reflect.Method.invoke(Method.java:372)
          at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
          at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'double android.location.Location.getLatitude()' on a null object reference
          at com.kkze.Mappy.PlacesDecoder.getLocation(PlacesDecoder.java:62)
          at com.kkze.Mappy.PlacesDecoder.onCreate(PlacesDecoder.java:32)
          at android.app.Activity.performCreate(Activity.java:6221)
          at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
          at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2611)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2723)
  at android.app.ActivityThread.access$900(ActivityThread.java:172)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1422)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:145)
  at android.app.ActivityThread.main(ActivityThread.java:5832)
  at java.lang.reflect.Method.invoke(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
  </code></pre>
  
  <p>Also checking for location!=null requires ACCESS_FINE_LOCATION permission which messes up my app causing it to always return as null.</p>