![Page 1: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/1.jpg)
CS 696 Mobile Phone Application DevelopmentFall Semester, 2009
Doc 9 Location & MapsSept 29, 2009
Copyright ©, All rights reserved. 2009 SDSU & Roger Whitney, 5500 Campanile Drive, San Diego, CA 92182-7700 USA. OpenContent (http://www.opencontent.org/opl.shtml) license defines the copyright on this document.
![Page 2: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/2.jpg)
References
2
MapView tutorial, http://developer.android.com/guide/tutorials/views/hello-mapview.html
GoogleMaps with Geocoder Class, http://www.anddev.org/simple_googlemaps_geocoder_-_convert_address_to_lon-lat-t2936.html
Simple GoogleMaps with Threads http://www.anddev.org/simple_googlemaps_with_threads-t2943.html
The Busy Coder's Guide to Android Development, V2.1, Mark L. Murphy
![Page 3: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/3.jpg)
Location
3
32° 46' 29.9994" -117° 4' 13.0008"
32.775 -117.070278
32775000 -117070278
Latitude Longitude
* 1000000
![Page 4: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/4.jpg)
Geo Coders
4
Map Address to latitude & longitude
![Page 5: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/5.jpg)
Android Geocoder
5
Geocoder campus = new Geocoder(this); String addressInput = "5500 Campanile Drive, San Diego CA"; try {
int maxResults = 3;List<Address> foundAdresses;foundAdresses = campus.getFromLocationName(addressInput, maxResults);for (int i = 0; i < foundAdresses.size(); ++i) {
Address x = foundAdresses.get(i); double latitude = x.getLatitude(); double longitude = x.getLongitude();
} } catch (Exception e) { blah }
If you get multiple result back you should ask the user which one is correct.Don't forget to multiple by latitude and longitude by 1000000 to convert it to an integer.
![Page 6: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/6.jpg)
Android Maps - Add-on
6
http://code.google.com/android/add-ons/google-apis/index.html
![Page 7: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/7.jpg)
Mark Murphy
7
"Google Maps, particularly when integrated into third party applications, requires agreeing to a fairly lengthy set of legal terms. These terms include clauses that you may find unpalatable."
The Busy Coder's Guide to Android Development, V2.1, Mark L. Murphy page 399
![Page 8: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/8.jpg)
First Map Example
8
Marker on GMCS
![Page 9: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/9.jpg)
MapActivity
9
public class MapExample extends MapActivity {
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); LinearLayout linearLayout = (LinearLayout) findViewById(R.id.zoomview); MapView mapView = (MapView) findViewById(R.id.mapview); mapView.setBuiltInZoomControls(true); List<Overlay> mapOverlays = mapView.getOverlays(); Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker); HelloItemizedOverlay itemizedOverlay = new HelloItemizedOverlay(drawable); GeoPoint gmcs = new GeoPoint(32776389, -117069167); OverlayItem overlayitem = new OverlayItem(gmcs, "GMCS", "This is where the Computer Science department is located at SDSU"); itemizedOverlay.addOverlay(overlayitem); mapOverlays.add(itemizedOverlay); }
protected boolean isRouteDisplayed() { return false; }}
![Page 10: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/10.jpg)
How to add png graphic to Project
10
Just add it to the res/drawable directory
![Page 11: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/11.jpg)
Overlay
11
public class HelloItemizedOverlay extends ItemizedOverlay<OverlayItem> { private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); public HelloItemizedOverlay(Drawable defaultMarker) { super(boundCenterBottom(defaultMarker)); } public void addOverlay(OverlayItem overlay) { mOverlays.add(overlay); populate(); } protected OverlayItem createItem(int i) { return mOverlays.get(i); } public int size() { return mOverlays.size(); }}
![Page 12: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/12.jpg)
Main XML
12
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mainlayout" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" >
<com.google.android.maps.MapView android:id="@+id/mapview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" android:apiKey="0EqsdoMWNHdDiPF9uHOYe-KJG328jz2ZpsfTUMg" /><LinearLayout android:id="@+id/zoomview" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottom="@id/mapview" android:layout_centerHorizontal="true"/></RelativeLayout>
![Page 13: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/13.jpg)
Map Keys
13
http://code.google.com/android/add-ons/google-apis/mapkey.html
You need a map key to use Google Maps
keytool -list -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android
Generate certificate fingerprint
Generate key
http://code.google.com/android/add-ons/google-apis/maps-api-signup.html
![Page 14: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/14.jpg)
Debug Certificate
14
Good for one year
![Page 15: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/15.jpg)
Permissions
15
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="edu.sdsu.cs696" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MapExample" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <uses-library android:name="com.google.android.maps" />
</application> <uses-sdk android:minSdkVersion="3" /> <uses-permission android:name="android.permission.INTERNET" /></manifest>
![Page 16: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/16.jpg)
Zoom, Centering & Satellite
16
![Page 17: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/17.jpg)
Map Example Again
17
public class MapExample extends MapActivity { MapView mapView; HelloItemizedOverlay itemizedOverlay;
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mapView = (MapView) findViewById(R.id.mapview); setGMCSOverlay();
}
![Page 18: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/18.jpg)
Centering & set Zoom level
18
private void setGMCSOverlay() { mapView.setBuiltInZoomControls(true); List<Overlay> mapOverlays = mapView.getOverlays(); Drawable drawable = this.getResources().getDrawable( R.drawable.androidmarker); itemizedOverlay = new HelloItemizedOverlay(this, drawable); GeoPoint gmcs = new GeoPoint(32776389, -117069167); OverlayItem overlayitem = new OverlayItem(gmcs, "GMCS", "This is where the Computer Science department is located at SDSU"); itemizedOverlay.addOverlay(overlayitem); mapOverlays.add(itemizedOverlay); MapController controls = mapView.getController(); controls.setZoom(16); controls.setCenter(gmcs); }
![Page 19: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/19.jpg)
Handling Key Down
19
public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_S) { mapView.setSatellite(!mapView.isSatellite()); return (true); }
return (super.onKeyDown(keyCode, event)); }
![Page 20: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/20.jpg)
Multiple Locations, My Location, GSP, Taps
20
32776389, -117069167
![Page 21: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/21.jpg)
Nearly The Same
21
public class MapExample extends MapActivity { private MapView mapView; private HelloItemizedOverlay itemizedOverlay; private MyLocationOverlay currentLocation; private LocationListener locationUpdater;
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mapView = (MapView) findViewById(R.id.mapview); setOverlays(); getLocationUpdates(); }
![Page 22: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/22.jpg)
Handling the Life Cycle
22
public void onResume() { super.onResume(); currentLocation.enableCompass(); //MyLocation getLocationUpdates(); //Get GSP updates }
@Override public void onPause() { super.onPause(); currentLocation.disableCompass(); LocationManager location = (LocationManager)
getSystemService(Context.LOCATION_SERVICE); location.removeUpdates(locationUpdater); }
![Page 23: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/23.jpg)
Requesting GPS Updates
23
private void getLocationUpdates() { LocationManager location = (LocationManager)
getSystemService(Context.LOCATION_SERVICE); locationUpdater = getLocationListener(); // Use GPS since we can sent location via DDMS location.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000 * 60 * 2, 5, locationUpdater); }
private void showLocation(Location location) { // really should show location on map Toast.makeText(this, "New Location " + location, Toast.LENGTH_SHORT) .show(); }
![Page 24: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/24.jpg)
Requesting GPS Updates - the Listener
24
private LocationListener getLocationListener() { return new LocationListener() { public void onLocationChanged(Location location) { showLocation(location); }
public void onProviderDisabled(String provider) { }
public void onProviderEnabled(String provider) { }
public void onStatusChanged(String provider, int status, Bundle extras) {
} }; }
![Page 25: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/25.jpg)
Overlays - The Same
25
private void setOverlays() { mapView.setBuiltInZoomControls(true); setCurrentLocation(); GeoPoint gmcs = setGMCSLocation(); MapController controls = mapView.getController(); controls.setZoom(16); controls.setCenter(gmcs); }
private void setCurrentLocation() { currentLocation = new MyLocationOverlay(this, mapView); mapView.getOverlays().add(currentLocation); }
private GeoPoint setGMCSLocation() { Drawable drawable = this.getResources().getDrawable( R.drawable.androidmarker); itemizedOverlay = new HelloItemizedOverlay(this, drawable); GeoPoint gmcs = new GeoPoint(32776389, -117069167); OverlayItem overlayitem = new OverlayItem(gmcs, "GMCS", "This is where the Computer Science department is located at SDSU"); itemizedOverlay.addOverlay(overlayitem); mapView.getOverlays().add(itemizedOverlay); return gmcs; }
![Page 26: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/26.jpg)
Added a second Locations
26
public class HelloItemizedOverlay extends ItemizedOverlay<OverlayItem> { private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); private Context mContext;
public HelloItemizedOverlay(Context context, Drawable defaultMarker) { super(boundCenterBottom(defaultMarker)); mContext = context; GeoPoint gmcs = new GeoPoint(32775210, -117070398); OverlayItem overlayitem = new OverlayItem(gmcs, "Library", "SDSU Library Entrance"); this.addOverlay(overlayitem); }
public void addOverlay(OverlayItem overlay) { mOverlays.add(overlay); populate(); }
![Page 27: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/27.jpg)
Handling Tap in Overlay Class
27
protected OverlayItem createItem(int i) { return mOverlays.get(i); }
@Override protected boolean onTap(int i) { Toast.makeText(mContext, mOverlays.get(i).getSnippet(), Toast.LENGTH_SHORT).show(); return (true); }
public int size() { return mOverlays.size(); }}
![Page 28: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/28.jpg)
Need to Request Location Access
28
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="edu.sdsu.cs696" android:versionCode="1" android:versionName="1.0"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission. ACCESS_FINE_LOCATION" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MapExample" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <uses-library android:name="com.google.android.maps" />
</application> <uses-sdk android:minSdkVersion="3" /></manifest>
You can also access ACCESS_COARSE_LOCATION. GPS is ACCESS_FINE_LOCATION. Can only send GPS locations to the emulator.
![Page 29: CS 696 Mobile Phone Application Development Fall Semester](https://reader033.vdocuments.net/reader033/viewer/2022060110/555ac6efd8b42ab1128b50f2/html5/thumbnails/29.jpg)
How to test Location
29