When there is satellite reception, it can take a GPS receiver as much as 12.5 minutes to acquire a fix, depending on the number of satellites being received and their relative positions in the sky. To speed this up, our phones use a technology called Assisted-GPS (A-GPS), using location information obtained via mobile data and/or WiFi connections to more accurately and quickly determine a position.
Sometimes, A-GPS data seems to be incorrect, leading to no location fix.
What can we do?
The GPS Status application, available from the Market, can show you the location, signal strength, and acquisition data from GPS satellites above. It can also flush and reload Assisted-GPS data. This will clear any existing A-GPS aberration, and reset the acquisition sequence.
Option B -- Root required
Google provides Assisted-GPS data to Android phones via an A-GPS standard called Secure User Plane Location (SUPL). Cyanogen's team has determined that for some CM ROM users, disabling Google's SUPL connection in the phone's GPS receiver configuration can improve fix speed. As I understand it, his team is not yet sure of the root cause.
I'm not on Cyanogen's team. Even so, I could guess at a root cause, but it is only a guess. Perhaps the data packet is never received, due to a problem at the server. Perhaps the data packet is received but is missed by the GPS software. Perhaps the data packet is invalid and rejected, but a new replacement packet is never received and the GPS software just waits ....
Whether those guesses are right or wrong doesn't matter. When Google's SUPL service is removed from the phone, other A-GPS location data is used, allowing a GPS fix to proceed. Reportedly, with good speed. From my own experience, also, it seems to work well without SUPL service configured.
1. Mount the /system partition read-write. This can be done from adb, from the Root Explorer application, or from a terminal emulator
2. Edit /system/etc/gps.conf, and remove the lines that begin with "SUPL". For CM7, as an example, this is lines 5 and 6, "SUPL_HOST=supl.google.com" and "SUPL_PORT 7276"