The Android SDK offers a nice API to receive information about available providers for location based services and get the current location and coordinates.
In this short tutorial we’re going to build a small activity that displays a list of available location providers and shows the current position using GPS services.
Example Application
-
Create a new Android Project using ADT and your IDE with a package named com.hascode.android.location_app
-
Add the permissions needed to the AndroidManifest.xml – it should look like this
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.hascode.android.location_app" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".LocationActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <uses-sdk android:minSdkVersion="7" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"></uses-permission> </manifest>
-
Create a layout with one text view and two buttons in the main.xml
<?xml version="1.0" encoding="utf-8"?> <TableLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <TextView android:id="@+id/output" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/loading"> </TextView> <Button android:id="@+id/btShowProviders" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/showProviders"> </Button> <Button android:id="@+id/btShowLocation" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/showLocation"> </Button> </TableLayout>
-
Externalize the strings in the strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">LocationApp</string> <string name="loading">loading...</string> <string name="showProviders">Show available providers</string> <string name="showLocation">Listen to coordinate updates</string> </resources>
-
Create the activity LocationActivity
package com.hascode.android.location_app; import java.util.List; import android.app.Activity; import android.content.Context; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.location.LocationProvider; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; public class LocationActivity extends Activity implements LocationListener { // attrs private static final String TAG = "com.hascode.android.location-app"; private LocationManager locationManager; private static final String PROVIDER = "gps"; // for this tutorial we simply // assume that this provider // exists // ui elements private TextView output; private Button btShowProviders; private Button btShowLocation; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); output = (TextView) findViewById(R.id.output); btShowProviders = (Button) findViewById(R.id.btShowProviders); btShowLocation = (Button) findViewById(R.id.btShowLocation); locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); if (locationManager == null) { Log.w(TAG, "no location manager found"); output.setText("no location manager no fun .."); } else { btShowProviders.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showProviders(); } }); btShowLocation.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showLocation(); } }); } } /** * shows the list of available location providers */ private void showProviders() { List<String> providers = locationManager.getAllProviders(); Log.d(TAG, "available providers found: " + providers.size()); StringBuilder s = new StringBuilder(); for (String provider : providers) { s.append(provider); s.append("\n"); } output.setText(s.toString()); } /** * displays the current location using the gps provider */ private void showLocation() { LocationProvider gps = locationManager.getProvider(PROVIDER); if (gps == null) { Log.w(TAG, "gps provider not found"); return; } locationManager.requestLocationUpdates(PROVIDER, 1200, 5, this); Log.d(TAG, "listening to gps events started"); } /* * (non-Javadoc) * * @see * android.location.LocationListener#onLocationChanged(android.location. * Location) */ @Override public void onLocationChanged(Location location) { String result = String.format( "Your coords: latitude %f is longitude is %f", location .getLatitude(), location.getLongitude()); Log.d(TAG, "location update received: " + result); output.setText(result); } /* * (non-Javadoc) * * @see * android.location.LocationListener#onProviderDisabled(java.lang.String) */ @Override public void onProviderDisabled(String provider) { Log.d(TAG, "the following provider was disabled: " + provider); } /* * (non-Javadoc) * * @see * android.location.LocationListener#onProviderEnabled(java.lang.String) */ @Override public void onProviderEnabled(String provider) { Log.d(TAG, "the following provider was enabled: " + provider); } /* * (non-Javadoc) * * @see android.location.LocationListener#onStatusChanged(java.lang.String, * int, android.os.Bundle) */ @Override public void onStatusChanged(String provider, int status, Bundle extras) { Log.d(TAG, String.format( "Provider status has changed. provider: %s, status: %d", provider, status)); } }
-
Run the app on your emulator and use ddms or the emulator control view if you’re using eclipse like me
Screenshots
Converting to a Maven Project
If you want to use Maven with your project, take a look at this article – my pom.xml looks like this:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hascode.android.location_app</groupId>
<artifactId>location-app</artifactId>
<packaging>apk</packaging>
<name>hasCode.com - Sample Location App</name>
<version>0.1</version>
<dependencies>
<dependency>
<groupId>android</groupId>
<artifactId>android</artifactId>
<version>2.1_r1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>maven-android-plugin</artifactId>
<configuration>
<sdk>
<path>${env.ANDROID_HOME}</path>
<platform>1.6</platform>
</sdk>
<deleteConflictingFiles>true</deleteConflictingFiles>
</configuration>
<extensions>true</extensions>
</plugin>
</plugins>
</build>
</project>
Logging and Filtering
Take a look at the logs using the adb tool and filter for entries with the tag “com.hascode.android.location-app“:
adb -s emulator-5554 shell
# logcat com.hascode.android.location-app:D *:S
D/com.hascode.android.location-app( 209): available providers found: 1
D/com.hascode.android.location-app( 209): listening to gps events started
D/com.hascode.android.location-app( 209): listening to gps events started
D/com.hascode.android.location-app( 209): available providers found: 1
D/com.hascode.android.location-app( 209): listening to gps events started
Resources
Article Updates
-
2015-03-03: Table of contents added.