title: Retrieving GPS coordinates not working when ran on a real android phone
body: <p>My program should be able to:</p>
  
  <ol>
  <li>Change the map view</li>
  <li>Zoom in to the phone's current location</li>
  <li>Add a marker</li>
  <li>Display an alert of the Latitude and Longitude values</li>
  </ol>
  
  <p>When I use GPS_PROVIDER, functions 1-4 works in my emulator (because I manually feed it a latitude and longitude values). But when I created an apk file, 2-4 functions don't work.</p>
  
  <p>Here's my class.</p>
  
  <pre><code>package com.locator.map;
  
  import java.text.DecimalFormat;
  import java.util.List;
  
  import android.app.AlertDialog;
  import android.content.Context;
  import android.content.DialogInterface;
  import android.graphics.drawable.Drawable;
  import android.location.Criteria;
  import android.location.Location;
  import android.location.LocationListener;
  import android.location.LocationManager;
  import android.os.Bundle;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.Button;
  import android.widget.Toast;
  
  import com.google.android.maps.GeoPoint;
  import com.google.android.maps.MapActivity;
  import com.google.android.maps.MapController;
  import com.google.android.maps.MapView;
  import com.google.android.maps.Overlay;
  import com.google.android.maps.OverlayItem;
  
  public class Main extends MapActivity
  {
      MapController controller;
      double currentLat;
      double currentLon;
      LocationManager manager;
      boolean locationChanged = false;
      Button retrieveLocationButton, toggleViewButton;
      boolean streetview = false;
      Drawable d;
      List&lt;Overlay&gt; overlaylist;
      MapView map;
      Criteria criteria;
      String bestProvider;
  
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState)
      {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);      
          map = (MapView) findViewById (R.id.googleMap);       
          map.setBuiltInZoomControls(true);
          map.setSatellite(true);
          controller = map.getController();
  
  
          criteria = new Criteria();
          criteria.setAccuracy(Criteria.ACCURACY_FINE);
          manager = (LocationManager) this.getSystemService (Context.LOCATION_SERVICE);        
          bestProvider = manager.getBestProvider(criteria, true);
  
          retrieveLocationButton = (Button) findViewById(R.id.retrieveLocation);
          toggleViewButton = (Button) findViewById(R.id.changeView);
  
          retrieveLocationButton.setOnClickListener(new OnClickListener()
          {      
                  public void onClick(View v)
                  {
                      showCurrentLocation();
                  }
          });        
  
          toggleViewButton.setOnClickListener(new OnClickListener()
          {
              public void onClick(View v)
              {
                  if (streetview == false)
                  {
                      map.setSatellite(false);
                      map.setStreetView(true);
                      streetview=true;
                  }
                  else if (streetview == true)
                  {
                      map.setStreetView(false);
                      map.setSatellite(true);
                      streetview=false;
                  }
              }           
          });
          LocationListener listener = new LocationListener()
          {
              public void onLocationChanged(Location location)
              {
                  // TODO Auto-generated method stub
  
                  //Retrieve the current GPS coordinates
                  currentLat = location.getLatitude();
                  currentLon = location.getLongitude();
  
                  locationChanged = true;
              }
  
              public void onProviderDisabled(String provider)
              {
                  // TODO Auto-generated method stub
                  Toast.makeText(getBaseContext(), "Your GPS services are not activated.", Toast.LENGTH_LONG).show();
              }
  
              public void onProviderEnabled(String provider)
              {
                  // TODO Auto-generated method stub
                  Toast.makeText(getBaseContext(), "Your GPS services are now activated.", Toast.LENGTH_LONG).show();
              }
  
              public void onStatusChanged(String provider, int status, Bundle extras)
              {
                  // TODO Auto-generated method stub
                  Toast.makeText(getBaseContext(), "Your GPS service provider is changed.", Toast.LENGTH_LONG).show();
              }
  
          };
  
          manager.requestLocationUpdates(bestProvider, 1000, 1, listener); //--&gt; To update current location (coordinates [latitude &amp; longitude]).       
  
      }
  
      protected void showCurrentLocation()
      {
          // TODO Auto-generated method stub
  
          //If location is changed or updated - Zoom in to current location, add a marker and show a dialog with current coordinates.
          if (locationChanged == true)
          {
              //Set the map's view and zoom level animation
              GeoPoint currentLocation = new GeoPoint ((int) (currentLat * 1E6), (int) (currentLon * 1E6));
  
              controller.setCenter(currentLocation);
              controller.setZoom(15);
  
              //Show the current coordinates (Convert to String and round off - 6 decimal places)
              String printLat = new DecimalFormat("0.######").format((double)currentLat);
              String printLon = new DecimalFormat("0.######").format((double)currentLon);
  
              AlertDialog alert = new AlertDialog.Builder(Main.this).create();
              alert.setTitle("Current Location:");
              alert.setMessage("Latitude: " + printLat + "\n" + "Longitude: " + printLon);
              alert.setButton("Close", new DialogInterface.OnClickListener()
              {               
                  public void onClick(DialogInterface arg0, int arg1)
                  {
                      // TODO Auto-generated method stub
                      //Alert Dialog won't work without a listener
                      //Do nothing (This will simply close your alert dialog)
                  }
              });     
              alert.show();
  
              //Add a marker
              overlaylist = map.getOverlays();
              d = getResources().getDrawable(R.drawable.ic_launcher);         
              CustomPinpoint marker = new CustomPinpoint (d, Main.this);          
              OverlayItem overlayitem = new OverlayItem (currentLocation, "1st String", "2nd String");
              marker.insertPinpoint(overlayitem);
              overlaylist.add(marker);    
          }
      }
  
      @Override
      protected boolean isRouteDisplayed()
      {
          // TODO Auto-generated method stub
          return false;
      }
  }
  </code></pre>
  
  <p>I also tried using NETWORK_PROVIDER.
  Everything works in my phone but it's not returning accurate latitude and longitude values. It adds marker but it's about 1 kilometer away from my actual location.</p>
  
  <p>Here's my class using NETWORK_PROVIDER:</p>
  
  <pre><code>package com.locator.map;
  
  import java.text.DecimalFormat;
  import java.util.List;
  
  import android.app.AlertDialog;
  import android.content.Context;
  import android.content.DialogInterface;
  import android.graphics.drawable.Drawable;
  import android.location.Criteria;
  import android.location.Location;
  import android.location.LocationListener;
  import android.location.LocationManager;
  import android.os.Bundle;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.Button;
  import android.widget.Toast;
  
  import com.google.android.maps.GeoPoint;
  import com.google.android.maps.MapActivity;
  import com.google.android.maps.MapController;
  import com.google.android.maps.MapView;
  import com.google.android.maps.Overlay;
  import com.google.android.maps.OverlayItem;
  
  public class Main extends MapActivity
  {
      MapController controller;
      double currentLat;
      double currentLon;
      LocationManager manager;
      boolean locationChanged = false;
      Button retrieveLocationButton, toggleViewButton;
      boolean streetview = false;
      Drawable d;
      List&lt;Overlay&gt; overlaylist;
      MapView map;
  
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState)
      {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);      
          map = (MapView) findViewById (R.id.googleMap);       
          map.setBuiltInZoomControls(true);
          map.setSatellite(true);
          controller = map.getController();
  
  
          manager = (LocationManager) this.getSystemService (Context.LOCATION_SERVICE);        
  
          retrieveLocationButton = (Button) findViewById(R.id.retrieveLocation);
          toggleViewButton = (Button) findViewById(R.id.changeView);
  
          retrieveLocationButton.setOnClickListener(new OnClickListener()
          {      
                  public void onClick(View v)
                  {
                      showCurrentLocation();
                  }
          });        
  
          toggleViewButton.setOnClickListener(new OnClickListener()
          {
              public void onClick(View v)
              {
                  if (streetview == false)
                  {
                      map.setSatellite(false);
                      map.setStreetView(true);
                      streetview=true;
                  }
                  else if (streetview == true)
                  {
                      map.setStreetView(false);
                      map.setSatellite(true);
                      streetview=false;
                  }
              }           
          });
          LocationListener listener = new LocationListener()
          {
              public void onLocationChanged(Location location)
              {
                  // TODO Auto-generated method stub
  
                  //Retrieve the current GPS coordinates
                  currentLat = location.getLatitude();
                  currentLon = location.getLongitude();
  
                  locationChanged = true;
              }
  
              public void onProviderDisabled(String provider)
              {
                  // TODO Auto-generated method stub
                  Toast.makeText(getBaseContext(), "Your GPS services are not activated.", Toast.LENGTH_LONG).show();
              }
  
              public void onProviderEnabled(String provider)
              {
                  // TODO Auto-generated method stub
                  Toast.makeText(getBaseContext(), "Your GPS services are now activated.", Toast.LENGTH_LONG).show();
              }
  
              public void onStatusChanged(String provider, int status, Bundle extras)
              {
                  // TODO Auto-generated method stub
                  Toast.makeText(getBaseContext(), "Your GPS service provider is changed.", Toast.LENGTH_LONG).show();
              }
  
          };
  
          manager.requestLocationUpdates(NETWORK_PROVIDER, 1000, 1, listener); //--&gt; To update current location (coordinates [latitude &amp; longitude]).       
  
      }
  
      protected void showCurrentLocation()
      {
          // TODO Auto-generated method stub
  
          //If location is changed or updated - Zoom in to current location, add a marker and show a dialog with current coordinates.
          if (locationChanged == true)
          {
              //Set the map's view and zoom level animation
              GeoPoint currentLocation = new GeoPoint ((int) (currentLat * 1E6), (int) (currentLon * 1E6));
  
              controller.setCenter(currentLocation);
              controller.setZoom(15);
  
              //Show the current coordinates (Convert to String and round off - 6 decimal places)
              String printLat = new DecimalFormat("0.######").format((double)currentLat);
              String printLon = new DecimalFormat("0.######").format((double)currentLon);
  
              AlertDialog alert = new AlertDialog.Builder(Main.this).create();
              alert.setTitle("Current Location:");
              alert.setMessage("Latitude: " + printLat + "\n" + "Longitude: " + printLon);
              alert.setButton("Close", new DialogInterface.OnClickListener()
              {               
                  public void onClick(DialogInterface arg0, int arg1)
                  {
                      // TODO Auto-generated method stub
                      //Alert Dialog won't work without a listener
                      //Do nothing (This will simply close your alert dialog)
                  }
              });     
              alert.show();
  
              //Add a marker
              overlaylist = map.getOverlays();
              d = getResources().getDrawable(R.drawable.ic_launcher);         
              CustomPinpoint marker = new CustomPinpoint (d, Main.this);          
              OverlayItem overlayitem = new OverlayItem (currentLocation, "1st String", "2nd String");
              marker.insertPinpoint(overlayitem);
              overlaylist.add(marker);    
          }
      }
  
      @Override
      protected boolean isRouteDisplayed()
      {
          // TODO Auto-generated method stub
          return false;
      }
  }
  </code></pre>
  
  <p>Here's my Manifest:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.locator.map"
      android:versionCode="1"
      android:versionName="1.0" &gt;
  
      &lt;uses-sdk android:minSdkVersion="8"  android:targetSdkVersion="8"/&gt;
      &lt;uses-permission android:name="android.permission.INTERNET"/&gt; 
      &lt;uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /&gt;
      &lt;uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /&gt;
      &lt;application android:icon="@drawable/ic_launcher" android:label="Locator" &gt;
          &lt;uses-library android:name="com.google.android.maps" /&gt;     
          &lt;activity
              android:name=".Main"
              android:label="Locator" &gt;
              &lt;intent-filter&gt;
                  &lt;action android:name="android.intent.action.MAIN" /&gt;
                  &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
              &lt;/intent-filter&gt;
          &lt;/activity&gt;        
      &lt;/application&gt;
  
  &lt;/manifest&gt;
  </code></pre>
  
  <p>I think, GPS is working here in my area, Google Maps application returns accurate location when I use it.
  I tried using my application (both NETWORK_PROVIDER and GPS_PROVIDER) in the same location where I used Google Maps:</p>
  
  <ol>
  <li>NETWORK_PROVIDER still returns inaccurate result.</li>
  <li>GPS_PROVIDER still doesn't work.</li>
  </ol>
  
  <p>Please help me.</p>