Android GPS Example
April 11th, 2010
For some reason there doesn’t seem to be a clear example showing how to use GPS on Android. Here is some code I have written that listens for location changes and displays the data in a TextView. The example also shows how to open the GPS setting with code via an Intent, since sometimes the GPS will be turned off by the user.
Code
Of course the Android framework has security permissions to protect the user. To get the permission to use GPS add a uses-permission tag with attribute android:name set to “android.permission.ACCESS_FINE_LOCATION” to the AndroidManifest.xml document as a direct child of the manifest tag, i.e:
When testing this code in the emulator, you can send mock fixes by connecting to the emulator using telnet, i.e. ‘telnet localhost 5554′ and typing:
geo fix -10.223, 40.549
Code
package uk.co.hejp.GPSExample; import android.app.Activity; import android.content.Intent; 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.widget.TextView; import android.widget.Toast; public class Main extends Activity implements LocationListener { /* this class implements LocationListener, which listens for both * changes in the location of the device and changes in the status * of the GPS system. * */ static final String tag = "Main"; // for Log TextView txtInfo; LocationManager lm; StringBuilder sb; int noOfFixes = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); /* get TextView to display the GPS data */ txtInfo = (TextView) findViewById(R.id.textInfo); /* the location manager is the most vital part it allows access * to location and GPS status services */ lm = (LocationManager) getSystemService(LOCATION_SERVICE); } @Override protected void onResume() { /* * onResume is is always called after onStart, even if the app hasn't been * paused * * add location listener and request updates every 1000ms or 10m */ lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10f, this); super.onResume(); } @Override protected void onPause() { /* GPS, as it turns out, consumes battery like crazy */ lm.removeUpdates(this); super.onResume(); } @Override public void onLocationChanged(Location location) { Log.v(tag, "Location Changed"); sb = new StringBuilder(512); noOfFixes++; /* display some of the data in the TextView */ sb.append("No. of Fixes: "); sb.append(noOfFixes); sb.append('\n'); sb.append('\n'); sb.append("Londitude: "); sb.append(location.getLongitude()); sb.append('\n'); sb.append("Latitude: "); sb.append(location.getLatitude()); sb.append('\n'); sb.append("Altitiude: "); sb.append(location.getAltitude()); sb.append('\n'); sb.append("Accuracy: "); sb.append(location.getAccuracy()); sb.append('\n'); sb.append("Timestamp: "); sb.append(location.getTime()); sb.append('\n'); txtInfo.setText(sb.toString()); } @Override public void onProviderDisabled(String provider) { /* this is called if/when the GPS is disabled in settings */ Log.v(tag, "Disabled"); /* bring up the GPS settings */ Intent intent = new Intent( android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); } @Override public void onProviderEnabled(String provider) { Log.v(tag, "Enabled"); Toast.makeText(this, "GPS Enabled", Toast.LENGTH_SHORT).show(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { /* This is called when the GPS status alters */ switch (status) { case LocationProvider.OUT_OF_SERVICE: Log.v(tag, "Status Changed: Out of Service"); Toast.makeText(this, "Status Changed: Out of Service", Toast.LENGTH_SHORT).show(); break; case LocationProvider.TEMPORARILY_UNAVAILABLE: Log.v(tag, "Status Changed: Temporarily Unavailable"); Toast.makeText(this, "Status Changed: Temporarily Unavailable", Toast.LENGTH_SHORT).show(); break; case LocationProvider.AVAILABLE: Log.v(tag, "Status Changed: Available"); Toast.makeText(this, "Status Changed: Available", Toast.LENGTH_SHORT).show(); break; } } @Override protected void onStop() { /* may as well just finish since saving the state is not important for this toy app */ finish(); super.onStop(); } }Permissions
Of course the Android framework has security permissions to protect the user. To get the permission to use GPS add a uses-permission tag with attribute android:name set to “android.permission.ACCESS_FINE_LOCATION” to the AndroidManifest.xml document as a direct child of the manifest tag, i.e:
android:name="android.permission.ACCESS_FINE_LOCATION" />
NotesWhen testing this code in the emulator, you can send mock fixes by connecting to the emulator using telnet, i.e. ‘telnet localhost 5554′ and typing:
geo fix -10.223, 40.549
Không có nhận xét nào:
Đăng nhận xét