title: Android: How to identify programmatically if device is located indoors?
body: <p>Is it possible for an Android app to identify if device is located indoors programmatically. My app hangs if it uses GPS indoors. I'm using the following code: </p>
  
  <pre><code>package com.first.Engagia;
  
  import android.app.Activity;
  import android.app.Dialog;
  import android.app.ProgressDialog;
  import android.content.Context;
  import android.content.Intent;
  import android.location.Location;
  import android.location.LocationListener;
  import android.location.LocationManager;
  import android.os.Bundle;
  import android.util.Log;
  import android.widget.TextView;
  
  public class LocationView extends Activity {
  
      public String userId;
      public String appview_username;
      public String appview_password;
      public String userfirstname;
      public String userlastname;
      public String companyname;
      public String AudienceFirstnameLastname;
  
      public String LocationString;
  
      private ProgressDialog mProgressDialog;
  
      TextView tv;
      boolean fetchedLocationStatus;
      LocationManager locationManager;
      LocationListener locationListener;
      boolean gps_enabled = false;
      boolean network_enabled = false;
  
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.loc);
  
  
          //setting passed userId
          Bundle extras = getIntent().getExtras(); 
          if(extras != null){
              this.userId = extras.getString("userId");
              this.appview_username = extras.getString("username");
              this.appview_password = extras.getString("password");
  
              this.userfirstname = extras.getString("userfirstname");
              this.userlastname = extras.getString("userlastname");
              this.companyname = extras.getString("companyname");
  
              this.AudienceFirstnameLastname = extras.getString("AudienceFirstnameLastname");
  
          }
  
          //tv = (TextView) this.findViewById(R.id.thetext);
          //tv.setText("Android Geo Location Snippet Here.\n\n");
          //tv.setText("");
  
          showDialog(0);
          LocationView.this.mProgressDialog.setMessage("Getting your location..." );
  
          // Acquire a reference to the system Location Manager
          locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
  
          try {
              LocationView.this.gps_enabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
          } catch(Exception e) {
              Log.e("LocationView", e.toString());
          } 
  
          try{
              LocationView.this.network_enabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
          } catch(Exception e) {
              Log.e("LocationView", e.toString());
          } 
  
  
          // Define a listener that responds to location updates
          locationListener = new LocationListener() {
  
              public void onStatusChanged(String provider, int status, Bundle extras) {}
  
              public void onProviderEnabled(String provider) {}
  
              public void onProviderDisabled(String provider) {}
  
          public void onLocationChanged(Location location) {
              // TODO Auto-generated method stub
              if( displayCoordinates(location) == true ) {
                  //getAddress( location.getLatitude(), location.getLongitude());
                  Log.d("LocationView", "Before Stop Location Updates.");
                  stopLocationUpdates();
              }
              }
          };
  
          if( LocationView.this.gps_enabled == true ){
              // Register the listener with the Location Manager to receive location updates
              locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
          }else if( LocationView.this.network_enabled == true ){
              locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
          }else if( LocationView.this.gps_enabled == false &amp;&amp; LocationView.this.network_enabled == false ){
              LocationUnavailable();
          }
  
          //so that the program will get the geo location once
  
      }
  
      public void stopLocationUpdates(){
          locationManager.removeUpdates(locationListener);
      }
  
      public void LocationUnavailable(){
          LocationView.this.mProgressDialog.setMessage("Location Unavailable..." );
  
          if( LocationView.this.mProgressDialog.isShowing() ){
              dismissDialog(0);
          }
  
          //go back to main_audience.html //3
          Intent nextActivity = new Intent(LocationView.this, AppView.class);
  
          nextActivity.putExtra("userId", LocationView.this.userId );
          nextActivity.putExtra("username", LocationView.this.appview_username);
          nextActivity.putExtra("password", LocationView.this.appview_password);
  
          nextActivity.putExtra("userfirstname", LocationView.this.userfirstname );
          nextActivity.putExtra("userlastname", LocationView.this.userlastname );
          nextActivity.putExtra("companyname", LocationView.this.companyname );
  
          nextActivity.putExtra("AudienceFirstnameLastname", LocationView.this.AudienceFirstnameLastname );
  
          nextActivity.putExtra("latitude", "Unavailable" );
          nextActivity.putExtra("longitude", "Unavailable" );
  
          nextActivity.putExtra("origin", "LocationView" );
  
          finish();
          startActivity(nextActivity);
      }
  
      public boolean displayCoordinates(Location location){
          //String txtMsg = "Latitude: " + location.getLatitude() + "\nLongitude: " + location.getLongitude();
          //Toast.makeText(getBaseContext(), txtMsg, Toast.LENGTH_SHORT).show();
          LocationView.this.mProgressDialog.setMessage("Location Available..." );
  
          if( LocationView.this.mProgressDialog.isShowing() ){
              dismissDialog(0);
          }
  
          //go back to main_audience.html //3
          Intent nextActivity = new Intent(LocationView.this, AppView.class);
  
          nextActivity.putExtra("userId", LocationView.this.userId );
          nextActivity.putExtra("username", LocationView.this.appview_username);
          nextActivity.putExtra("password", LocationView.this.appview_password);
  
          nextActivity.putExtra("userfirstname", LocationView.this.userfirstname );
          nextActivity.putExtra("userlastname", LocationView.this.userlastname );
          nextActivity.putExtra("companyname", LocationView.this.companyname );
  
          nextActivity.putExtra("AudienceFirstnameLastname", LocationView.this.AudienceFirstnameLastname );
  
          nextActivity.putExtra("latitude", location.getLatitude() );
          nextActivity.putExtra("longitude", location.getLongitude() );
          nextActivity.putExtra("LocationString", LocationView.this.LocationString );
  
          nextActivity.putExtra("origin", "LocationView" );
  
          finish();
          startActivity(nextActivity);
  
          //this.tv.append( txtMsg );
          //Toast.makeText(getBaseContext(), txtMsg, Toast.LENGTH_SHORT).show();
  
          return true;
      }
  
  
  
  
      @Override
      protected Dialog onCreateDialog(int id) {
          switch (id) {
              case 0:
                  mProgressDialog = new ProgressDialog(this);
                  mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
                  mProgressDialog.show();
                  return mProgressDialog;
              default:
                  return null;
          }
      }
  
  }
  </code></pre>