title: java NullPointerException with LocationManager
body: <p>I am building an Android App which uses LocationManager to get the latitude and longitude from the users, then enters those variables into a URL, which opens in a WebView.</p>
  
  <p>For some reason, on some Android devices and my Eclipse Emulator, the app crashes when this activity tries to open. I get a NPE error in my crash report.</p>
  
  <p>I have pinned down the error to the following two lines of code:</p>
  
  <pre><code>double longitude = lastKnownLocation.getLongitude();
  double latitude = lastKnownLocation.getLatitude();
  </code></pre>
  
  <p>When I set those two variables as static values, like 1, the app runs correctly.</p>
  
  <p>Below is my full page1.activity. Can anyone help?</p>
  
  <pre><code>package com.xxx.yyy;
  
  import android.annotation.SuppressLint;
  import android.app.AlertDialog;
  import android.app.ProgressDialog;
  import android.content.Context;
  import android.content.DialogInterface;
  import android.content.Intent;
  import android.graphics.Bitmap;
  import android.net.Uri;
  import android.os.Bundle;
  import android.location.Location;
  import android.location.LocationListener;
  import android.location.LocationManager;
  import android.webkit.GeolocationPermissions;
  import android.webkit.WebChromeClient;
  import android.webkit.WebView;
  import android.webkit.WebViewClient;
  import android.widget.ImageButton;
  import android.widget.ImageView;
  import android.webkit.GeolocationPermissions.Callback;
  import com.xxx.yyy.R;
  
  import com.actionbarsherlock.view.MenuItem;
  import com.devspark.sidenavigation.ISideNavigationCallback;
  import com.devspark.sidenavigation.SideNavigationView;
  
  public class page1 extends MainActivity implements ISideNavigationCallback, GeolocationPermissions.Callback {
  
      public static final String EXTRA_TITLE = "com.devspark.sidenavigation.sample.extra.MTGOBJECT";
      public static final String EXTRA_RESOURCE_ID = "com.devspark.sidenavigation.sample.extra.RESOURCE_ID";
  
      private ImageView icon;
      private SideNavigationView sideNavigationView;
      ProgressDialog mProgress;
  
      @SuppressLint("SetJavaScriptEnabled") 
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
  
          setContentView(R.layout.activity_page1);
          icon = (ImageView) findViewById(android.R.id.icon);
          sideNavigationView = (SideNavigationView) findViewById(R.id.side_navigation_view);
          sideNavigationView.setMenuItems(R.menu.side_navigation_menu);
          sideNavigationView.setMenuClickCallback(this);
  
          if (getIntent().hasExtra(EXTRA_TITLE)) {
              String title = getIntent().getStringExtra(EXTRA_TITLE);
              int resId = getIntent().getIntExtra(EXTRA_RESOURCE_ID, 0);
              setTitle(title);
              icon.setImageResource(resId);
          }
  
          getSupportActionBar().setDisplayHomeAsUpEnabled(true);
  
          //Get webview layout
           WebView engine = (WebView) findViewById(R.id.webView1);
  
           //loading
           mProgress = ProgressDialog.show(this, "Loading", "Finding locations near you");
  
  
  
           engine.setWebChromeClient(new WebChromeClient() {
                   @Override
                  public void onProgressChanged(WebView view, int progress)
                   {
  
  
                   }
           });
  
  
           engine.setWebViewClient(new FixedWebViewClient() {
                   @Override
                  public void onPageStarted(WebView view, String url, Bitmap favicon)
                   {
                       findViewById(R.id.progressBar1).setVisibility(view.VISIBLE);
                   }
  
                   @Override
                  public void onPageFinished(WebView view, String url){ 
  
                       findViewById(R.id.progressBar1).setVisibility(view.GONE);
  
                       if(mProgress.isShowing()) { 
                           mProgress.dismiss();  }
  
                 //error handeling     
                   }
                   @Override
                  public void onReceivedError(WebView webView, int errorCode, String description, String failingUrl) {
                      try {
                          webView.stopLoading();
                      } catch (Exception e) {
                      }
                      try {
                          webView.clearView();
                      } catch (Exception e) {
                      }
                      if (webView.canGoBack()) {
                          webView.goBack();
                      }
                      webView.loadUrl("file:///android_asset/error.html"); //background to message dialog, or page you want to load if requested page is offline
                      AlertDialog alertDialog = new AlertDialog.Builder(page1.this).create(); //remove these 4 rules if you load an assets page instead.
                      alertDialog.setTitle("Error");
                      alertDialog.setMessage("No internet connection was found!");
                      alertDialog.setButton("Retry", new DialogInterface.OnClickListener() {
                         @Override
                      public void onClick(DialogInterface dialog, int which) {
                             finish();
                             startActivity(getIntent());
                         }
                      });
  
                      alertDialog.show();
                      super.onReceivedError(webView, errorCode, description, failingUrl);
                  }
  
           });
  
           LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
           Location location = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
  
           LocationListener locationListener = new LocationListener() {
                  public void onLocationChanged(Location location) {
                    // Called when a new location is found by the network location provider.
  
                      double longitude = location.getLongitude();
                      double latitude = location.getLatitude();
  
                  }
  
                  public void onStatusChanged(String provider, int status, Bundle extras) {}
  
                  public void onProviderEnabled(String provider) {}
  
                  public void onProviderDisabled(String provider) {}
                };
  
              // Register the listener with the Location Manager to receive location updates
              lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
  
              String locationProvider = LocationManager.NETWORK_PROVIDER;
              // Or use LocationManager.GPS_PROVIDER
  
              Location lastKnownLocation = lm.getLastKnownLocation(locationProvider);
  
              double longitude = lastKnownLocation.getLongitude();
              double latitude = lastKnownLocation.getLatitude();
  
           engine.loadUrl("http://www.turn2clients.com/app/home/iPhone/dev/?s=&amp;geo-radius=3&amp;geo=on&amp;geo-lat="+latitude+"&amp;geo-lng="+longitude+"&amp;categories=0&amp;locations=0&amp;dir-search=yes");
           //if you would like to load local assets file, replace with file:///android_asset/error.html
  
  
   }
  
      public void invoke(String origin, boolean allow, boolean remember) {
  
      }
  
      final class GeoClient extends WebChromeClient {
  
      @Override
      public void onGeolocationPermissionsShowPrompt(String origin,
      Callback callback) {
      }
  
      }
  
  
  
  
   private class FixedWebViewClient extends WebViewClient {
           @Override
           public boolean shouldOverrideUrlLoading(WebView view, String url) {
                   view.loadUrl(url);
  
                   //start a new application/activity (in this case youtube) if url starts with 
                  if (url.startsWith("mlb")){
  
                   return true;
                   }
                   else
                   {
                   view.loadUrl(url);
  
                   return true;
           }
           }
  
   }
  
  
  
      @Override
      public boolean onOptionsItemSelected(MenuItem item) {
          switch (item.getItemId()) {
          case android.R.id.home:
              sideNavigationView.toggleMenu();
              break;
          default:
              return super.onOptionsItemSelected(item);
          }
          return true;
      }
  
      @Override
      public void onSideNavigationItemClick(int itemId) {
          switch (itemId) {
          case R.id.side_navigation_menu_item1:
              Intent page1 = new Intent(this, page1.class);     
              startActivity(page1);
              break;
  
          case R.id.side_navigation_menu_item2:
              Intent page2 = new Intent(this, page2.class);     
              startActivity(page2);
              break;
  
          case R.id.side_navigation_menu_item3:
              Intent page3 = new Intent(this, page3.class);     
              startActivity(page3);
              break;
  
          default:
              return;
          }
          finish();
      }
  
      @Override
      public void onBackPressed() {
          //This part will close you app if a certain url is visited, ofcourse you can replace this with any other action.
          WebView engine = (WebView) findViewById(R.id.webView1);
          String url = engine.getUrl(); 
          if (url.equals("http://closeifthisurlisvisited.com/") ||
                  url.equals("http://alsocloseifthisurlisvisited.com")) {
                  // exit
                  super.onBackPressed();
          } else {
                  // Go back when back button is pressed
                  engine.goBack();
          }
          //thats it
          // hide menu if it shown with backbutton
          if (sideNavigationView.isShown()) {
              sideNavigationView.hideMenu();
          } else {
              //super.onBackPressed();
          }
      }
  
      /**
       * Start activity from SideNavigation.
       * 
       * @param title
       *            title of Activity
       * @param resId
       *            resource if of background image
       */
      private void invokeActivity(String title, int resId) {
          Intent intent = new Intent(this, MainActivity.class);
          intent.putExtra(EXTRA_TITLE, title);
          intent.putExtra(EXTRA_RESOURCE_ID, resId);
  
          // all of the other activities on top of it will be closed and this
          // Intent will be delivered to the (now on top) old activity as a
          // new Intent.
          intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  
          startActivity(intent);
          // no animation of transition
          overridePendingTransition(0, 0);
      }
  
  }
  </code></pre>