<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>2Lines Software &#187; Android</title>
	<atom:link href="http://www.2linessoftware.com/tag/android/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.2linessoftware.com</link>
	<description></description>
	<lastBuildDate>Wed, 04 Aug 2010 03:41:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>Singletons and Services and Shutdowns Oh My</title>
		<link>http://www.2linessoftware.com/2010/08/03/singletons-and-services-and-shutdowns-oh-my/</link>
		<comments>http://www.2linessoftware.com/2010/08/03/singletons-and-services-and-shutdowns-oh-my/#comments</comments>
		<pubDate>Wed, 04 Aug 2010 03:38:58 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programming Tip]]></category>
		<category><![CDATA[services]]></category>
		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://www.2linessoftware.com/2010/08/03/singletons-and-services-and-shutdowns-oh-my/</guid>
		<description><![CDATA[Passing data back and forth between activities on the Android platform is one of the more challenging aspects of understanding Android. Understanding how this data is managed by the OS is the difference between getting flooded with Error Reports and bad reviews and getting  glowing praise and eternal gratitude. Well maybe not to that extent, [...]]]></description>
			<content:encoded><![CDATA[<div class="posterous_autopost">
<p>Passing data back and forth between activities on the Android platform is one of the more challenging aspects of understanding Android. Understanding how this data is managed by the OS is the difference between getting flooded with Error Reports and bad reviews and getting  glowing praise and eternal gratitude. Well maybe not to that extent, but having a good background in passing data can make your code much easier to manage and cleaner to read (and for that you have my gratitude)  So in passing the data there are essentially two types Persistent and strangely enough, Non-Persistent data types. The Persistent types are best handled by preferences, files, databases or content providers and they are pretty detailed in their operation. If you need to keep data over the length of more that one session consider using Persistent data stores.  On the other hand, there are often times where transient data needs to be stored for one session and passed between activities. To handle that there are a couple of ways to handle it.  This <a title="Android Framework Topics" href="http://developer.android.com/guide/appendix/faq/framework.html#3" target="_blank">page </a>details some of the methods, and it is repeated here for convenience;</p>
<blockquote>
<h2>How do I pass data between Activities/Services within a single application?</h2>
<p>It depends on the type of data that you want to share:</p>
<h3>Primitive Data Types</h3>
<p>To share primitive data between Activities/Services in an application, use Intent.putExtras(). For passing primitive data that needs to persist use the <a href="http://developer.android.com/guide/topics/data/data-storage.html#preferences">Preferences</a> storage mechanism.</p>
<h3>Non-Persistent Objects</h3>
<p>For sharing complex non-persistent user-defined objects for short duration, the following approaches are recommended:</p>
<h4>The android.app.Application class</h4>
<p>The android.app.Application is a base class for those who need to maintain global application state. It can be accessed via getApplication() from any Activity or Service. It has a couple of life-cycle methods and will be instantiated by Android automatically if your register it in AndroidManifest.xml.</p>
<h4>A public static field/method</h4>
<p>An alternate way to make data accessible across Activities/Services is to use <em>public static</em> fields and/or methods. You can access these static fields from any other class in your application. To share an object, the activity which creates your object sets a static field to point to this object and any other activity that wants to use this object just accesses this static field.</p>
<h4>A HashMap of WeakReferences to Objects</h4>
<p>You can also use a HashMap of WeakReferences to Objects with Long keys. When an activity wants to pass an object to another activity, it simply puts the object in the map and sends the key (which is a unique Long based on a counter or time stamp) to the recipient activity via intent extras. The recipient activity retrieves the object using this key.</p>
<h4>A Singleton class</h4>
<p>There are advantages to using a static Singleton, such as you can refer to them without casting getApplication() to an application-specific class, or going to the trouble of hanging an interface on all your Application subclasses so that your various modules can refer to that interface instead.  <strong>But, the life cycle of a static is not well under your control; so to abide by the life-cycle model, the application class should initiate and tear down these static objects in the onCreate() and onTerminate() methods of the Application Class </strong>[my emphasis]</p></blockquote>
<p>Being as I come from a java EE background the first decision was to use the singleton class and allow the instance to be available across the VM. The<a href="http://en.wikipedia.org/wiki/Singleton_pattern" target="_blank"> singleton design pattern</a> is fairly well-known and is a good easy way to manage control across many activities. In some previous projects I have used them to manage HTTP connections, image caching and global application configuration to much success. However, this is the important part to consider when using singletons which is very important; <strong>Android OS can and will terminate your singleton and not even tell you about it. </strong>I highlighted that in bold because if your design depends on singleton patterns you naturally assume they are going to stay persistent through the VM. These are frustrating errors and difficult to track down and even more frustrating for your users.  For instance consider this piece of code:  In your main activity;</p>
<blockquote>
<div>@Override</div>
<div>public void onCreate(Bundle savedInstanceState) {</div>
<div><span> </span>super.onCreate(savedInstanceState);</div>
<div><span> </span>SuperSingletonManager.create(this);</div>
<div>}</div>
</blockquote>
<p>And your singleton;</p>
<blockquote>
<div>
<div><span> </span>private static SuperSingletonManager instance;</div>
<div><span> </span>private SuperSingletonManager(Context context)</div>
<div><span> </span>{</div>
<div><span> </span>// do stuff once</div>
<div><span> </span>}</div>
<div><span> </span>protected static SuperSingletonManager create(Context context) {</div>
<div><span> </span>instance = new SuperSingletonManager(context);</div>
<div><span> </span>}</div>
<div><span> </span>protected static SuperSingletonManager getInstance() {</div>
<div><span> </span>if (instance == null)</div>
<div><span> </span>throw new NastyException("Oh God Why?");</div>
<div><span> </span>return instance;</div>
<div><span> </span>}</div>
</div>
</blockquote>
<p>Seemingly you should be able to call  <em>SuperSingletonManager.getInstance() </em>at any time and get access to the static instance. However, this isn't the case. If the launching  activity is removed by the OS (it happens, a lot) while you are on another activity, that static instance will be gone. So when you make that  <em>SuperSingletonManager getInstance() </em> call you are only going to get a nasty exception. This also means that if any of your functions in <em>SuperSingletonManager </em>make use of the <em>Context </em>those will throw errors. Ack.  <em>But I really, really like singletons. </em> So do I. And far be it from me to tell you how to architect your code. The only stipulation is that the singleton should <strong>abide by the lifecycle</strong> <strong>model. </strong>We can do this by launching the singletons from a service and binding that service to the launching activity. To the Android purists, and common-sensists out there you might just say "Why not just use a service instead of a singleton?".  Sure, makes sense but this post is about singletons and how to get them working and not common-sense.  So here is the class that will do all that;</p>
<blockquote><p>public class SingletonService extends Service {</p>
<p><span> </span>private final ISingletonService.Stub mBinder = new ISingletonService.Stub() {</p>
<p><span> </span>public void startSingletons() throws RemoteException {</p>
<p><span> </span> initializeSingletons();</p>
<p><span> </span>}</p>
<p><span> </span>public void stopSingletons() throws RemoteException {</p>
<p><span> </span> shutdownSingletons();</p>
<p><span> </span>}</p>
<p><span> </span>};</p>
<p><span> </span>public IBinder onBind(Intent intent) {</p>
<p><span> </span> return mBinder;</p>
<p><span> </span>}</p>
<p><span> </span>protected void initializeSingletons() {</p>
<p><span> </span> SuperSingletonManager.initialize(getApplicationContext());</p>
<p><span> </span>}</p>
<p><span> </span>private void shutdownSingletons() {</p>
<p><span> </span> SuperSingletonManager.shutdown();</p>
<p><span> </span>}</p>
<p><span> </span>}</p></blockquote>
<p>When you start your main activity bind the service using <em>bindService()</em> , and make a call to the <em>startSingletons() </em>method. This will launch your singletons under the lifecycle of the service. This will ensure they are active for the life of your application session.  Also, make sure to <em>unbindService </em>when you are finished. Nobody likes developers that don't clean up after themselves.  Good luck and if you actually use this method let me know!  John</p>
<p style="font-size: 10px;"><a href="http://posterous.com">Posted via email</a> from <a href="http://johncarpenter.posterous.com/singletons-and-services-and-shutdowns-oh-my">John Carpenter</a></p>
</div>

<span class="slashdigglicious">
<a href="http://slashdot.org/bookmark.pl?url=http%3A%2F%2Fwww.2linessoftware.com%2F2010%2F08%2F03%2Fsingletons-and-services-and-shutdowns-oh-my%2F&amp;title=Singletons+and+Services+and+Shutdowns+Oh+My" title="Slashdot It!"><img src="http://slashdot.org/favicon.ico" height="16" width="16" alt="[Slashdot]" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.2linessoftware.com%2F2010%2F08%2F03%2Fsingletons-and-services-and-shutdowns-oh-my%2F&amp;title=Singletons+and+Services+and+Shutdowns+Oh+My" title="Digg This Story"><img src="http://digg.com/favicon.ico" width="16" height="16" alt="[Digg]" /></a>
<a href="http://reddit.com/submit?url=http%3A%2F%2Fwww.2linessoftware.com%2F2010%2F08%2F03%2Fsingletons-and-services-and-shutdowns-oh-my%2F&amp;title=Singletons+and+Services+and+Shutdowns+Oh+My" title="Reddit"><img src="http://reddit.com/favicon.ico" width="16" height="16" alt="[Reddit]" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.2linessoftware.com%2F2010%2F08%2F03%2Fsingletons-and-services-and-shutdowns-oh-my%2F&amp;title=Singletons+and+Services+and+Shutdowns+Oh+My" title="Save to del.icio.us" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url=http%3A%2F%2Fwww.2linessoftware.com%2F2010%2F08%2F03%2Fsingletons-and-services-and-shutdowns-oh-my%2F&amp;title=Singletons+and+Services+and+Shutdowns+Oh+My', 'delicious', 'toolbar=no,width=700,height=400'); return false;"><img src="http://images.del.icio.us/static/img/delicious.small.gif" width="16" height="16" alt="[del.icio.us]" /></a>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.2linessoftware.com%2F2010%2F08%2F03%2Fsingletons-and-services-and-shutdowns-oh-my%2F" title="Share on Facebook"><img src="http://www.facebook.com/favicon.ico" width="16" height="16" alt="[Facebook]" /></a>
<a href="http://technorati.com/faves?add=http%3A%2F%2Fwww.2linessoftware.com%2F2010%2F08%2F03%2Fsingletons-and-services-and-shutdowns-oh-my%2F" title="Add to my Technorati Favorites"><img src="http://technorati.com/favicon.ico" width="16" height="16" alt="[Technorati]" /></a>
<a href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.2linessoftware.com%2F2010%2F08%2F03%2Fsingletons-and-services-and-shutdowns-oh-my%2F&amp;title=Singletons+and+Services+and+Shutdowns+Oh+My" title="Save to Google Bookmarks"><img src="http://www.google.com/favicon.ico" width="16" height="16" alt="[Google]" /></a>
<a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.2linessoftware.com%2F2010%2F08%2F03%2Fsingletons-and-services-and-shutdowns-oh-my%2F&amp;title=Singletons+and+Services+and+Shutdowns+Oh+My" title="Stumble it!"><img src="http://www.stumbleupon.com/favicon.ico" width="16" height="16" alt="[StumbleUpon]" /></a>
</span>]]></content:encoded>
			<wfw:commentRss>http://www.2linessoftware.com/2010/08/03/singletons-and-services-and-shutdowns-oh-my/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Getting Android SDK to work with Fedora 10</title>
		<link>http://www.2linessoftware.com/2009/01/31/getting-android-sdk-to-work-with-fedora-10/</link>
		<comments>http://www.2linessoftware.com/2009/01/31/getting-android-sdk-to-work-with-fedora-10/#comments</comments>
		<pubDate>Sun, 01 Feb 2009 01:05:40 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[bugs]]></category>

		<guid isPermaLink="false">http://www.2linessoftware.com/?p=75</guid>
		<description><![CDATA[Just thought I pass this little bit of information on. Fedora 10 (and Ubuntu also) is a little screwy when it comes to connecting the ADP1 device to Eclipse for testing. Any USB device automatically gets connected as read-only which means the adb server and Eclipse won´t see the device when you plug it in. [...]]]></description>
			<content:encoded><![CDATA[<p>Just thought I pass this little bit of information on. Fedora 10 (and Ubuntu also) is a little screwy when it comes to connecting the ADP1 device to Eclipse for testing.</p>
<p>Any USB device automatically gets connected as read-only which means the adb server and Eclipse won´t see the device when you plug it in.</p>
<p><a href="http://groups.google.com/group/android-developers/browse_thread/thread/dfea35e7a3413999" target="_blank">This post</a> gives a little information on how to fix it.</p>
<p>The idea is to create a rules file that listens for the Android device and sets the permissions differently. The rules are all located under /etc/udev/rules.d. So in detail,</p>
<p>Create a new rule for Android devices</p>
<pre lang=¨XML¨>vi /etc/udev/rules.d/99-android.rules
</pre>
<p>Add the following code</p>
<pre lang=¨XML¨>SUBSYSTEM=="usb",SYSFS{idVendor}=="0bb4",SYMLINK+="android_adb",MODE="0666"</pre>
<p>And run</p>
<pre lang=¨XML¨>udevcontrol reload_rules</pre>
<p>Plug it in and it should work.</p>

<span class="slashdigglicious">
<a href="http://slashdot.org/bookmark.pl?url=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F31%2Fgetting-android-sdk-to-work-with-fedora-10%2F&amp;title=Getting+Android+SDK+to+work+with+Fedora+10" title="Slashdot It!"><img src="http://slashdot.org/favicon.ico" height="16" width="16" alt="[Slashdot]" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F31%2Fgetting-android-sdk-to-work-with-fedora-10%2F&amp;title=Getting+Android+SDK+to+work+with+Fedora+10" title="Digg This Story"><img src="http://digg.com/favicon.ico" width="16" height="16" alt="[Digg]" /></a>
<a href="http://reddit.com/submit?url=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F31%2Fgetting-android-sdk-to-work-with-fedora-10%2F&amp;title=Getting+Android+SDK+to+work+with+Fedora+10" title="Reddit"><img src="http://reddit.com/favicon.ico" width="16" height="16" alt="[Reddit]" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F31%2Fgetting-android-sdk-to-work-with-fedora-10%2F&amp;title=Getting+Android+SDK+to+work+with+Fedora+10" title="Save to del.icio.us" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F31%2Fgetting-android-sdk-to-work-with-fedora-10%2F&amp;title=Getting+Android+SDK+to+work+with+Fedora+10', 'delicious', 'toolbar=no,width=700,height=400'); return false;"><img src="http://images.del.icio.us/static/img/delicious.small.gif" width="16" height="16" alt="[del.icio.us]" /></a>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F31%2Fgetting-android-sdk-to-work-with-fedora-10%2F" title="Share on Facebook"><img src="http://www.facebook.com/favicon.ico" width="16" height="16" alt="[Facebook]" /></a>
<a href="http://technorati.com/faves?add=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F31%2Fgetting-android-sdk-to-work-with-fedora-10%2F" title="Add to my Technorati Favorites"><img src="http://technorati.com/favicon.ico" width="16" height="16" alt="[Technorati]" /></a>
<a href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F31%2Fgetting-android-sdk-to-work-with-fedora-10%2F&amp;title=Getting+Android+SDK+to+work+with+Fedora+10" title="Save to Google Bookmarks"><img src="http://www.google.com/favicon.ico" width="16" height="16" alt="[Google]" /></a>
<a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F31%2Fgetting-android-sdk-to-work-with-fedora-10%2F&amp;title=Getting+Android+SDK+to+work+with+Fedora+10" title="Stumble it!"><img src="http://www.stumbleupon.com/favicon.ico" width="16" height="16" alt="[StumbleUpon]" /></a>
</span>]]></content:encoded>
			<wfw:commentRss>http://www.2linessoftware.com/2009/01/31/getting-android-sdk-to-work-with-fedora-10/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>WikiWhere the Video</title>
		<link>http://www.2linessoftware.com/2009/01/21/wikiwhere-the-video/</link>
		<comments>http://www.2linessoftware.com/2009/01/21/wikiwhere-the-video/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 06:50:22 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[wikiwhere]]></category>

		<guid isPermaLink="false">http://www.2linessoftware.com/2009/01/21/wikiwhere-the-video/</guid>
		<description><![CDATA[Here is the fully functioning WikiWhere Application. Feel free to add / remove / update or delete the app as you see fit!]]></description>
			<content:encoded><![CDATA[<p>Here is the fully functioning WikiWhere Application.</p>
<p><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=2916960&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=2916960&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object><br /></p>
<p>Feel free to add / remove / update or delete the app as you see fit!</p>

<span class="slashdigglicious">
<a href="http://slashdot.org/bookmark.pl?url=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F21%2Fwikiwhere-the-video%2F&amp;title=WikiWhere+the+Video" title="Slashdot It!"><img src="http://slashdot.org/favicon.ico" height="16" width="16" alt="[Slashdot]" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F21%2Fwikiwhere-the-video%2F&amp;title=WikiWhere+the+Video" title="Digg This Story"><img src="http://digg.com/favicon.ico" width="16" height="16" alt="[Digg]" /></a>
<a href="http://reddit.com/submit?url=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F21%2Fwikiwhere-the-video%2F&amp;title=WikiWhere+the+Video" title="Reddit"><img src="http://reddit.com/favicon.ico" width="16" height="16" alt="[Reddit]" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F21%2Fwikiwhere-the-video%2F&amp;title=WikiWhere+the+Video" title="Save to del.icio.us" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F21%2Fwikiwhere-the-video%2F&amp;title=WikiWhere+the+Video', 'delicious', 'toolbar=no,width=700,height=400'); return false;"><img src="http://images.del.icio.us/static/img/delicious.small.gif" width="16" height="16" alt="[del.icio.us]" /></a>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F21%2Fwikiwhere-the-video%2F" title="Share on Facebook"><img src="http://www.facebook.com/favicon.ico" width="16" height="16" alt="[Facebook]" /></a>
<a href="http://technorati.com/faves?add=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F21%2Fwikiwhere-the-video%2F" title="Add to my Technorati Favorites"><img src="http://technorati.com/favicon.ico" width="16" height="16" alt="[Technorati]" /></a>
<a href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F21%2Fwikiwhere-the-video%2F&amp;title=WikiWhere+the+Video" title="Save to Google Bookmarks"><img src="http://www.google.com/favicon.ico" width="16" height="16" alt="[Google]" /></a>
<a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.2linessoftware.com%2F2009%2F01%2F21%2Fwikiwhere-the-video%2F&amp;title=WikiWhere+the+Video" title="Stumble it!"><img src="http://www.stumbleupon.com/favicon.ico" width="16" height="16" alt="[StumbleUpon]" /></a>
</span>]]></content:encoded>
			<wfw:commentRss>http://www.2linessoftware.com/2009/01/21/wikiwhere-the-video/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programming with Android Part 4 &#8211; Finishing WikiWhere</title>
		<link>http://www.2linessoftware.com/2009/01/21/programming-with-android-part-4-finishing-wikiwhere/</link>
		<comments>http://www.2linessoftware.com/2009/01/21/programming-with-android-part-4-finishing-wikiwhere/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 06:22:25 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programming Tip]]></category>
		<category><![CDATA[Add new tag]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[wikiwhere]]></category>

		<guid isPermaLink="false">http://www.2linessoftware.com/2009/01/21/programming-with-android-part-4-finishing-wikiwhere/</guid>
		<description><![CDATA[Continuing from Part 3 we are going to spend the 30 minutes or so to finish the WikiWhere application. So far we have a mapping and location application on the device. The final step is integrating the Wiki sites and displaying them on the map. 1:45 Foosball, Reddit, Digg and Google Reader Break 1:55  Getting [...]]]></description>
			<content:encoded><![CDATA[<p>Continuing from <a href="http://www.2linessoftware.com/2009/01/20/programming-with-android-part-3-building-wikiwhere/#more-29">Part 3</a> we are going to spend the 30 minutes or so to finish the WikiWhere application.  So far we have a mapping and location application on the device. The final step is integrating the Wiki sites and displaying them on the map.</p>
<p><strong>1:45 Foosball, Reddit, Digg and Google Reader Break</strong></p>
<p><strong>1:55  Getting the XML feed for the Wiki sites</strong></p>
<p>Now that you've had a long break we can get to the more complicated sections of the code. The Wiki information is collected and provided as a web service by <a href="http://www.geonames.org/" target="_blank">Geonames.org</a>. We will be using the <a href="http://www.geonames.org/export/wikipedia-webservice.html#wikipediaBoundingBox">wikipediaBoundingBox XML API</a> to get the information from the service.  By making a call to <a href="http://ws.geonames.org/wikipediaBoundingBox?north=51.1&amp;south=50.1&amp;east=-113&amp;west=-115" target="_blank">http://ws.geonames.org/wikipediaBoundingBox?north=51.1&amp;south=50.1&amp;east=-113&amp;west=-115</a> you can get the XML feed of the Wiki Entries in the bounding box in the following format:</p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;geonames<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;entry<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;lang<span class="re2">&gt;</span></span></span>en<span class="sc3"><span class="re1">&lt;/lang<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;title<span class="re2">&gt;</span></span></span>Max Bell Centre<span class="sc3"><span class="re1">&lt;/title<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;summary<span class="re2">&gt;</span></span></span>The Max Bell Centre (often referred to as the Max Bell</div>
</li>
<li class="li1">
<div class="de1">&nbsp; Arena) is an ice hockey arena in Calgary, Alberta, Canada in the</div>
</li>
<li class="li1">
<div class="de1">&nbsp; community of Radisson Heights. It seats 2,121 for hockey with a</div>
</li>
<li class="li1">
<div class="de1">&nbsp; standing room capacity of over 3,000. It is named after George</div>
</li>
<li class="li1">
<div class="de1">&nbsp; Maxwell Bell, a philanthropist who helped fund the arena&#39;s</div>
</li>
<li class="li1">
<div class="de1">&nbsp; construction (...)<span class="sc3"><span class="re1">&lt;/summary<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;feature<span class="re2">&gt;</span></span></span>landmark<span class="sc3"><span class="re1">&lt;/feature<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;countryCode<span class="re2">&gt;</span></span></span>CA<span class="sc3"><span class="re1">&lt;/countryCode<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;population<span class="re2">&gt;</span></span></span>0<span class="sc3"><span class="re1">&lt;/population<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;elevation<span class="re2">&gt;</span></span></span>0<span class="sc3"><span class="re1">&lt;/elevation<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;lat<span class="re2">&gt;</span></span></span>51.0422<span class="sc3"><span class="re1">&lt;/lat<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;lng<span class="re2">&gt;</span></span></span>-114.0036<span class="sc3"><span class="re1">&lt;/lng<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;wikipediaUrl<span class="re2">&gt;</span></span></span>http://en.wikipedia.org/wiki/Max_Bell_Centre</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;/wikipediaUrl<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="sc3"><span class="re1">&lt;thumbnailImg</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="sc3"><span class="re1">&lt;/entry<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">...</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/geonames<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>So to get our wiki items displayed on the map we need to:</p>
<p><span style="color: #000000;"><em>1. Call the Geonames XML API </em></span></p>
<p><span style="color: #000000;"><em>2. Parse the XML </em></span></p>
<p><span style="color: #000000;"><em>3. Display the icons on a MapOverlay </em></span></p>
<p><span style="color: #000000;"><em>4. Implement the "Search For Wiki Entries" Button </em></span></p>
<p><span id="more-36"></span></p>
<p><span style="color: #ff0000;"><em>Step 1. Call the Geonames API</em></span></p>
<p>Android comes built in with the <a href="http://hc.apache.org/httpclient-3.x/" target="_blank">HttpClient </a>code from Apache Foundation, which gives it a very flexible tool in accessing web services. For WikiWhere we will create two classes to handle the API calls. GeonameManager will be responsible for making the HTTP request and parsing the XML, and much like the LocationListener, GeonameListener will push the messages back to the WikiWhere Class.  GeonameManager:</p>
<div class="geshi no java5">
<div class="head">public class GeonameManager {</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> GeonameListener listener<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw2">static</span> <span class="kw2">final</span> <span class="kw21">String</span> WS_URL = <span class="st0">&quot;http://ws5.geonames.org/wikipediaBoundingBox?&quot;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> GeonameManager<span class="br0">&#40;</span>GeonameListener _listener<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; listener = _listener<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">void</span> readFromUrl<span class="br0">&#40;</span><span class="kw3">double</span> minLat, <span class="kw3">double</span> maxLat, <span class="kw3">double</span> minLon, <span class="kw3">double</span> maxLon<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw21">StringBuffer</span> sb = <span class="kw2">new</span> <span class="kw21">StringBuffer</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; sb.<span class="me1">append</span><span class="br0">&#40;</span>WS_URL<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; sb.<span class="me1">append</span><span class="br0">&#40;</span><span class="st0">&quot;north=&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; sb.<span class="me1">append</span><span class="br0">&#40;</span>maxLat<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; sb.<span class="me1">append</span><span class="br0">&#40;</span><span class="st0">&quot;&amp;amp;south=&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; sb.<span class="me1">append</span><span class="br0">&#40;</span>minLat<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; sb.<span class="me1">append</span><span class="br0">&#40;</span><span class="st0">&quot;&amp;amp;west=&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; sb.<span class="me1">append</span><span class="br0">&#40;</span>minLon<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; sb.<span class="me1">append</span><span class="br0">&#40;</span><span class="st0">&quot;&amp;amp;east=&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; sb.<span class="me1">append</span><span class="br0">&#40;</span>maxLon<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw21">String</span> httpUrl = sb.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw28">URL</span> url<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw28">URLConnection</span> connection = <span class="kw4">null</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">try</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;HttpParams params = <span class="kw2">new</span> BasicHttpParams<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;HttpConnectionParams.<span class="me1">setConnectionTimeout</span><span class="br0">&#40;</span>params, <span class="nu0">5000</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;HttpClient httpclient = <span class="kw2">new</span> DefaultHttpClient<span class="br0">&#40;</span>params<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HttpGet httpGet = <span class="kw2">new</span> HttpGet<span class="br0">&#40;</span>httpUrl<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;HttpResponse response = httpclient.<span class="me1">execute</span><span class="br0">&#40;</span>httpGet<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;WikiItems wi = parseXML<span class="br0">&#40;</span>response.<span class="me1">getEntity</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getContent</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;listener.<span class="me1">newWikiItems</span><span class="br0">&#40;</span>wi<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span><span class="kw2">catch</span><span class="br0">&#40;</span><span class="kw21">Exception</span> e<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;listener.<span class="me1">newError</span><span class="br0">&#40;</span><span class="st0">&quot;Network error:&quot;</span>+e.<span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span>+<span class="st0">&quot;. Please try again later&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">private</span> WikiItems parseXML<span class="br0">&#40;</span><span class="kw166">InputStream</span> in<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; XStream xstream = <span class="kw2">new</span> XStream<span class="br0">&#40;</span><span class="kw2">new</span> DomDriver<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; xstream.<span class="me1">alias</span><span class="br0">&#40;</span><span class="st0">&quot;geonames&quot;</span>, WikiItems.<span class="kw2">class</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; xstream.<span class="me1">alias</span><span class="br0">&#40;</span><span class="st0">&quot;entry&quot;</span>,WikiEntry.<span class="kw2">class</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; xstream.<span class="me1">addImplicitCollection</span><span class="br0">&#40;</span>WikiItems.<span class="kw2">class</span>, <span class="st0">&quot;entries&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; WikiItems wi = <span class="br0">&#40;</span>WikiItems<span class="br0">&#41;</span> xstream.<span class="me1">fromXML</span><span class="br0">&#40;</span>in<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> wi<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>and GeonameListener..</p>
<div class="geshi no java5">
<div class="head">public interface GeonameListener {</div>
<ol>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">void</span> newWikiItems<span class="br0">&#40;</span>WikiItems wi<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">void</span> newError<span class="br0">&#40;</span><span class="kw21">String</span> message<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The method to call the API (readFromUrl) makes a simple HTTP connection in the running thread. Once the connection is made, the InputStream is pushed to the parseXml() method.</p>
<p><span style="color: #ff0000;"><em>Step 2. Parse the XML</em></span></p>
<p>This is where I cheat to save time. I have imported the open source <a href="http://xstream.codehaus.org/">XStream </a>library to parse the XML.  XStream is a very powerful tool used to serialize XML to Java Objects. By taking the source code and importing it into our project we can leverage the XStream tools in the Android environment. I have modified the code to work with the Android parsers and you can download it from here:</p>
<p align="center"><a title="XStream for Android" href="http://www.2linessoftware.com/files/xstream-android.zip">XStream for Android Source </a></p>
<p>To use the XStream parser we first have to create two classes, WikiItems and  WikiEntry, to hold the XML information as a Java Object.</p>
<div class="geshi no java5">
<div class="head">public class WikiEntry {</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">private</span> <span class="kw21">String</span> lang<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw21">String</span> title<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw21">String</span> summary<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw21">String</span> feature<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw21">String</span> countryCode<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw3">int</span> population<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw3">double</span> elevation<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw3">double</span> lat<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw3">double</span> lng<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw21">String</span> wikipediaUrl<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw21">String</span> thumbnailImg<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw21">String</span> getLang<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> lang<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">void</span> setLang<span class="br0">&#40;</span><span class="kw21">String</span> lang<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">this</span>.<span class="me1">lang</span> = lang<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw21">String</span> getTitle<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> title<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">void</span> setTitle<span class="br0">&#40;</span><span class="kw21">String</span> title<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">this</span>.<span class="me1">title</span> = title<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw21">String</span> getSummary<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> summary<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">void</span> setSummary<span class="br0">&#40;</span><span class="kw21">String</span> summary<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">this</span>.<span class="me1">summary</span> = summary<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw21">String</span> getFeature<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> feature<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">void</span> setFeature<span class="br0">&#40;</span><span class="kw21">String</span> feature<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">this</span>.<span class="me1">feature</span> = feature<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw21">String</span> getCountryCode<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> countryCode<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">void</span> setCountryCode<span class="br0">&#40;</span><span class="kw21">String</span> countryCode<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">this</span>.<span class="me1">countryCode</span> = countryCode<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">int</span> getPopulation<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> population<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">void</span> setPopulation<span class="br0">&#40;</span><span class="kw3">int</span> population<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">this</span>.<span class="me1">population</span> = population<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">double</span> getElevation<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> elevation<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">void</span> setElevation<span class="br0">&#40;</span><span class="kw3">double</span> elevation<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">this</span>.<span class="me1">elevation</span> = elevation<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">double</span> getLat<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> lat<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">void</span> setLat<span class="br0">&#40;</span><span class="kw3">double</span> lat<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">this</span>.<span class="me1">lat</span> = lat<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">double</span> getLng<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> lng<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">void</span> setLng<span class="br0">&#40;</span><span class="kw3">double</span> lng<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">this</span>.<span class="me1">lng</span> = lng<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw21">String</span> getWikipediaUrl<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> wikipediaUrl<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">void</span> setWikipediaUrl<span class="br0">&#40;</span><span class="kw21">String</span> wikipediaUrl<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">this</span>.<span class="me1">wikipediaUrl</span> = wikipediaUrl<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw21">String</span> getThumbnailImg<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> thumbnailImg<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">void</span> setThumbnailImg<span class="br0">&#40;</span><span class="kw21">String</span> thumbnailImg<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">this</span>.<span class="me1">thumbnailImg</span> = thumbnailImg<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>..and,</p>
<div class="geshi no java5">
<div class="head">public class WikiItems {</div>
<ol>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">private</span> <span class="kw46">ArrayList</span> entries<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw46">ArrayList</span> getContent<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> entries<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw3">void</span> add<span class="br0">&#40;</span>WikiEntry item<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; entries.<span class="me1">add</span><span class="br0">&#40;</span>item<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>You can see they are both fairly simple java classes using the tag names from the XML as field names.</p>
<p>Next you tell the XStream parser which classes map to which XML tags.</p>
<div class="geshi no java5">
<div class="head">XStream xstream = new XStream(new DomDriver());</div>
<ol>
<li class="li1">
<div class="de1">xstream.<span class="me1">alias</span><span class="br0">&#40;</span><span class="st0">&quot;geonames&quot;</span>, WikiItems.<span class="kw2">class</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">xstream.<span class="me1">alias</span><span class="br0">&#40;</span><span class="st0">&quot;entry&quot;</span>,WikiEntry.<span class="kw2">class</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">xstream.<span class="me1">addImplicitCollection</span><span class="br0">&#40;</span>WikiItems.<span class="kw2">class</span>, <span class="st0">&quot;entries&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>and call the fromXML method.<br />
WikiItems wi = (WikiItems) xstream.fromXML(in);</p>
<p>That's it. If you've ever had the hairpulling experience of parsing XML files on a mobile device you will be pleasantly surprised at how easy XStream is to use.</p>
<p><em><span style="color: #ff0000;">Step 3. Display the Icons on the MapOverlay</span></em></p>
<p>Going back to our WikiWhere activity we want to add the GeonameListener to receive the updates from the HTTP web service of new WikiItems loaded.</p>
<div class="geshi no java5">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">class</span> WikiWhere <span class="kw2">extends</span> MapActivity <span class="kw2">implements</span> LocationListener, GeonameListener <span class="br0">&#123;</span></div>
</li>
</ol>
</div>
<p>and implement the onNewWikiItems method;</p>
<div class="geshi no java5">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw3">void</span> newWikiItems<span class="br0">&#40;</span>WikiItems wi<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw166">List</span> overlays = mv.<span class="me1">getOverlays</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;Drawable marker = getResources<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getDrawable</span><span class="br0">&#40;</span>R.<span class="me1">drawable</span>.<span class="me1">mapicon</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;marker.<span class="me1">setBounds</span><span class="br0">&#40;</span><span class="nu0">0</span>, <span class="nu0">0</span>, marker.<span class="me1">getIntrinsicWidth</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, marker.<span class="me1">getIntrinsicHeight</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;wikiOverlay = <span class="kw2">new</span> WikiOverlay<span class="br0">&#40;</span>marker,wi,<span class="kw2">this</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;overlays.<span class="me1">add</span><span class="br0">&#40;</span>wikiOverlay<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;handler.<span class="me1">sendEmptyMessage</span><span class="br0">&#40;</span><span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Don't worry about the handler.sendEmptyMessage(0) call just yet. We'll get to that one soon.</p>
<p>The next part we will create a custom map overlay to handle placing the icons on the map when new wiki's are sent from the GeonameListener. Androids <a href="http://code.google.com/android/reference/com/google/android/maps/ItemizedOverlay.html" target="_blank">ItemizedOverlay </a>provides a convenient way to handle multiple icons on a map. We implement this by extending it in a creating a class call WikiOverlay.</p>
<div class="geshi no java5">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> WikiOverlay <span class="kw2">extends</span> ItemizedOverlay <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;@<span class="kw21">Override</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">protected</span> <span class="kw3">boolean</span> onTap<span class="br0">&#40;</span><span class="kw3">int</span> index<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; listener.<span class="me1">onTap</span><span class="br0">&#40;</span>wi.<span class="me1">getContent</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">get</span><span class="br0">&#40;</span>index<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">return</span> <span class="kw2">super</span>.<span class="me1">onTap</span><span class="br0">&#40;</span>index<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> WikiItems wi<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> <span class="kw46">ArrayList</span> items<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> <span class="kw10">ActionListener</span> listener<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> WikiOverlay<span class="br0">&#40;</span>Drawable defaultMarker, WikiItems &nbsp;_wi, <span class="kw10">ActionListener</span> _listener<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">super</span><span class="br0">&#40;</span>defaultMarker<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">items = <span class="kw2">new</span> <span class="kw46">ArrayList</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">listener = _listener<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">wi = _wi<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">for</span><span class="br0">&#40;</span>WikiEntry we:wi.<span class="me1">getContent</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;GeoPoint g = <span class="kw2">new</span> GeoPoint<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">int</span><span class="br0">&#41;</span><span class="br0">&#40;</span>we.<span class="me1">getLat</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">*</span>1E6<span class="br0">&#41;</span>,<span class="br0">&#40;</span><span class="kw3">int</span><span class="br0">&#41;</span><span class="br0">&#40;</span>we.<span class="me1">getLng</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">*</span>1E6<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;OverlayItem oi = <span class="kw2">new</span> OverlayItem<span class="br0">&#40;</span>g,we.<span class="me1">getTitle</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,we.<span class="me1">getSummary</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;items.<span class="me1">add</span><span class="br0">&#40;</span>oi<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">populate<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">@<span class="kw21">Override</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">protected</span> OverlayItem createItem<span class="br0">&#40;</span><span class="kw3">int</span> i<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">return</span> items.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">@<span class="kw21">Override</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw3">int</span> size<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">return</span> items.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The WikiOverlay converts the WikiEntry items into the standard OverlayItem that MapView is expecting. Once the populate() method is called the MapView will render the map icons onto the map. Pay attention to the onTap method and ActionListener we will come back to them shortly.</p>
<p><strong>Special update ! Resources</strong> !</p>
<p>Android has a unique way of managing the resources in an application by creating the R.java file. This file provides a link between the physical resources on the disk and a way to access them from inside the code. This means no more complicated pulling from resource files to access images or properties files. Localization is handled automatically by populating different directory names(i.e. <em>res/values-fr/string.xml</em> for French).</p>
<p>Try copying this png <a title="Wiki Map Icon" href="http://www.2linessoftware.com/files/mapicon.png"><img src="http://www.2linessoftware.com/files/mapicon.png" alt="Wiki Map Icon" /></a>(<a title="Wiki Map Icon" href="http://www.2linessoftware.com/files/mapicon.png">Wiki Map Icon</a>) into the directory <em>res/drawable</em>. Now refresh/open the R.java file. You should see a line that looks something like this:</p>
<div class="geshi no java5">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">static</span> <span class="kw2">final</span> <span class="kw3">int</span> mapicon=0x7f020001<span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>That link is automatically generated and will give you access to the resource from any class and you can change it at anytime. Here is the relevant code snippet that access the mapicon png image and loads it into a Marker classfor display on the map.</p>
<div class="geshi no java5">
<ol>
<li class="li1">
<div class="de1">Drawable marker = getResources<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getDrawable</span><span class="br0">&#40;</span>R.<span class="me1">drawable</span>.<span class="me1">mapicon</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>This method of handling resources is used for strings, raw binary files (mp3s or mp4s), images and any other static file that is referenced by the code. It is a great way to handle configuration changes and localization in different devices. Again it shows a solid separation of graphic design from the programmers!.</p>
<p><span style="color: #ff0000;"><em>Step 4. Implement the </em><em>"Search For Wiki Entries" Button</em></span></p>
<p>The last step is to link the users request with the HTTP API call from the GeonameManager. We've implemented a button at the very beginning called <em>"Search For Wiki Entries"</em> that can be seen on the main page. We will use this button to send the HTTP request out.</p>
<p>In order to prevent the blocking operation on the main activity and effectively freeze the UI (and draw your users into a mad frenzy button mashing panic) we will create a worker thread running in the background to handle this. The worker thread will also turn on and off the waiting animation for the user.</p>
<p><em>Here is an important note: you cannot update a UI from any thread outside the main class where it was instantiated. That is; our background communications thread cannot make changes to the UI. In order to get around this Android includes a Handler class that queues requests in the main thread. Here is the code implemented at the start of WikiWhere class.</em></p>
<div class="geshi no java5">
<div class="head">private Handler handler = new Handler(){</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> <span class="kw3">void</span> handleMessage<span class="br0">&#40;</span>Message msg<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;dialog.<span class="me1">dismiss</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">if</span><span class="br0">&#40;</span>msg.<span class="me1">getData</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">containsKey</span><span class="br0">&#40;</span><span class="st0">&quot;error&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; showError<span class="br0">&#40;</span>msg.<span class="me1">getData</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getString</span><span class="br0">&#40;</span><span class="st0">&quot;error&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;mv.<span class="me1">invalidate</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p><em>To update our UI from the communications worker thread we post a Message to the handler. Since the handler runs in the main thread it can update the UI</em></p>
<p>The worker thread is implemented as an inner class in the WikiWhere main class. Here is the code for the worker thread:</p>
<div class="geshi no java5">
<div class="head">private class LoadingThread extends Thread{</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">private</span> GeonameManager gm<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">private</span> <span class="kw3">double</span> minLat<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">private</span> <span class="kw3">double</span> maxLat<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">private</span> <span class="kw3">double</span> minLng<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">private</span> <span class="kw3">double</span> maxLng<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> LoadingThread<span class="br0">&#40;</span><span class="kw3">double</span> _minLat,<span class="kw3">double</span> _maxLat,<span class="kw3">double</span> _minLng,<span class="kw3">double</span> _maxLng,GeonameManager _gm<span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;gm = _gm<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;minLat = _minLat<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;maxLat = _maxLat<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;minLng = _minLng<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;maxLng = _maxLng<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">public</span> <span class="kw3">void</span> run<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;gm.<span class="me1">readFromUrl</span><span class="br0">&#40;</span>minLat, maxLat, minLng, maxLng<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Finally we can call the thread by implenting the onClickListener for the button. So in the initMap() method we added the following code</p>
<div class="geshi no java5">
<div class="head">button = (Button) findViewById(R.id.search);</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; button.<span class="me1">setOnClickListener</span><span class="br0">&#40;</span><span class="kw2">new</span> OnClickListener<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">public</span> <span class="kw3">void</span> onClick<span class="br0">&#40;</span><span class="kw116">View</span> v<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;loadWiki<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
</ol>
</div>
<p>and also added a new method to instantiate the loading;</p>
<div class="geshi no java5">
<div class="head">private void loadWiki(){</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;dialog = <span class="kw2">new</span> ProgressDialog<span class="br0">&#40;</span><span class="kw2">this</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; dialog.<span class="me1">setTitle</span><span class="br0">&#40;</span><span class="st0">&quot;Wiki, Where&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; dialog.<span class="me1">setMessage</span><span class="br0">&#40;</span><span class="st0">&quot;Getting Wiki Data...&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; dialog.<span class="me1">setIndeterminate</span><span class="br0">&#40;</span><span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; dialog.<span class="me1">setCancelable</span><span class="br0">&#40;</span><span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; dialog.<span class="me1">show</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; GeoPoint center = mv.<span class="me1">getMapCenter</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw3">double</span> minLat = <span class="br0">&#40;</span><span class="kw3">double</span><span class="br0">&#41;</span><span class="br0">&#40;</span>center.<span class="me1">getLatitudeE6</span><span class="br0">&#40;</span><span class="br0">&#41;</span>-<span class="br0">&#40;</span>mv.<span class="me1">getLatitudeSpan</span><span class="br0">&#40;</span><span class="br0">&#41;</span>/<span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span> / 1E6<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">double</span> maxLat = <span class="br0">&#40;</span><span class="kw3">double</span><span class="br0">&#41;</span><span class="br0">&#40;</span>center.<span class="me1">getLatitudeE6</span><span class="br0">&#40;</span><span class="br0">&#41;</span>+<span class="br0">&#40;</span>mv.<span class="me1">getLatitudeSpan</span><span class="br0">&#40;</span><span class="br0">&#41;</span>/<span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span> / 1E6<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">double</span> minLng = <span class="br0">&#40;</span><span class="kw3">double</span><span class="br0">&#41;</span><span class="br0">&#40;</span>center.<span class="me1">getLongitudeE6</span><span class="br0">&#40;</span><span class="br0">&#41;</span>- <span class="br0">&#40;</span>mv.<span class="me1">getLongitudeSpan</span><span class="br0">&#40;</span><span class="br0">&#41;</span>/<span class="nu0">2</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> / 1E6<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">double</span> maxLng = <span class="br0">&#40;</span><span class="kw3">double</span><span class="br0">&#41;</span><span class="br0">&#40;</span>center.<span class="me1">getLongitudeE6</span><span class="br0">&#40;</span><span class="br0">&#41;</span>+ <span class="br0">&#40;</span>mv.<span class="me1">getLongitudeSpan</span><span class="br0">&#40;</span><span class="br0">&#41;</span>/<span class="nu0">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span> / 1E6<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;LoadingThread process = <span class="kw2">new</span> LoadingThread<span class="br0">&#40;</span>minLat,maxLat,minLng,maxLng,gm<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; process.<span class="me1">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Run the app again and click on the button. It should launch a dialog and load the wiki items near that map location.If everything goes right you should see the blue wiki icon on the map like this;</p>
<p><a title="Wiki Map View" href="http://www.2linessoftware.com/files/3-wikis.jpg"></a></p>
<p style="text-align: center"><a title="Wiki Map View" href="http://www.2linessoftware.com/files/3-wikis.jpg"><img src="http://www.2linessoftware.com/files/3-wikis.thumbnail.jpg" alt="Wiki Map View" /></a></p>
<p>Good app but let's add the last part to pull up information on that wiki locationin a separate web page.</p>
<p><strong>2:15 Final Steps</strong></p>
<p>The last step will involve listening for the user to click on a wiki item and display that wiki page to the user.</p>
<p>Remember back when we skipped over the ActionListener? Well, let's go back and add that interface into the WikiWhere class and extend the onTap() function;</p>
<div class="geshi no java5">
<div class="head">public class WikiWhere extends MapActivity implements LocationListener, GeonameListener, ActionListener {</pre>
</div>
<ol>
<li class="li1">
<div class="de1">Plus,</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>pre lang=<span class="st0">&quot;java5&quot;</span><span class="sy0">&gt;</span> &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">public</span> <span class="kw3">void</span> onTap<span class="br0">&#40;</span>WikiEntry we<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; mc.<span class="me1">animateTo</span><span class="br0">&#40;</span><span class="kw2">new</span> GeoPoint<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">int</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>we.<span class="me1">getLat</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">*</span> 1E6<span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw3">int</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>we.<span class="me1">getLng</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">*</span> 1E6<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">final</span> <span class="kw6">Dialog</span> dialog = <span class="kw2">new</span> <span class="kw6">Dialog</span><span class="br0">&#40;</span><span class="kw2">this</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; dialog.<span class="me1">setContentView</span><span class="br0">&#40;</span>R.<span class="me1">layout</span>.<span class="me1">web</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; dialog.<span class="me1">setTitle</span><span class="br0">&#40;</span>we.<span class="me1">getTitle</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; dialog.<span class="me1">setCancelable</span><span class="br0">&#40;</span><span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WebView web = <span class="br0">&#40;</span>WebView<span class="br0">&#41;</span> dialog.<span class="me1">findViewById</span><span class="br0">&#40;</span>R.<span class="me1">id</span>.<span class="me1">web</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; web.<span class="me1">loadUrl</span><span class="br0">&#40;</span>we.<span class="me1">getWikipediaUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; web.<span class="me1">setInitialScale</span><span class="br0">&#40;</span><span class="nu0">50</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; dialog.<span class="me1">show</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The onTap() method listens from the WikiOverlay and waits for a user to tap one of the OverlayItems. We overload this method with ActionListener and pass back the WikiEntry reference that was selected.<br />
This new method does a couple of things. First, it pans the map to center on the wiki location. Second, it launches a new WebView within a dialog. WebViews are fully functioning WebKit browser pages and essentially the same browser that is on the device. Simply by calling web.loadUrl() you can call up any web page and display it to the user.Â  This by itself is a fantastic tool for development.<br />
However, we will have to first create the layout resource XML file. Create a file called web.xml in the <em>res/layoutÂ </em>directory and add the following to it;</p>
<div class="geshi no xml">
<div class="head"><?xml version="1.0" encoding="utf-8"></div>
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;LinearLayout</span> <span class="re0">xmlns:android</span>=<span class="st0">&quot;http://schemas.android.com/apk/res/android&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">android:orientation</span>=<span class="st0">&quot;vertical&quot;</span> <span class="re0">android:layout_width</span>=<span class="st0">&quot;fill_parent&quot;</span></div>
</li>
<li class="li1">
<div class="de1">  <span class="re0">android:layout_height</span>=<span class="st0">&quot;fill_parent&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"> <span class="sc3"><span class="re1">&lt;WebView</span> <span class="re0">android:id</span>=<span class="st0">&quot;@+id/web&quot;</span> <span class="re0">android:layout_width</span>=<span class="st0">&quot;wrap_content&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="re0">android:layout_height</span>=<span class="st0">&quot;fill_parent&quot;</span> <span class="re0">android:padding</span>=<span class="st0">&quot;10px&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/LinearLayout<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p><strong>2:30pm We're Finished!</strong><br />
Congratulations you've just created your first app from scratch in less time than it takes to install a windows update.<br />
Download the full source code here:</p>
<p align="center"><a title="WikiWhere Source Code" href="http://www.2linessoftware.com/files/wikiwhere.zip">WikiWhere Source Code</a></p>
<p><strong>Bonus Points!</strong><br />
To truly see how powerful the application environment and tools are you will need a device.Â  Sign up to <a href="http://market.android.com" target="_blank">http://market.android.com</a> to become a registered developer. This gives you access to publish your applications and buy a development phone directly from Google. The phone is only $399USD but that doesn't include shipping and duty, which in some cases (Canada) can be over $250! Wait, what happend to NAFTA?<br />
Once you get your device simply install the USB drivers and plug in your phone. The drivers will immediately recognize it. Now when you click Run in Eclipse you can execute the program on the phone including all the debugging and monitoring tools. Completely seemless emulator and device testing environment. It's like having your cake (not a lie) and eating it too!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.2linessoftware.com/2009/01/21/programming-with-android-part-4-finishing-wikiwhere/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Programming with Android Part 3 &#8211; Building WikiWhere</title>
		<link>http://www.2linessoftware.com/2009/01/20/programming-with-android-part-3-building-wikiwhere/</link>
		<comments>http://www.2linessoftware.com/2009/01/20/programming-with-android-part-3-building-wikiwhere/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 02:55:00 +0000</pubDate>
		<dc:creator>john</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Programming Tip]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.2linessoftware.com/2009/01/20/programming-with-android-part-3-building-wikiwhere/</guid>
		<description><![CDATA[We will continue from where we left off in the last instalment and extend our basic application into a more useful application. If you are keeping track, we're an hour and fifteen minutes into our development and we have our application environment setup and ready to program in Android. Over the next hour we will [...]]]></description>
			<content:encoded><![CDATA[<p>We will continue from where we left off in the <a href="http://www.2linessoftware.com/2009/01/16/programming-with-android-part-2/">last instalment </a>and extend our basic application into a more useful application. If you are keeping track, we're an hour and fifteen minutes into our development and we have our application environment setup and ready to program in Android.</p>
<p>Over the next hour we will create an application that will show the wiki entries near our location, display that information on a map and embed the wiki page into the application. This application highlights three key features of the Android platform;</p>
<ol>
<li>Focus on LBS that makes locative media easier to produce.</li>
<li>Deep web integration from consuming web services to embedding web page.</li>
<li>Â Simple map integration via Google Maps.</li>
</ol>
<p><em>What is WikiWhere</em></p>
<p><em>WikiWhere is a buzzword-compliant mobile application that gives you access to local wiki knowledge where ever you are. Using your Android phone, WikiWhere searches wiki for entries near your location and passes that information to you. Discover your neighbourhood or visit others.Â </em></p>
<p><strong>1:20</strong> <strong>Back from Break. You aren't paid to sit there you know.</strong></p>
<p>We are now going to get started with the WikiWhere application. Let's go through the first step and create an application shell using the Eclipse project builder. Just as in the previous part, select <strong>File</strong> <strong>&gt;&gt; New Project &gt;&gt; Android Project </strong>to launch a new project. Add the details for WikiWhere. I've attached a screenshot of the details below.</p>
<p><a href="http://www.2linessoftware.com/files/3-newproject.jpg" title="WikiWhere Project Dialog"></a></p>
<p style="text-align: center"><a href="http://www.2linessoftware.com/files/3-newproject.jpg" title="WikiWhere Project Dialog"><img src="http://www.2linessoftware.com/files/3-newproject.thumbnail.jpg" alt="WikiWhere Project Dialog" /></a></p>
<p><em>Step 1. Create the MapView</em></p>
<p>The main user interface will be a MapView so we want to change the interface of our WikiWhere class from Activity to MapActivity and implement the onRouteDisplayed method.</p>
<div class="geshi no java5">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">package</span> demo.<span class="me1">WikiWhere</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">import</span> com.<span class="me1">google</span>.<span class="me1">android</span>.<span class="me1">maps</span>.<span class="me1">MapActivity</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">import</span> android.<span class="me1">app</span>.<span class="me1">Activity</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">import</span> android.<span class="me1">os</span>.<span class="me1">Bundle</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw2">class</span> WikiWhere <span class="kw2">extends</span> MapActivity <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw3">void</span> onCreate<span class="br0">&#40;</span>Bundle savedInstanceState<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">super</span>.<span class="me1">onCreate</span><span class="br0">&#40;</span>savedInstanceState<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; setContentView<span class="br0">&#40;</span>R.<span class="me1">layout</span>.<span class="me1">main</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span> &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw2">protected</span> <span class="kw3">boolean</span> isRouteDisplayed<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">return</span> <span class="kw4">false</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Next we have to implement the map in the view. Android separates the device layout / views from the source code to simplify development. A graphic designer can modify the XML layout without impacting the underlying source code. I'm a strong believer in letting programmers do the programming and not the UI or graphic design. Windows 3.1 was designed by programmers. Case closed.</p>
<p><span id="more-29"></span></p>
<p>The layouts are located in the <em>res/layout</em> folder in the project. We will edit the main.xml file and replace it with the following code:</p>
<div class="geshi no java5">
<ol>
<li class="li1">
<div class="de1"><span class="sy0">&lt;?</span>xml version=<span class="st0">&quot;1.0&quot;</span> encoding=<span class="st0">&quot;utf-8&quot;</span><span class="sy0">?&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>RelativeLayout xmlns:android=<span class="st0">&quot;http://schemas.android.com/apk/res/android&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; android:orientation=<span class="st0">&quot;vertical&quot;</span> android:layout_width=<span class="st0">&quot;fill_parent&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;   android:layout_height=<span class="st0">&quot;fill_parent&quot;</span><span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>Button android:id=<span class="st0">&quot;@+id/search&quot;</span> android:layout_width=<span class="st0">&quot;fill_parent&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; android:layout_height=<span class="st0">&quot;wrap_content&quot;</span> android:text=<span class="st0">&quot;Search For Wiki Entries&quot;</span>/<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>com.<span class="me1">google</span>.<span class="me1">android</span>.<span class="me1">maps</span>.<span class="me1">MapView</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;  android:id=<span class="st0">&quot;@+id/map&quot;</span> android:layout_width=<span class="st0">&quot;fill_parent&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;  android:layout_height=<span class="st0">&quot;wrap_content&quot;</span> android:layout_below=<span class="st0">&quot;@+id/search&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;android:apiKey=<span class="st0">&quot;&lt;strong&gt;YOUR-GOOGLE-MAPS-API-KEY&lt;/strong&gt;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;  android:enabled=<span class="st0">&quot;true&quot;</span> android:clickable=<span class="st0">&quot;true&quot;</span>/<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>LinearLayout android:id=<span class="st0">&quot;@+id/zoom_holder&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;android:layout_width=<span class="st0">&quot;fill_parent&quot;</span> android:layout_height=<span class="st0">&quot;fill_parent&quot;</span></div>
</li>
<li class="li1">
<div class="de1">  &nbsp; &nbsp; &nbsp;  android:gravity=<span class="st0">&quot;bottom|center_horizontal&quot;</span> /<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&lt;</span>/RelativeLayout<span class="sy0">&gt;</span></div>
</li>
</ol>
</div>
<p>This layout file adds three components. At the top will be a button to search for wiki entries. The main view is a Google Maps view. And finally, the bottom component is a holder for the zoom in/out control on the map. You will have to apply for your own Google Maps key and you can do that from this <a href="http://code.google.com/android/toolbox/apis/mapkey.html" target="_blank">site </a></p>
<p><em>Step 2. Permissions</em></p>
<p>The next step is to tell Android that we need access to the maps library and permission to access the internet from the device. All the configurations is located in the AndroidManifest.xml file. This file controls all the permissions and OS access for the application. It would be worth your while to become very familiar with that file. The Android/Eclipse toolkit provides a graphical interface to simplify the editing of the file. Personally, I prefer to use the raw xml (click on the far right tab when in the graphical interface) but really its up to you.</p>
<p>The first step is to add the library to the application.  Add the &lt;uses-library tag after the activity tag and before the application tag. Like this;</p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;/activity<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;uses-library</span> <span class="re0">android:name</span>=<span class="st0">&quot;com.google.android.maps&quot;</span><span class="re2">&gt;</span></span><span class="sc3"><span class="re1">&lt;/uses-library<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;application</span><span class="re2">/&gt;</span></span></div>
</li>
</ol>
</div>
<p>Next, we will add the  permissions to the file:</p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1">..<span class="sc3"><span class="re1">&lt;/application<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;uses-permission</span> <span class="re0">android:name</span>=<span class="st0">&quot;android.permission.INTERNET&quot;</span><span class="re2">&gt;</span></span><span class="sc3"><span class="re1">&lt;/uses-permission<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>This is all the changes that need to occur to get a MapView running on the device. If you setup a <strong>Run Configuration</strong> identical to Part 2 and run the application in the emulator you should see this;</p>
<p align="center"><a href="http://www.2linessoftware.com/files/3-main.jpg" title="WikiWhere Map View"><img src="http://www.2linessoftware.com/files/3-main.thumbnail.jpg" alt="WikiWhere Map View" /></a></p>
<p align="left">That's it for adding a draggable map into your application. Click and drag the map around.</p>
<p align="left"><em>Step 3. Adding Extra Components</em></p>
<p align="left">As a final step we will add a zoom button and center the map on a closer area. Add this code to your WikiWhere.java file;</p>
<div class="geshi no java5">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">private</span> <span class="kw3">double</span> START_LAT = <span class="nu0">51.066832</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> <span class="kw3">double</span> START_LNG =<span class="nu0">-114.086108</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> <span class="kw3">int</span> START_ZOOM = <span class="nu0">15</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> MapController mc<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> MapView mv<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> <span class="kw116">View</span> zoomView<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw3">void</span> onCreate<span class="br0">&#40;</span>Bundle savedInstanceState<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">super</span>.<span class="me1">onCreate</span><span class="br0">&#40;</span>savedInstanceState<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setContentView<span class="br0">&#40;</span>R.<span class="me1">layout</span>.<span class="me1">main</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;initMap<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> <span class="kw3">void</span> initMap<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mv = <span class="br0">&#40;</span>MapView<span class="br0">&#41;</span>findViewById<span class="br0">&#40;</span>R.<span class="me1">id</span>.<span class="me1">map</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mc = mv.<span class="me1">getController</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  <span class="co1">// Initialise the map</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mc.<span class="me1">setZoom</span><span class="br0">&#40;</span>START_ZOOM<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mc.<span class="me1">setCenter</span><span class="br0">&#40;</span><span class="kw2">new</span> GeoPoint<span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">int</span><span class="br0">&#41;</span><span class="br0">&#40;</span>START_LAT<span class="sy0">*</span>1E6<span class="br0">&#41;</span>,<span class="br0">&#40;</span><span class="kw3">int</span><span class="br0">&#41;</span><span class="br0">&#40;</span>START_LNG<span class="sy0">*</span>1E6<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mv.<span class="me1">setSatellite</span><span class="br0">&#40;</span><span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mv.<span class="me1">setStreetView</span><span class="br0">&#40;</span><span class="kw4">false</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;LinearLayout zoom = <span class="br0">&#40;</span>LinearLayout<span class="br0">&#41;</span>findViewById<span class="br0">&#40;</span>R.<span class="me1">id</span>.<span class="me1">zoom_holder</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;zoomView = mv.<span class="me1">getZoomControls</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;zoomView.<span class="me1">setLayoutParams</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">new</span> ViewGroup.<span class="me1">LayoutParams</span><span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ViewGroup.<span class="me1">LayoutParams</span>.<span class="me1">WRAP_CONTENT</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ViewGroup.<span class="me1">LayoutParams</span>.<span class="me1">WRAP_CONTENT</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;zoom.<span class="me1">addView</span><span class="br0">&#40;</span>zoomView<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mv.<span class="me1">displayZoomControls</span><span class="br0">&#40;</span><span class="kw4">true</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p align="left">This adds a zoom panel at the bottom, centers the map on a location (Kits Bar in Calgary, AB. home to <a href="http://mobilemondaycalgary.ning.com/" target="_blank">MobileMonday Calgary</a> every month) and adds a satellite overview to the map. Go ahead run the app again. Pretty cool, huh?</p>
<p align="left"><!--more--></p>
<p align="left"><strong>1:40 Accessing the On-Device Location</strong></p>
<p align="left">This next section deals with getting the devices current location from GPS. Android provides a simple interface through the LocationManager to get the location. <em>An important differentiator of the LocationManager is that it listens to the location stream and therefore allows many applications to access the GPS on the device. </em>Many other GPS implementations on mobile devices don't allow multiple applications to access the location. This is a major drawback to running background applications since the OS would dictate which applications receive the location and which ones are stopped. This architecture also means that the time for a location fix is drastically reduced in the device. I will be writing an article outlining the importance of this architecture in an upcoming article on the Android GPS accuracy.</p>
<p align="left">Either way, back to WikiWhere. Androids permission scheme requires that the permissions for GPS and in fact all location types be entered into the AndroidManifest.xml first.</p>
<p align="left">Add the following lines under the other &lt;uses-permissions tag from the previous section:</p>
<div class="geshi no xml">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;uses-permission</span> <span class="re0">android:name</span>=<span class="st0">&quot;android.permission.ACCESS_COARSE_LOCATION&quot;</span><span class="re2">&gt;</span></span><span class="sc3"><span class="re1">&lt;/uses-permission<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;uses-permission</span> <span class="re0">android:name</span>=<span class="st0">&quot;android.permission.ACCESS_FINE_LOCATION&quot;</span><span class="re2">&gt;</span></span><span class="sc3"><span class="re1">&lt;/uses-permission<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;uses-permission</span> <span class="re0">android:name</span>=<span class="st0">&quot;android.permission.ACCESS_MOCK_LOCATION&quot;</span><span class="re2">&gt;</span></span><span class="sc3"><span class="re1">&lt;/uses-permission<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p align="left">As I mentionned above the GPS is pushed through a LocationListener. We will be implementing that interface in the WikiWhere class and extending the LocationListener methods in the code.</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">public</span> <span class="kw2">class</span> WikiWhere <span class="kw2">extends</span> MapActivity <span class="kw2">implements</span> LocationListener <span class="br0">&#123;</span></div>
</li>
</ol>
</div>
<p>Initializing the LocationManager is done by calling requestLocationUpdates</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">private</span> LocationManager lm<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> MyLocationOverlay lo<span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw4">void</span> onCreate<span class="br0">&#40;</span>Bundle savedInstanceState<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">super</span>.<span class="me1">onCreate</span><span class="br0">&#40;</span>savedInstanceState<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setContentView<span class="br0">&#40;</span>R.<span class="me1">layout</span>.<span class="me1">main</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;initMap<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;initLocation<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">private</span> <span class="kw4">void</span> initLocation<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;lm= <span class="br0">&#40;</span>LocationManager<span class="br0">&#41;</span> <span class="kw2">this</span>.<span class="me1">getSystemService</span><span class="br0">&#40;</span>LOCATION_SERVICE<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;lm.<span class="me1">requestLocationUpdates</span><span class="br0">&#40;</span>LocationManager.<span class="me1">GPS_PROVIDER</span>, <span class="nu0">5000</span>, <span class="nu0">500</span>, <span class="kw2">this</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>The requestLocationUpdates allows you to tailor your listener so you only get updates when a user has moved a certain distance and/or a certain time has passed. In our example above we are getting locations every 5 seconds (5000 ms) or when the user moves more than 500m. Location objects will be pushed to the onLocationChangedMethod whenever updates are available.</p>
<p>For the next part we will create an Overlay to display the users position. Overlays are Androids way of handle icons on a map. There is a default overlay called MyLocationOverlay that is specifically designed to handle the users location updates from GPS. If you were so inclined feel free to write your own map Overlay for the users locations. (We will be doing that later for the Wiki Points).</p>
<div class="geshi no java">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">public</span> <span class="kw4">void</span> onLocationChanged<span class="br0">&#40;</span>Location location<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">List</span> overlays = mv.<span class="me1">getOverlays</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;lo = <span class="kw2">new</span> MyLocationOverlay<span class="br0">&#40;</span><span class="kw2">this</span>,mv<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;overlays.<span class="me1">add</span><span class="br0">&#40;</span>lo<span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;lo.<span class="me1">enableMyLocation</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>That code will update the location and display it on the map. Save and run the application on the emulator.</p>
<p>The first thing you will notice is that there is no flashing blue icon on the map. That is because no location has been sent to the emulator. The Android SDK provides a toolkit to help you out here. Select <strong>Window&gt;&gt;Open Perspective&gt;&gt;DDMS</strong> (You may have to click other and browse for it, if it isn't there). This perspective gives you a large collection of tools to help optimize, debug and monitor applications on the emulator (and devices!). Under the <strong>Emulator Control</strong> tab scroll down until you see the Location Controls.</p>
<p align="center"><a href="http://www.2linessoftware.com/files/3-gpsdata.jpg" title="DDMS Location Controls"><img src="http://www.2linessoftware.com/files/3-gpsdata.thumbnail.jpg" alt="DDMS Location Controls" /></a></p>
<p>Â ThisÂ  control allows you to push one location or a series of locations in GPX or KML format. A fantastic tool for testing applications. Enter the latitude and longitude into the box and click send. This will simulate a GPS location coming into the device and you should immediately see the flashing blue icon in your emulator.</p>
<p align="center"><a href="http://www.2linessoftware.com/files/3-mylocation.jpg" title="Showing My Location"><img src="http://www.2linessoftware.com/files/3-mylocation.thumbnail.jpg" alt="Showing My Location" /></a></p>
<p align="left">Locations are automatically updated everytime you move. Try playing around with the DDMS Location Control and see how it moves your position around dynamically.</p>
<p align="left">Â That is it for the first part of WikiWhere. In the next part we will learn how to call web services, simple parsing of XML and of course the WebView. See you then!</p>
<p align="left">&nbsp;</p>
<p align="left"><a href="http://www.2linessoftware.com/2009/01/21/programming-with-android-part-4-finishing-wikiwhere/">Â Final Part</a></p>
<p align="left">&nbsp;</p>
<blockquote></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.2linessoftware.com/2009/01/20/programming-with-android-part-3-building-wikiwhere/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
	</channel>
</rss>

