LocationManagerpublic class LocationManager extends Object This class provides access to the system location services. These
services allow applications to obtain periodic updates of the
device's geographical location, or to fire an application-specified
{@link Intent} when the device enters the proximity of a given
geographical location.
You do not
instantiate this class directly; instead, retrieve it through
{@link android.content.Context#getSystemService
Context.getSystemService(Context.LOCATION_SERVICE)}. |
Fields Summary |
---|
private static final String | TAG | private ILocationManager | mService | private final HashMap | mGpsStatusListeners | private final GpsStatus | mGpsStatus | public static final String | NETWORK_PROVIDERName of the network location provider. This provider determines location based on
availability of cell tower and WiFi access points. Results are retrieved
by means of a network lookup.
Requires either of the permissions android.permission.ACCESS_COARSE_LOCATION
or android.permission.ACCESS_FINE_LOCATION. | public static final String | GPS_PROVIDERName of the GPS location provider. This provider determines location using
satellites. Depending on conditions, this provider may take a while to return
a location fix.
Requires the permission android.permissions.ACCESS_FINE_LOCATION.
The extras Bundle for the GPS location provider can contain the
following key/value pairs:
- satellites - the number of satellites used to derive the fix
| public static final String | KEY_PROXIMITY_ENTERINGKey used for the Bundle extra holding a boolean indicating whether
a proximity alert is entering (true) or exiting (false).. | public static final String | KEY_STATUS_CHANGEDKey used for a Bundle extra holding an Integer status value
when a status change is broadcast using a PendingIntent. | public static final String | KEY_PROVIDER_ENABLEDKey used for a Bundle extra holding an Boolean status value
when a provider enabled/disabled event is broadcast using a PendingIntent. | public static final String | KEY_LOCATION_CHANGEDKey used for a Bundle extra holding a Location value
when a location change is broadcast using a PendingIntent. | public static final String | PROVIDER_DIR | public static final String | SYSTEM_DIR | private HashMap | mListeners |
Constructors Summary |
---|
public LocationManager(ILocationManager service)
if (Config.LOGD) {
Log.d(TAG, "Constructor: service = " + service);
}
mService = service;
|
Methods Summary |
---|
private void | _requestLocationUpdates(java.lang.String provider, long minTime, float minDistance, LocationListener listener, android.os.Looper looper)
if (minTime < 0L) {
minTime = 0L;
}
if (minDistance < 0.0f) {
minDistance = 0.0f;
}
try {
synchronized (mListeners) {
ListenerTransport transport = mListeners.get(listener);
if (transport == null) {
transport = new ListenerTransport(listener, looper);
}
mListeners.put(listener, transport);
mService.requestLocationUpdates(provider, minTime, minDistance, transport);
}
} catch (RemoteException ex) {
Log.e(TAG, "requestLocationUpdates: DeadObjectException", ex);
}
| private void | _requestLocationUpdates(java.lang.String provider, long minTime, float minDistance, android.app.PendingIntent intent)
if (minTime < 0L) {
minTime = 0L;
}
if (minDistance < 0.0f) {
minDistance = 0.0f;
}
try {
mService.requestLocationUpdatesPI(provider, minTime, minDistance, intent);
} catch (RemoteException ex) {
Log.e(TAG, "requestLocationUpdates: RemoteException", ex);
}
| public boolean | addGpsStatusListener(GpsStatus.Listener listener)Adds a GPS status listener.
boolean result;
if (mGpsStatusListeners.get(listener) != null) {
// listener is already registered
return true;
}
try {
GpsStatusListenerTransport transport = new GpsStatusListenerTransport(listener);
result = mService.addGpsStatusListener(transport);
if (result) {
mGpsStatusListeners.put(listener, transport);
}
} catch (RemoteException e) {
Log.e(TAG, "RemoteException in registerGpsStatusListener: ", e);
result = false;
}
return result;
| public void | addProximityAlert(double latitude, double longitude, float radius, long expiration, android.app.PendingIntent intent)Sets a proximity alert for the location given by the position
(latitude, longitude) and the given radius. When the device
detects that it has entered or exited the area surrounding the
location, the given PendingIntent will be used to create an Intent
to be fired.
The fired Intent will have a boolean extra added with key
{@link #KEY_PROXIMITY_ENTERING}. If the value is true, the device is
entering the proximity region; if false, it is exiting.
Due to the approximate nature of position estimation, if the
device passes through the given area briefly, it is possible
that no Intent will be fired. Similarly, an Intent could be
fired if the device passes very close to the given area but
does not actually enter it.
After the number of milliseconds given by the expiration
parameter, the location manager will delete this proximity
alert and no longer monitor it. A value of -1 indicates that
there should be no expiration time.
In case the screen goes to sleep, checks for proximity alerts
happen only once every 4 minutes. This conserves battery life by
ensuring that the device isn't perpetually awake.
Internally, this method uses both {@link #NETWORK_PROVIDER}
and {@link #GPS_PROVIDER}.
if (Config.LOGD) {
Log.d(TAG, "addProximityAlert: latitude = " + latitude +
", longitude = " + longitude + ", radius = " + radius +
", expiration = " + expiration +
", intent = " + intent);
}
try {
mService.addProximityAlert(latitude, longitude, radius,
expiration, intent);
} catch (RemoteException ex) {
Log.e(TAG, "addProximityAlert: RemoteException", ex);
}
| public void | addTestProvider(java.lang.String name, boolean requiresNetwork, boolean requiresSatellite, boolean requiresCell, boolean hasMonetaryCost, boolean supportsAltitude, boolean supportsSpeed, boolean supportsBearing, int powerRequirement, int accuracy)Creates a mock location provider and adds it to the set of active providers.
try {
mService.addTestProvider(name, requiresNetwork, requiresSatellite, requiresCell,
hasMonetaryCost, supportsAltitude, supportsSpeed, supportsBearing, powerRequirement,
accuracy);
} catch (RemoteException ex) {
Log.e(TAG, "addTestProvider: RemoteException", ex);
}
| private LocationProvider | best(java.util.List providerNames)
List<LocationProvider> providers = new ArrayList<LocationProvider>(providerNames.size());
for (String name : providerNames) {
providers.add(getProvider(name));
}
if (providers.size() < 2) {
return providers.get(0);
}
// First, sort by power requirement
Collections.sort(providers, new LpPowerComparator());
int power = providers.get(0).getPowerRequirement();
if (power < providers.get(1).getPowerRequirement()) {
return providers.get(0);
}
int idx, size;
List<LocationProvider> tmp = new ArrayList<LocationProvider>();
idx = 0;
size = providers.size();
while ((idx < size) && (providers.get(idx).getPowerRequirement() == power)) {
tmp.add(providers.get(idx));
idx++;
}
// Next, sort by accuracy
Collections.sort(tmp, new LpAccuracyComparator());
int acc = tmp.get(0).getAccuracy();
if (acc < tmp.get(1).getAccuracy()) {
return tmp.get(0);
}
List<LocationProvider> tmp2 = new ArrayList<LocationProvider>();
idx = 0;
size = tmp.size();
while ((idx < size) && (tmp.get(idx).getAccuracy() == acc)) {
tmp2.add(tmp.get(idx));
idx++;
}
// Finally, sort by capability "score"
Collections.sort(tmp2, new LpCapabilityComparator());
return tmp2.get(0);
| public void | clearTestProviderEnabled(java.lang.String provider)Removes any mock enabled value associated with the given provider.
try {
mService.clearTestProviderEnabled(provider);
} catch (RemoteException ex) {
Log.e(TAG, "clearTestProviderEnabled: RemoteException", ex);
}
| public void | clearTestProviderLocation(java.lang.String provider)Removes any mock location associated with the given provider.
try {
mService.clearTestProviderLocation(provider);
} catch (RemoteException ex) {
Log.e(TAG, "clearTestProviderLocation: RemoteException", ex);
}
| public void | clearTestProviderStatus(java.lang.String provider)Removes any mock status values associated with the given provider.
try {
mService.clearTestProviderStatus(provider);
} catch (RemoteException ex) {
Log.e(TAG, "clearTestProviderStatus: RemoteException", ex);
}
| private LocationProvider | createProvider(java.lang.String name, android.os.Bundle info)
DummyLocationProvider provider =
new DummyLocationProvider(name);
provider.setRequiresNetwork(info.getBoolean("network"));
provider.setRequiresSatellite(info.getBoolean("satellite"));
provider.setRequiresCell(info.getBoolean("cell"));
provider.setHasMonetaryCost(info.getBoolean("cost"));
provider.setSupportsAltitude(info.getBoolean("altitude"));
provider.setSupportsSpeed(info.getBoolean("speed"));
provider.setSupportsBearing(info.getBoolean("bearing"));
provider.setPowerRequirement(info.getInt("power"));
provider.setAccuracy(info.getInt("accuracy"));
return provider;
| public java.util.List | getAllProviders()Returns a list of the names of all known location providers. All
providers are returned, including ones that are not permitted to be
accessed by the calling activity or are currently disabled.
if (Config.LOGD) {
Log.d(TAG, "getAllProviders");
}
try {
return mService.getAllProviders();
} catch (RemoteException ex) {
Log.e(TAG, "getAllProviders: RemoteException", ex);
}
return null;
| public java.lang.String | getBestProvider(Criteria criteria, boolean enabledOnly)Returns the name of the provider that best meets the given criteria. Only providers
that are permitted to be accessed by the calling activity will be
returned. If several providers meet the criteria, the one with the best
accuracy is returned. If no provider meets the criteria,
the criteria are loosened in the following sequence:
- power requirement
- accuracy
- bearing
- speed
- altitude
Note that the requirement on monetary cost is not removed
in this process.
List<String> goodProviders = getProviders(criteria, enabledOnly);
if (!goodProviders.isEmpty()) {
return best(goodProviders).getName();
}
// Make a copy of the criteria that we can modify
criteria = new Criteria(criteria);
// Loosen power requirement
int power = criteria.getPowerRequirement();
while (goodProviders.isEmpty() && (power != Criteria.NO_REQUIREMENT)) {
power = nextPower(power);
criteria.setPowerRequirement(power);
goodProviders = getProviders(criteria, enabledOnly);
}
if (!goodProviders.isEmpty()) {
return best(goodProviders).getName();
}
// // Loosen response time requirement
// int responseTime = criteria.getPreferredResponseTime();
// while (goodProviders.isEmpty() &&
// (responseTime != Criteria.NO_REQUIREMENT)) {
// responseTime += 1000;
// if (responseTime > 60000) {
// responseTime = Criteria.NO_REQUIREMENT;
// }
// criteria.setPreferredResponseTime(responseTime);
// goodProviders = getProviders(criteria);
// }
// if (!goodProviders.isEmpty()) {
// return best(goodProviders);
// }
// Loosen accuracy requirement
int accuracy = criteria.getAccuracy();
while (goodProviders.isEmpty() && (accuracy != Criteria.NO_REQUIREMENT)) {
accuracy = nextAccuracy(accuracy);
criteria.setAccuracy(accuracy);
goodProviders = getProviders(criteria, enabledOnly);
}
if (!goodProviders.isEmpty()) {
return best(goodProviders).getName();
}
// Remove bearing requirement
criteria.setBearingRequired(false);
goodProviders = getProviders(criteria, enabledOnly);
if (!goodProviders.isEmpty()) {
return best(goodProviders).getName();
}
// Remove speed requirement
criteria.setSpeedRequired(false);
goodProviders = getProviders(criteria, enabledOnly);
if (!goodProviders.isEmpty()) {
return best(goodProviders).getName();
}
// Remove altitude requirement
criteria.setAltitudeRequired(false);
goodProviders = getProviders(criteria, enabledOnly);
if (!goodProviders.isEmpty()) {
return best(goodProviders).getName();
}
return null;
| public GpsStatus | getGpsStatus(GpsStatus status)Retrieves information about the current status of the GPS engine.
This should only be called from the {@link GpsStatus.Listener#onGpsStatusChanged}
callback to ensure that the data is copied atomically.
The caller may either pass in a {@link GpsStatus} object to set with the latest
status information, or pass null to create a new {@link GpsStatus} object.
if (status == null) {
status = new GpsStatus();
}
status.setStatus(mGpsStatus);
return status;
| public Location | getLastKnownLocation(java.lang.String provider)Returns a Location indicating the data from the last known
location fix obtained from the given provider. This can be done
without starting the provider. Note that this location could
be out-of-date, for example if the device was turned off and
moved to another location.
If the provider is currently disabled, null is returned.
if (provider == null) {
throw new IllegalArgumentException("provider==null");
}
try {
return mService.getLastKnownLocation(provider);
} catch (RemoteException ex) {
Log.e(TAG, "getLastKnowLocation: RemoteException", ex);
return null;
}
| public LocationProvider | getProvider(java.lang.String name)Returns the information associated with the location provider of the
given name, or null if no provider exists by that name.
if (name == null) {
throw new IllegalArgumentException("name==null");
}
try {
Bundle info = mService.getProviderInfo(name);
if (info == null) {
return null;
}
return createProvider(name, info);
} catch (RemoteException ex) {
Log.e(TAG, "getProvider: RemoteException", ex);
}
return null;
| public java.util.List | getProviders(boolean enabledOnly)Returns a list of the names of location providers. Only providers that
are permitted to be accessed by the calling activity will be returned.
try {
return mService.getProviders(enabledOnly);
} catch (RemoteException ex) {
Log.e(TAG, "getProviders: RemoteException", ex);
}
return null;
| public java.util.List | getProviders(Criteria criteria, boolean enabledOnly)Returns a list of the names of LocationProviders that satisfy the given
criteria, or null if none do. Only providers that are permitted to be
accessed by the calling activity will be returned.
List<String> goodProviders = Collections.emptyList();
List<String> providers = getProviders(enabledOnly);
for (String providerName : providers) {
LocationProvider provider = getProvider(providerName);
if (provider.meetsCriteria(criteria)) {
if (goodProviders.isEmpty()) {
goodProviders = new ArrayList<String>();
}
goodProviders.add(providerName);
}
}
return goodProviders;
| public boolean | isProviderEnabled(java.lang.String provider)Returns the current enabled/disabled status of the given provider. If the
user has enabled this provider in the Settings menu, true is returned
otherwise false is returned
if (provider == null) {
throw new IllegalArgumentException("provider==null");
}
try {
return mService.isProviderEnabled(provider);
} catch (RemoteException ex) {
Log.e(TAG, "isProviderEnabled: RemoteException", ex);
return false;
}
| private int | nextAccuracy(int accuracy)Returns the next looser accuracy requirement, in the sequence:
ACCURACY_FINE -> ACCURACY_APPROXIMATE-> NO_REQUIREMENT
if (accuracy == Criteria.ACCURACY_FINE) {
return Criteria.ACCURACY_COARSE;
} else {
return Criteria.NO_REQUIREMENT;
}
| private int | nextPower(int power)Returns the next looser power requirement, in the sequence:
POWER_LOW -> POWER_MEDIUM -> POWER_HIGH -> NO_REQUIREMENT
switch (power) {
case Criteria.POWER_LOW:
return Criteria.POWER_MEDIUM;
case Criteria.POWER_MEDIUM:
return Criteria.POWER_HIGH;
case Criteria.POWER_HIGH:
return Criteria.NO_REQUIREMENT;
case Criteria.NO_REQUIREMENT:
default:
return Criteria.NO_REQUIREMENT;
}
| public void | removeGpsStatusListener(GpsStatus.Listener listener)Removes a GPS status listener.
try {
GpsStatusListenerTransport transport = mGpsStatusListeners.remove(listener);
if (transport != null) {
mService.removeGpsStatusListener(transport);
}
} catch (RemoteException e) {
Log.e(TAG, "RemoteException in unregisterGpsStatusListener: ", e);
}
| public void | removeProximityAlert(android.app.PendingIntent intent)Removes the proximity alert with the given PendingIntent.
if (Config.LOGD) {
Log.d(TAG, "removeProximityAlert: intent = " + intent);
}
try {
mService.removeProximityAlert(intent);
} catch (RemoteException ex) {
Log.e(TAG, "removeProximityAlert: RemoteException", ex);
}
| public void | removeTestProvider(java.lang.String provider)Removes the mock location provider with the given name.
try {
mService.removeTestProvider(provider);
} catch (RemoteException ex) {
Log.e(TAG, "removeTestProvider: RemoteException", ex);
}
| public void | removeUpdates(LocationListener listener)Removes any current registration for location updates of the current activity
with the given LocationListener. Following this call, updates will no longer
occur for this listener.
if (listener == null) {
throw new IllegalArgumentException("listener==null");
}
if (Config.LOGD) {
Log.d(TAG, "removeUpdates: listener = " + listener);
}
try {
ListenerTransport transport = mListeners.remove(listener);
if (transport != null) {
mService.removeUpdates(transport);
}
} catch (RemoteException ex) {
Log.e(TAG, "removeUpdates: DeadObjectException", ex);
}
| public void | removeUpdates(android.app.PendingIntent intent)Removes any current registration for location updates of the current activity
with the given PendingIntent. Following this call, updates will no longer
occur for this intent.
if (intent == null) {
throw new IllegalArgumentException("intent==null");
}
if (Config.LOGD) {
Log.d(TAG, "removeUpdates: intent = " + intent);
}
try {
mService.removeUpdatesPI(intent);
} catch (RemoteException ex) {
Log.e(TAG, "removeUpdates: RemoteException", ex);
}
| public void | requestLocationUpdates(java.lang.String provider, long minTime, float minDistance, LocationListener listener)Registers the current activity to be notified periodically by
the named provider. Periodically, the supplied LocationListener will
be called with the current Location or with status updates.
It may take a while to receive the most recent location. If
an immediate location is required, applications may use the
{@link #getLastKnownLocation(String)} method.
In case the provider is disabled by the user, updates will stop,
and the {@link LocationListener#onProviderDisabled(String)}
method will be called. As soon as the provider is enabled again,
the {@link LocationListener#onProviderEnabled(String)} method will
be called and location updates will start again.
The frequency of notification may be controlled using the
minTime and minDistance parameters. If minTime is greater than 0,
the LocationManager could potentially rest for minTime milliseconds
between location updates to conserve power. If minDistance is greater than 0,
a location will only be broadcasted if the device moves by minDistance meters.
To obtain notifications as frequently as possible, set both parameters to 0.
Background services should be careful about setting a sufficiently high
minTime so that the device doesn't consume too much power by keeping the
GPS or wireless radios on all the time. In particular, values under 60000ms
are not recommended.
The calling thread must be a {@link android.os.Looper} thread such as
the main thread of the calling Activity.
if (provider == null) {
throw new IllegalArgumentException("provider==null");
}
if (listener == null) {
throw new IllegalArgumentException("listener==null");
}
_requestLocationUpdates(provider, minTime, minDistance, listener, null);
| public void | requestLocationUpdates(java.lang.String provider, long minTime, float minDistance, LocationListener listener, android.os.Looper looper)Registers the current activity to be notified periodically by
the named provider. Periodically, the supplied LocationListener will
be called with the current Location or with status updates.
It may take a while to receive the most recent location. If
an immediate location is required, applications may use the
{@link #getLastKnownLocation(String)} method.
In case the provider is disabled by the user, updates will stop,
and the {@link LocationListener#onProviderDisabled(String)}
method will be called. As soon as the provider is enabled again,
the {@link LocationListener#onProviderEnabled(String)} method will
be called and location updates will start again.
The frequency of notification may be controlled using the
minTime and minDistance parameters. If minTime is greater than 0,
the LocationManager could potentially rest for minTime milliseconds
between location updates to conserve power. If minDistance is greater than 0,
a location will only be broadcasted if the device moves by minDistance meters.
To obtain notifications as frequently as possible, set both parameters to 0.
Background services should be careful about setting a sufficiently high
minTime so that the device doesn't consume too much power by keeping the
GPS or wireless radios on all the time. In particular, values under 60000ms
are not recommended.
The supplied Looper is used to implement the callback mechanism.
if (provider == null) {
throw new IllegalArgumentException("provider==null");
}
if (listener == null) {
throw new IllegalArgumentException("listener==null");
}
if (looper == null) {
throw new IllegalArgumentException("looper==null");
}
_requestLocationUpdates(provider, minTime, minDistance, listener, looper);
| public void | requestLocationUpdates(java.lang.String provider, long minTime, float minDistance, android.app.PendingIntent intent)Registers the current activity to be notified periodically by
the named provider. Periodically, the supplied PendingIntent will
be broadcast with the current Location or with status updates.
Location updates are sent with a key of KEY_LOCATION_CHANGED and a Location value.
It may take a while to receive the most recent location. If
an immediate location is required, applications may use the
{@link #getLastKnownLocation(String)} method.
The frequency of notification or new locations may be controlled using the
minTime and minDistance parameters. If minTime is greater than 0,
the LocationManager could potentially rest for minTime milliseconds
between location updates to conserve power. If minDistance is greater than 0,
a location will only be broadcast if the device moves by minDistance meters.
To obtain notifications as frequently as possible, set both parameters to 0.
Background services should be careful about setting a sufficiently high
minTime so that the device doesn't consume too much power by keeping the
GPS or wireless radios on all the time. In particular, values under 60000ms
are not recommended.
In case the provider is disabled by the user, updates will stop,
and an intent will be sent with an extra with key KEY_PROVIDER_ENABLED and a boolean value
of false. If the provider is re-enabled, an intent will be sent with an
extra with key KEY_PROVIDER_ENABLED and a boolean value of true and location updates will
start again.
If the provider's status changes, an intent will be sent with an extra with key
KEY_STATUS_CHANGED and an integer value indicating the new status. Any extras associated
with the status update will be sent as well.
if (provider == null) {
throw new IllegalArgumentException("provider==null");
}
if (intent == null) {
throw new IllegalArgumentException("intent==null");
}
_requestLocationUpdates(provider, minTime, minDistance, intent);
| public boolean | sendExtraCommand(java.lang.String provider, java.lang.String command, android.os.Bundle extras)Sends additional commands to a location provider.
Can be used to support provider specific extensions to the Location Manager API
try {
return mService.sendExtraCommand(provider, command, extras);
} catch (RemoteException e) {
Log.e(TAG, "RemoteException in sendExtraCommand: ", e);
return false;
}
| public void | setTestProviderEnabled(java.lang.String provider, boolean enabled)Sets a mock enabled value for the given provider. This value will be used in place
of any actual value from the provider.
try {
mService.setTestProviderEnabled(provider, enabled);
} catch (RemoteException ex) {
Log.e(TAG, "setTestProviderEnabled: RemoteException", ex);
}
| public void | setTestProviderLocation(java.lang.String provider, Location loc)Sets a mock location for the given provider. This location will be used in place
of any actual location from the provider.
try {
mService.setTestProviderLocation(provider, loc);
} catch (RemoteException ex) {
Log.e(TAG, "setTestProviderLocation: RemoteException", ex);
}
| public void | setTestProviderStatus(java.lang.String provider, int status, android.os.Bundle extras, long updateTime)Sets mock status values for the given provider. These values will be used in place
of any actual values from the provider.
try {
mService.setTestProviderStatus(provider, status, extras, updateTime);
} catch (RemoteException ex) {
Log.e(TAG, "setTestProviderStatus: RemoteException", ex);
}
| public void | updateProviders()Propagates the enabled/disabled state of the providers from the system
settings to the providers themselves.
{@hide}
try {
mService.updateProviders();
} catch (RemoteException ex) {
Log.e(TAG, "updateProviders: RemoteException", ex);
}
|
|