update listeners and proximity alerts, and more. The LocationProvider class, on the other hand, is provides location data. LocationListener instances use specified providers to asynchronously return location updates to applications.
The LocationManager can be used to query for a list of available location providers, get a reference to a provider by name or capability criteria, get the last-known location
for a named provider (which may be null, or very old), register for several types of location updates and alerts, and more.
we’re using the following manifest permission:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="example.locationinfo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".Main"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ProviderDetail" />
<activity android:name=".GetLocationWithGPS" />
</application>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal">
<TextView android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="20dp"
android:text="Current Location Providers"
android:textAppearance="?android:attr/textAppearanceLarge" />
<ListView
android:id="@+id/location_providers"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/getloc_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginBottom="10dp"
android:text="Get current location via GPS"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
title_detail.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center_horizontal">
<TextView android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="20dp"
android:textAppearance="?android:attr/textAppearanceLarge" />
<ScrollView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:orientation="vertical">
<TextView android:id="@+id/detail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:layout_marginTop="30dp"
android:textAppearance="?android:attr/textAppearanceMedium" />
</ScrollView>
</LinearLayout>
The Main Activity of the LocationInfo application
public class Main extends Activity implements OnItemClickListener {
public static final String LOG_TAG = "LocationInfo";
public static final String PROVIDER_NAME = "PROVIDER_NAME";
private LocationManager locationMgr;//include locationManager
private ListView providersList;
private Button getLoc;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//instantiate LocationManager
locationMgr=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
//use Manager to get list of providers
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,locationMgr.getAllProviders());
providersList=(ListView)findViewById(R.id.location_providers);
providersList.setAdapter(adapter);
//assign ListView click Listener
providersList.setOnItemClickListener(this);
getLoc=(Button)findViewById(R.id.getloc_button);
getLoc.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
startActivity(new Intent(Main.this,GetLocationWithGPS.class));
}
});
}
//implement ListView click listener
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// TODO Auto-generated method stub
TextView textView=(TextView)view;
String providerName=textView.getText().toString();
Intent intent=new Intent(Main.this,ProviderDetail.class);
intent.putExtra(PROVIDER_NAME, providerName);
startActivity(intent);
}
}
Once you select a provider to use, you’ll get a reference to it via the manager, which you can use to get the last-known location and probe its capabilities. The capabilities
include how accurate it is, whether it’s free, how much power it uses, whether it includes altitude and bearing, and so on.
ProviderDetail.java
//NOTE that "network" provider will always return null for getLastKnownLocation
//if settings->location and security->Use wireless networks is NOT CHECKED (very often it's not)
public class ProviderDetail extends Activity {
private LocationManager locationMgr;
private TextView title;
private TextView detail;
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.title_detail);
locationMgr=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
title=(TextView)findViewById(R.id.title);
detail=(TextView)findViewById(R.id.detail);
}
protected void onResume(){
super.onResume();
//get ProviderName from intent
String providerName=getIntent().getStringExtra("PROVIDER_NAME");
//get LastKnownLocation
Location lastLocation=locationMgr.getLastKnownLocation(providerName);
//get LocationProvider by name
LocationProvider provider=locationMgr.getProvider(providerName);
StringBuilder sb=new StringBuilder();
sb.append("location manager data");
sb.append("\n--------------------------------");
if (lastLocation != null) {
sb.append("\n");
Printer printer = new StringBuilderPrinter(sb);
lastLocation.dump(printer, "last location: ");
} else {
sb.append("\nlast location: null\n");
}
sb.append("\n");
sb.append("\nprovider properties");
sb.append("\n--------------------------------");
//query provider capabilities
sb.append("\naccuracy: " + provider.getAccuracy());
sb.append("\npower requirement: " + provider.getPowerRequirement());
sb.append("\nhas monetary cost: " + provider.hasMonetaryCost());
sb.append("\nsupports altitude: " + provider.supportsAltitude());
sb.append("\nsupports bearing: " + provider.supportsBearing());
sb.append("\nsupports speed: " + provider.supportsSpeed());
sb.append("\nrequires cell: " + provider.requiresCell());
sb.append("\nrequires network: " + provider.requiresNetwork());
// extra details for GpsStatus if provider is GPS
if (providerName.equalsIgnoreCase(LocationManager.GPS_PROVIDER)) {
GpsStatus gpsStatus = locationMgr.getGpsStatus(null);
sb.append("\ngps status");
sb.append("\n--------------------------------");
sb.append("\ntime to first fix: " + gpsStatus.getTimeToFirstFix());
sb.append("\nmax satellites: " + gpsStatus.getMaxSatellites());
ArrayList<GpsSatellite> satellites = new ArrayList<GpsSatellite>();
for (GpsSatellite satellite : gpsStatus.getSatellites()) {
satellites.add(satellite);
}
sb.append("\ncurrent satellites: " + satellites.size());
if (satellites.size() > 0) {
for (GpsSatellite satellite : satellites) {
sb.append("\nsatellite: " + satellite.getPrn());
sb.append("\n azimuth " + satellite.getAzimuth());
sb.append("\n elevation " + satellite.getElevation());
sb.append("\n signal to noise ratio " + satellite.getSnr());
}
}
}
title.setText("Provider: " + providerName);
detail.setText(sb.toString());
}
}
To get your current location or be notified of location changes on an ongoing basis, establish a LocationListener. In essence, a LocationListener is registered using one
of several LocationManager methods that allow you to pass in the name of the provider you want to use, along with a callback listener (and a few other properties, such
as time and distance, as needed).