<?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; wikiwhere</title>
	<atom:link href="http://www.2linessoftware.com/tag/wikiwhere/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>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>
	</channel>
</rss>

