Android-skolen del 3: Snak satellitter og Google-kort med den grønne robot

27. november 2009 kl. 16:0019
Android-skolen del 3: Snak satellitter og Google-kort med den grønne robot
Illustration: Picasa 3.0.
Så er det atter tid til at knække leddene i programmørfingrene og skrive en portion Android-kode. Tredje lektion splejser Google Maps og GPS i en kort-applikation.
Artiklen er ældre end 30 dage

Velkommen til tredje undervisningstime i Version2's Android-skole, hvor vi får Google Maps og telefonens indbyggede GPS til at spille sammen i en simpel kort-applikation.

I denne tredje lektion er det slut med at arbejde indenfor de trygge rammer af Android-emulatoren ? nu er det den virkelige verdens Android-telefon, der skal frem på bordet og sluttes til udvikler-pc'en.

Denne uges gæsteunderviser er softwareudvikler Mikkel Bruun, der blandt andet står bag applikationen iTog til både iPhone og Android.

Mikkel Bruun bruger GPS'en til at bestemme togpassagerens aktuelle position for at kunne levere data om næste station på vejen og afgangene derfra.

Artiklen fortsætter efter annoncen

Hvis ikke du kan komme i nærheden af en Android-telefon med version 1.6 af styresystemet, kan du dog sagtens læse videre alligevel.

Det kan nemlig lade sig gøre at skrive en applikation til Android-emulatoren, der simulerer satellit-kommunikation med 'falske' GPS-data. Du vil dog være lidt mere på egen hånd i den del af lektionen, der handler om at hive data ind fra GPS'en, hvis ikke du ejer en telefon.

Vi lægger ud med at skrive en simpel applikation, der viser Eiffeltårnet i Paris på et Google-kort ud fra et sæt statiske koordinater.

1) De indledende knæbøjninger ? Google API'er og hul igennem til telefonen.

Start Eclipse.

Artiklen fortsætter efter annoncen

Allerførst skal du sikre dig, at du har installeret de såkaldte Google API'er. Åbn AVD-manageren i Eclipse - det lille, sorte mobiltelefon-ikon i menu-linjen ? og tjek punktet Available Packages.

Fold træet ud i feltet til højre. Hvis du har mulighed for at installere Google API'erne, skal du gøre det nu.

Når installationen er færdig, skal vi sikre os, at der er hul igennem til vores telefon, så vi kan bruge den i stedet for Android-emulatoren.

På din Android-telefon vælges Indstillinger -> Programmer -> Udvikling , hvor USB-fejlretning slås til med et flueben. Når du er i gang, kan du lige så godt sikre, at GPS er slået til under Indstillinger -> Lokalitet -> Aktiver GPS-satellitter.

Artiklen fortsætter efter annoncen

På udviklingsmaskinen skal vi sørge for, at telefonen genkendes som et 'running Android device', når vi skal lægge applikationen over på telefonen.

På Windows-platformen gøres det ved at installere en USB-driver fra http://developer.android.com/sdk/win-usb.html.

Er man Mac-ejer, skulle man kunne læne sig tilbage uden at pille ved indstillingerne.

Linux-folket skal sætte en lille USB-regel op og ændre lidt rettigheder, hvilket også står beskrevet på http://developer.android.com/sdk/win-usb.html.

I Eclipse angiver vi nu under Run -> Run configurations..., at vi gerne vil kunne vælge vores target manuelt, når vi kører Android-applikationen. Det giver os mulighed for at vælge vores Android-telefon i stedet for emulatoren.

Vælg Manual under fanebladet Target og gem ændringen.

2) Bliv dus med Google Maps

Nu er vi klar til at skrive første udgave af vores kortapplikation, der viser Eiffeltårnet i Paris ud fra statiske koordinater. Det udvider vi senere med rigtige koordinater fra telefonens GPS.

Opret et Android-projekt i Eclipse ganske som du plejer. Vælg Google API's version 1.6 og navngiv som vist på billedet, eller efter eget valg.

Vi begynder med at sætte klassen AndroidSkolenDel3 til at arve fra MapActivity i stedet for Activity. Det gør samtidig, at vi skal implementere metoden isRouteDisplayed(), hvilket Eclipse kan gøre for os. Lad metoden stå tom.

Koden ser nu ud som følger:

  1. <head>
  2. <title></title>
  3. <style type="text/css">
  4. <!--code { font-family: Courier New, Courier; font-size: 9pt; margin: 0px; }-->
  5. </style>
  6. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  7. </head><body>
  8.  
  9.  
  10. <!-- ======================================================== -->
  11. <!-- = Java Sourcecode to HTML automatically converted code = -->
  12. <!-- = Java2Html Converter 5.0 [2006-03-04] by Markus Gebhard markus@jave.de = -->
  13. <!-- = Further information: http://www.java2html.de = -->
  14. <div align="left" class="java">
  15. <table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
  16. <tr>
  17. <!-- start source code -->
  18. <td nowrap="nowrap" valign="top" align="left">
  19. <code>
  20. <font color="#808080">01</font> <font color="#3f5fbf">/** Called when the activity is first created. */</font>
  21.  
  22. <font color="#808080">02</font> <font color="#ffffff">    </font><font color="#646464">@Override</font>
  23.  
  24. <font color="#808080">03</font> <font color="#ffffff">    </font><font color="#7f0055">**public **</font><font color="#7f0055">**void **</font><font color="#000000">onCreate</font><font color="#000000">(</font><font color="#000000">Bundle savedInstanceState</font><font color="#000000">) {</font>
  25.  
  26. <font color="#808080">04</font> <font color="#ffffff">        </font><font color="#7f0055">**super**</font><font color="#000000">.onCreate</font><font color="#000000">(</font><font color="#000000">savedInstanceState</font><font color="#000000">)</font><font color="#000000">;</font>
  27.  
  28. <font color="#808080">05</font> <font color="#ffffff">        </font><font color="#000000">setContentView</font><font color="#000000">(</font><font color="#000000">R.layout.main</font><font color="#000000">)</font><font color="#000000">;</font>
  29.  
  30. <font color="#808080">06</font> <font color="#ffffff">    </font><font color="#000000">}</font>
  31.  
  32. <font color="#808080">07</font> <font color="#ffffff"></font>
  33.  
  34. <font color="#808080">08</font> <font color="#ffffff">  </font><font color="#646464">@Override</font>
  35.  
  36. <font color="#808080">09</font> <font color="#ffffff">  </font><font color="#7f0055">**protected **</font><font color="#7f0055">**boolean **</font><font color="#000000">isRouteDisplayed</font><font color="#000000">() {</font>
  37.  
  38. <font color="#808080">10</font> <font color="#ffffff">    </font><font color="#3f7f5f">// TODO Auto-generated method stub</font>
  39.  
  40. <font color="#808080">11</font> <font color="#ffffff">    </font><font color="#7f0055">**return false**</font><font color="#000000">;</font>
  41.  
  42. <font color="#808080">12</font> <font color="#ffffff">  </font><font color="#000000">}</font></code>
  43.  
  44. </td>
  45. <!-- end source code -->
  46. </tr>
  47. </table>
  48. </div>
  49. <!-- = END of automatically generated HTML code = -->
  50. <!-- ======================================================== -->
  51.  
  52.  
  53. </body>

Vi har nu selve strukturen for vores første, simple applikation. Vi lader filen AndroidSkolenDel3.java stå et øjeblik og retter opmærksomheden mod main.xml, der ligger i projektundermappen res/layout/.

Ryd det autogenererede LinearLayout i main.xml og erstat det med:

  1. <head>
  2. <title></title>
  3. <style type="text/css">
  4. <!--code { font-family: Courier New, Courier; font-size: 9pt; margin: 0px; }-->
  5. </style>
  6. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  7. </head><body>
  8.  
  9.  
  10. <!-- ======================================================== -->
  11. <!-- = Java Sourcecode to HTML automatically converted code = -->
  12. <!-- = Java2Html Converter 5.0 [2006-03-04] by Markus Gebhard markus@jave.de = -->
  13. <!-- = Further information: http://www.java2html.de = -->
  14. <div align="left" class="java">
  15. <table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
  16. <tr>
  17. <!-- start source code -->
  18. <td nowrap="nowrap" valign="top" align="left">
  19. <code>
  20. <font color="#808080">01</font> <font color="#000000"><LinearLayout xmlns:android=</font><font color="#2a00ff">"http://schemas.android.com/apk/res/android"</font>
  21.  
  22. <font color="#808080">02</font> <font color="#ffffff">    </font><font color="#000000">android:orientation=</font><font color="#2a00ff">"vertical"</font>
  23.  
  24. <font color="#808080">03</font> <font color="#ffffff">    </font><font color="#000000">android:layout_width=</font><font color="#2a00ff">"fill_parent"</font>
  25.  
  26. <font color="#808080">04</font> <font color="#ffffff">    </font><font color="#000000">android:layout_height=</font><font color="#2a00ff">"fill_parent"</font>
  27.  
  28. <font color="#808080">05</font> <font color="#ffffff">    </font><font color="#000000">></font>
  29.  
  30. <font color="#808080">06</font> <font color="#ffffff">    </font>
  31.  
  32. <font color="#808080">07</font> <font color="#000000"><com.google.android.maps.MapView </font>
  33.  
  34. <font color="#808080">08</font> <font color="#ffffff">    </font><font color="#000000">android:id=</font><font color="#2a00ff">"@+id/mapview1"</font>
  35.  
  36. <font color="#808080">09</font> <font color="#ffffff">    </font><font color="#000000">android:layout_width=</font><font color="#2a00ff">"fill_parent" </font>
  37.  
  38. <font color="#808080">10</font> <font color="#ffffff">    </font><font color="#000000">android:layout_height=</font><font color="#2a00ff">"fill_parent" </font>
  39.  
  40. <font color="#808080">11</font> <font color="#ffffff">    </font><font color="#000000">android:enabled=</font><font color="#2a00ff">"true" </font>
  41.  
  42. <font color="#808080">12</font> <font color="#ffffff">    </font><font color="#000000">android:clickable=</font><font color="#2a00ff">"true" </font>
  43.  
  44. <font color="#808080">13</font> <font color="#ffffff">    </font><font color="#000000">android:apiKey=</font><font color="#2a00ff">"api_key_here" </font><font color="#000000">/> </font>
  45.  
  46. <font color="#808080">14</font> <font color="#000000"></LinearLayout></font></code>
  47.  
  48. </td>
  49. <!-- end source code -->
  50. </tr>
  51. </table>
  52. </div>
  53. <!-- = END of automatically generated HTML code = -->
  54. <!-- ======================================================== -->
  55.  
  56.  
  57. </body>

Koden fortæller Android, at vi gerne vil oprette et MapView og lægge et Google Maps-kort ind i det.

Læg mærke til linje 13

android:apiKey="api_key_here"

, hvor vi skal erstatte værdien api_key_here med en rigtig Google Maps-nøgle, der angiver, at du er godkendt til at bruge Google Maps-tjenesten.

Detaljerne findes her http://code.google.com/android/add-ons/google-apis/mapkey.html, men pointen er, at du skal have genereret en nøgle ud fra et MD5 fingerprint.

MD5 fingerprint'et hentes fra en kommandoprompt under Windows eller terminal under Mac OS X eller Linux ved at udføre kommandoen:

keytool -list -alias androiddebugkey -storepass android -keypass android -key store debug.keystore

fra biblioteket .android (bemærk punktummet), der for alle platformes vedkommende ligger i roden af bruger-biblioteket (f.eks. /home/'brugernavn'/.android under Linux).

Herefter kommer vores MD5 fingerprint til syne, som du skal kopiere og indsætte i feltet på siden http://code.google.com/android/add-ons/google-apis/maps-api-signup.html

Nu har du din Google Maps-nøgle, som skal indsættes i main.xml som vist tidligere.

Gå tilbage til AndroidSkolenDel3.java. Her skal vi nu hente et kort frem og bede om at få det vist i vores MapView.

Det hele sker i metoden onCreate:

  1. <head>
  2. <title></title>
  3. <style type="text/css">
  4. <!--code { font-family: Courier New, Courier; font-size: 9pt; margin: 0px; }-->
  5. </style>
  6. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  7. </head><body>
  8.  
  9.  
  10. <!-- ======================================================== -->
  11. <!-- = Java Sourcecode to HTML automatically converted code = -->
  12. <!-- = Java2Html Converter 5.0 [2006-03-04] by Markus Gebhard markus@jave.de = -->
  13. <!-- = Further information: http://www.java2html.de = -->
  14. <div align="left" class="java">
  15. <table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
  16. <tr>
  17. <!-- start source code -->
  18. <td nowrap="nowrap" valign="top" align="left">
  19. <code>
  20. <font color="#808080">01</font>     <font color="#7f0055">**private **</font><font color="#000000">MapView mapView;</font>
  21.  
  22. <font color="#808080">02</font> <font color="#ffffff">    </font><font color="#7f0055">**private **</font><font color="#000000">MapController mc;</font>
  23.  
  24. <font color="#808080">03</font> <font color="#ffffff">  </font>
  25.  
  26. <font color="#808080">04</font> <font color="#ffffff">    </font><font color="#7f0055">**public **</font><font color="#7f0055">**void **</font><font color="#000000">onCreate</font><font color="#000000">(</font><font color="#000000">Bundle savedInstanceState</font><font color="#000000">) {</font>
  27.  
  28. <font color="#808080">05</font> <font color="#ffffff">        </font><font color="#7f0055">**super**</font><font color="#000000">.onCreate</font><font color="#000000">(</font><font color="#000000">savedInstanceState</font><font color="#000000">)</font><font color="#000000">;</font>
  29.  
  30. <font color="#808080">06</font> <font color="#ffffff">        </font><font color="#000000">setContentView</font><font color="#000000">(</font><font color="#000000">R.layout.main</font><font color="#000000">)</font><font color="#000000">;</font>
  31.  
  32. <font color="#808080">07</font> <font color="#ffffff">        </font>
  33.  
  34. <font color="#808080">08</font> <font color="#ffffff">        </font><font color="#000000">mapView = </font><font color="#000000">(</font><font color="#000000">MapView</font><font color="#000000">) </font><font color="#000000">findViewById</font><font color="#000000">(</font><font color="#000000">R.id.mapview1</font><font color="#000000">)</font><font color="#000000">;</font>
  35.  
  36. <font color="#808080">09</font> <font color="#ffffff">        </font><font color="#000000">mc = mapView.getController</font><font color="#000000">()</font><font color="#000000">;</font>
  37.  
  38. <font color="#808080">10</font> <font color="#ffffff">             </font>
  39.  
  40. <font color="#808080">11</font> <font color="#ffffff">        </font><font color="#000000">GeoPoint p = </font><font color="#7f0055">**new **</font><font color="#000000">GeoPoint</font><font color="#000000">(</font>
  41.  
  42. <font color="#808080">12</font> <font color="#ffffff">            </font><font color="#000000">(</font><font color="#7f0055">**int**</font><font color="#000000">) (</font><font color="#990000">48.8583 </font><font color="#000000">* </font><font color="#990000">1</font><font color="#000000">E6</font><font color="#000000">)</font><font color="#000000">, </font>
  43.  
  44. <font color="#808080">13</font> <font color="#ffffff">            </font><font color="#000000">(</font><font color="#7f0055">**int**</font><font color="#000000">) (</font><font color="#990000">2.2945 </font><font color="#000000">* </font><font color="#990000">1</font><font color="#000000">E6</font><font color="#000000">))</font><font color="#000000">;</font>
  45.  
  46. <font color="#808080">14</font> <font color="#ffffff"></font>
  47.  
  48. <font color="#808080">15</font> <font color="#ffffff">        </font><font color="#000000">mc.animateTo</font><font color="#000000">(</font><font color="#000000">p</font><font color="#000000">)</font><font color="#000000">;</font>
  49.  
  50. <font color="#808080">16</font> <font color="#ffffff">        </font><font color="#000000">mc.setZoom</font><font color="#000000">(</font><font color="#990000">17</font><font color="#000000">)</font><font color="#000000">; </font>
  51.  
  52. <font color="#808080">17</font> <font color="#ffffff">        </font><font color="#000000">mapView.setSatellite</font><font color="#000000">(</font><font color="#7f0055">**true**</font><font color="#000000">)</font><font color="#000000">;</font>
  53.  
  54. <font color="#808080">18</font> <font color="#ffffff">        </font><font color="#000000">mapView.invalidate</font><font color="#000000">()</font><font color="#000000">;</font>
  55.  
  56. <font color="#808080">19</font> <font color="#ffffff">    </font><font color="#000000">}</font></code>
  57.  
  58. </td>
  59. <!-- end source code -->
  60. </tr>
  61. </table>
  62. </div>
  63. <!-- = END of automatically generated HTML code = -->
  64. <!-- ======================================================== -->
  65.  
  66.  
  67. </body>

Først sætter vi et MapView, mapView, op, som bruges til visning af selve kortet. Herefter henter vi en map controller, mc, som bruges til at håndtere panorering og zoom på selve kortet. (linje 8-9)

Vi opretter efterfølgende et såkaldt GeoPoint ud fra de decimale koordinater på Eiffeltårnet i Paris og beder derefter map controller'en om at vise lokationen og sætte et fornuftigt zoom-niveau som standard. (linje 11-16)

Til sidst beder vi vores MapView om at sætte satellitvisning til, så vi får lagt satellit-billeder på kortet, og sætter kortet til at tegne med invalidate()-metoden. (linje 17-18)

Inden vi kan lægge programmet op på telefonen, skal vi som et sidste punkt bede vores AndroidManifest.xml om at bruge Google Maps og samtidig give os lov til at benytte dataforbindelsen på telefonen til at hente kort ned fra nettet.

Det gøres ved at tilføje:

  1. <head>
  2. <title></title>
  3. <style type="text/css">
  4. <!--code { font-family: Courier New, Courier; font-size: 9pt; margin: 0px; }-->
  5. </style>
  6. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  7. </head><body>
  8.  
  9.  
  10. <!-- ======================================================== -->
  11. <!-- = Java Sourcecode to HTML automatically converted code = -->
  12. <!-- = Java2Html Converter 5.0 [2006-03-04] by Markus Gebhard markus@jave.de = -->
  13. <!-- = Further information: http://www.java2html.de = -->
  14. <div align="left" class="java">
  15. <table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
  16. <tr>
  17. <!-- start source code -->
  18. <td nowrap="nowrap" valign="top" align="left">
  19. <code>
  20. <font color="#000000"><uses-library android:name=</font><font color="#2a00ff">"com.google.android.maps" </font><font color="#000000">/></font></code>
  21.  
  22. </td>
  23. <!-- end source code -->
  24. </tr>
  25. </table>
  26. </div>
  27. <!-- = END of automatically generated HTML code = -->
  28. <!-- ======================================================== -->
  29.  
  30.  
  31. </body>

som et tag under application-tag'et. Derefter tilføjer vi

  1. <head>
  2. <title></title>
  3. <style type="text/css">
  4. <!--code { font-family: Courier New, Courier; font-size: 9pt; margin: 0px; }-->
  5. </style>
  6. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  7. </head><body>
  8.  
  9.  
  10. <!-- ======================================================== -->
  11. <!-- = Java Sourcecode to HTML automatically converted code = -->
  12. <!-- = Java2Html Converter 5.0 [2006-03-04] by Markus Gebhard markus@jave.de = -->
  13. <!-- = Further information: http://www.java2html.de = -->
  14. <div align="left" class="java">
  15. <table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
  16. <tr>
  17. <!-- start source code -->
  18. <td nowrap="nowrap" valign="top" align="left">
  19. <code>
  20. <font color="#ffffff">  </font><font color="#000000"><uses-permission android:name=</font><font color="#2a00ff">"android.permission.INTERNET"</font><font color="#000000">></uses-permission></font></code>
  21.  
  22. </td>
  23. <!-- end source code -->
  24. </tr>
  25. </table>
  26. </div>
  27. <!-- = END of automatically generated HTML code = -->
  28. <!-- ======================================================== -->
  29.  
  30.  
  31. </body>

som et tag under manifest-tag'et. Dermed kommer manifest-filen til at tage sig ud som følger:

  1. <head>
  2. <title></title>
  3. <style type="text/css">
  4. <!--code { font-family: Courier New, Courier; font-size: 9pt; margin: 0px; }-->
  5. </style>
  6. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  7. </head><body>
  8.  
  9.  
  10. <!-- ======================================================== -->
  11. <!-- = Java Sourcecode to HTML automatically converted code = -->
  12. <!-- = Java2Html Converter 5.0 [2006-03-04] by Markus Gebhard markus@jave.de = -->
  13. <!-- = Further information: http://www.java2html.de = -->
  14. <div align="left" class="java">
  15. <table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
  16. <tr>
  17. <!-- start source code -->
  18. <td nowrap="nowrap" valign="top" align="left">
  19. <code>
  20. <font color="#808080">01</font> <font color="#000000"><?xml version=</font><font color="#2a00ff">"1.0" </font><font color="#000000">encoding=</font><font color="#2a00ff">"utf-8"</font><font color="#000000">?></font>
  21.  
  22. <font color="#808080">02</font> <font color="#000000"><manifest xmlns:android=</font><font color="#2a00ff">"http://schemas.android.com/apk/res/android"</font>
  23.  
  24. <font color="#808080">03</font> <font color="#ffffff">      </font><font color="#7f0055">**package**</font><font color="#000000">=</font><font color="#2a00ff">"dk.version2.as27"</font>
  25.  
  26. <font color="#808080">04</font> <font color="#ffffff">      </font><font color="#000000">android:versionCode=</font><font color="#2a00ff">"1"</font>
  27.  
  28. <font color="#808080">05</font> <font color="#ffffff">      </font><font color="#000000">android:versionName=</font><font color="#2a00ff">"1.0"</font><font color="#000000">></font>
  29.  
  30. <font color="#808080">06</font> <font color="#ffffff">      </font>
  31.  
  32. <font color="#808080">07</font> <font color="#ffffff">    </font><font color="#000000"><uses-permission android:name=</font><font color="#2a00ff">"android.permission.INTERNET"</font><font color="#000000">></uses-permission></font>
  33.  
  34. <font color="#808080">08</font> <font color="#ffffff">      </font>
  35.  
  36. <font color="#808080">09</font> <font color="#ffffff">    </font><font color="#000000"><application android:icon=</font><font color="#2a00ff">"@drawable/icon" </font><font color="#000000">android:label=</font><font color="#2a00ff">"@string/app_name"</font><font color="#000000">></font>
  37.  
  38. <font color="#808080">10</font> <font color="#ffffff">      </font><font color="#000000"><uses-library android:name=</font><font color="#2a00ff">"com.google.android.maps" </font><font color="#000000">/></font>
  39.  
  40. <font color="#808080">11</font> <font color="#ffffff">        </font><font color="#000000"><activity android:name=</font><font color="#2a00ff">".MapsTest"</font>
  41.  
  42. <font color="#808080">12</font> <font color="#ffffff">                  </font><font color="#000000">android:label=</font><font color="#2a00ff">"@string/app_name"</font><font color="#000000">></font>
  43.  
  44. <font color="#808080">13</font> <font color="#ffffff">            </font><font color="#000000"><intent-filter></font>
  45.  
  46. <font color="#808080">14</font> <font color="#ffffff">                </font><font color="#000000"><action android:name=</font><font color="#2a00ff">"android.intent.action.MAIN" </font><font color="#000000">/></font>
  47.  
  48. <font color="#808080">15</font> <font color="#ffffff">                </font><font color="#000000"><category android:name=</font><font color="#2a00ff">"android.intent.category.LAUNCHER" </font><font color="#000000">/></font>
  49.  
  50. <font color="#808080">16</font> <font color="#ffffff">            </font><font color="#000000"></intent-filter></font>
  51.  
  52. <font color="#808080">17</font> <font color="#ffffff">        </font><font color="#000000"></activity></font>
  53.  
  54. <font color="#808080">18</font> <font color="#ffffff"></font>
  55.  
  56. <font color="#808080">19</font> <font color="#ffffff">    </font><font color="#000000"></application></font>
  57.  
  58. <font color="#808080">20</font> <font color="#ffffff">    </font><font color="#000000"><uses-sdk android:minSdkVersion=</font><font color="#2a00ff">"4" </font><font color="#000000">/></font>
  59.  
  60. <font color="#808080">21</font> <font color="#ffffff"></font>
  61.  
  62. <font color="#808080">22</font> <font color="#000000"></manifest></font></code>
  63.  
  64. </td>
  65. <!-- end source code -->
  66. </tr>
  67. </table>
  68. </div>
  69. <!-- = END of automatically generated HTML code = -->
  70. <!-- ======================================================== -->
  71.  
  72.  
  73. </body>

Oversæt og kør projektet med ctrl-b og ctrl-F11. Husk at vælge telefonen som target.

Nu skulle den franske hovedstads vartegn gerne vises i applikationen på telefonen.

3) Få Google Maps og GPS til at gå op i en højere enhed

Nu skal du udvide applikationen til at vise et Google Maps ud fra din nuværende lokalitet i stedet for et vilkårligt, hardkodet sted i verden.

Kort sagt skal du nu erstatte det statiske Geopoint i koden med et nyt af slagsen, der henter sine koordinater fra telefonens GPS.

Vi begynder med at skrælle et hovedparten af koden ud af vores onCreate()-metode, så den kommer til at tage sig sådan ud:

  1. <head>
  2. <title></title>
  3. <style type="text/css">
  4. <!--code { font-family: Courier New, Courier; font-size: 9pt; margin: 0px; }-->
  5. </style>
  6. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  7. </head><body>
  8.  
  9.  
  10. <!-- ======================================================== -->
  11. <!-- = Java Sourcecode to HTML automatically converted code = -->
  12. <!-- = Java2Html Converter 5.0 [2006-03-04] by Markus Gebhard markus@jave.de = -->
  13. <!-- = Further information: http://www.java2html.de = -->
  14. <div align="left" class="java">
  15. <table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
  16. <tr>
  17. <!-- start source code -->
  18. <td nowrap="nowrap" valign="top" align="left">
  19. <code>
  20. <font color="#808080">1</font> <font color="#ffffff">  </font><font color="#7f0055">**public **</font><font color="#7f0055">**void **</font><font color="#000000">onCreate</font><font color="#000000">(</font><font color="#000000">Bundle savedInstanceState</font><font color="#000000">) {</font>
  21.  
  22. <font color="#808080">2</font> <font color="#ffffff">    </font><font color="#7f0055">**super**</font><font color="#000000">.onCreate</font><font color="#000000">(</font><font color="#000000">savedInstanceState</font><font color="#000000">)</font><font color="#000000">;</font>
  23.  
  24. <font color="#808080">3</font> <font color="#ffffff">    </font><font color="#000000">setContentView</font><font color="#000000">(</font><font color="#000000">R.layout.main</font><font color="#000000">)</font><font color="#000000">;</font>
  25.  
  26. <font color="#808080">4</font> <font color="#ffffff"></font>
  27.  
  28. <font color="#808080">5</font> <font color="#ffffff">    </font><font color="#000000">mapView = </font><font color="#000000">(</font><font color="#000000">MapView</font><font color="#000000">) </font><font color="#000000">findViewById</font><font color="#000000">(</font><font color="#000000">R.id.mapview1</font><font color="#000000">)</font><font color="#000000">;</font>
  29.  
  30. <font color="#808080">6</font> <font color="#ffffff">    </font><font color="#000000">mapView.setBuiltInZoomControls</font><font color="#000000">(</font><font color="#7f0055">**true**</font><font color="#000000">)</font><font color="#000000">;</font>
  31.  
  32. <font color="#808080">7</font> <font color="#ffffff">    </font><font color="#000000">mc = mapView.getController</font><font color="#000000">()</font><font color="#000000">;</font>
  33.  
  34. <font color="#808080">8</font> <font color="#ffffff">  </font><font color="#000000">}</font></code>
  35.  
  36. </td>
  37. <!-- end source code -->
  38. </tr>
  39. </table>
  40. </div>
  41. <!-- = END of automatically generated HTML code = -->
  42. <!-- ======================================================== -->
  43.  
  44.  
  45. </body>

Du har nu angivet, at onCreate() skal oprette et mapview og en map controller ? ganske som i det foregående eksempel. Samtidig har vi med linje 6 gjort det muligt at zoome ind og ud på kortet.

Vi lader herefter onCreate() stå, som den er, og placerer den GPS-relaterede del af koden i en ny metode, onResume(), som vi placerer umiddelbart under onCreate()-metoden.

»Når applikationen starter, kaldes onCreate, og bagefter onResume. Hvis app'en sendes i baggrunden ved for eksempel skift til homescreen eller en anden app, lægges den oprindelige app i baggrunden og "sover". Hvis vi så starter den igen, kaldes onResume, og ikke onCreate, så vi bruger onResume for at undgå redundans i koden,« forklarer Mikkel Bruun.

Vores onResume()-metode ser ud som følger:

  1. <head>
  2. <title></title>
  3. <style type="text/css">
  4. <!--code { font-family: Courier New, Courier; font-size: 9pt; margin: 0px; }-->
  5. </style>
  6. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  7. </head><body>
  8.  
  9.  
  10. <!-- ======================================================== -->
  11. <!-- = Java Sourcecode to HTML automatically converted code = -->
  12. <!-- = Java2Html Converter 5.0 [2006-03-04] by Markus Gebhard markus@jave.de = -->
  13. <!-- = Further information: http://www.java2html.de = -->
  14. <div align="left" class="java">
  15. <table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
  16. <tr>
  17. <!-- start source code -->
  18. <td nowrap="nowrap" valign="top" align="left">
  19. <code>
  20. <font color="#808080">01</font> <font color="#ffffff">  </font><font color="#7f0055">**protected **</font><font color="#7f0055">**void **</font><font color="#000000">onResume</font><font color="#000000">() {</font>
  21.  
  22. <font color="#808080">02</font> <font color="#ffffff">    </font><font color="#000000">List providers;</font>
  23.  
  24. <font color="#808080">03</font> <font color="#ffffff">    </font><font color="#7f0055">**super**</font><font color="#000000">.onResume</font><font color="#000000">()</font><font color="#000000">;</font>
  25.  
  26. <font color="#808080">04</font> <font color="#ffffff"></font>
  27.  
  28. <font color="#808080">05</font> <font color="#ffffff">    </font><font color="#000000">locationManager = </font><font color="#000000">(</font><font color="#000000">LocationManager</font><font color="#000000">) </font><font color="#000000">getSystemService</font><font color="#000000">(</font><font color="#000000">Context.LOCATION_SERVICE</font><font color="#000000">)</font><font color="#000000">;</font>
  29.  
  30. <font color="#808080">06</font> <font color="#ffffff">    </font><font color="#000000">providers = locationManager.getProviders</font><font color="#000000">(</font><font color="#7f0055">**true**</font><font color="#000000">)</font><font color="#000000">;</font>
  31.  
  32. <font color="#808080">07</font> <font color="#ffffff"></font>
  33.  
  34. <font color="#808080">08</font> <font color="#ffffff">    </font><font color="#7f0055">**if **</font><font color="#000000">(</font><font color="#000000">!providers.isEmpty</font><font color="#000000">()) {</font>
  35.  
  36. <font color="#808080">09</font> <font color="#ffffff">      </font><font color="#000000">location = locationManager.getLastKnownLocation</font><font color="#000000">((</font><font color="#000000">String</font><font color="#000000">) </font><font color="#000000">providers</font>
  37.  
  38. <font color="#808080">10</font> <font color="#ffffff">          </font><font color="#000000">.get</font><font color="#000000">(</font><font color="#990000">0</font><font color="#000000">))</font><font color="#000000">;</font>
  39.  
  40. <font color="#808080">11</font> <font color="#ffffff">      </font><font color="#000000">locationManager.requestLocationUpdates</font><font color="#000000">((</font><font color="#000000">String</font><font color="#000000">) </font><font color="#000000">providers.get</font><font color="#000000">(</font><font color="#990000">0</font><font color="#000000">)</font><font color="#000000">,</font>
  41.  
  42. <font color="#808080">12</font> <font color="#ffffff">          </font><font color="#990000">15000</font><font color="#000000">, </font><font color="#990000">1</font><font color="#000000">, </font><font color="#7f0055">**this**</font><font color="#000000">)</font><font color="#000000">;</font>
  43.  
  44. <font color="#808080">13</font> <font color="#ffffff">    </font><font color="#000000">}</font>
  45.  
  46. <font color="#808080">14</font> <font color="#ffffff">    </font><font color="#000000">GeoPoint p = </font><font color="#7f0055">**new **</font><font color="#000000">GeoPoint</font><font color="#000000">((</font><font color="#7f0055">**int**</font><font color="#000000">) (</font><font color="#000000">location.getLatitude</font><font color="#000000">() </font><font color="#000000">* </font><font color="#990000">1</font><font color="#000000">E6</font><font color="#000000">)</font><font color="#000000">,</font>
  47.  
  48. <font color="#808080">15</font> <font color="#ffffff">        </font><font color="#000000">(</font><font color="#7f0055">**int**</font><font color="#000000">) (</font><font color="#000000">location.getLongitude</font><font color="#000000">() </font><font color="#000000">* </font><font color="#990000">1</font><font color="#000000">E6</font><font color="#000000">))</font><font color="#000000">;</font>
  49.  
  50. <font color="#808080">16</font> <font color="#ffffff">    </font><font color="#000000">mc.animateTo</font><font color="#000000">(</font><font color="#000000">p</font><font color="#000000">)</font><font color="#000000">;</font>
  51.  
  52. <font color="#808080">17</font> <font color="#ffffff">    </font><font color="#000000">mc.setZoom</font><font color="#000000">(</font><font color="#990000">17</font><font color="#000000">)</font><font color="#000000">;</font>
  53.  
  54. <font color="#808080">18</font> <font color="#ffffff">    </font><font color="#000000">mapView.setSatellite</font><font color="#000000">(</font><font color="#7f0055">**true**</font><font color="#000000">)</font><font color="#000000">;</font>
  55.  
  56. <font color="#808080">19</font> <font color="#ffffff">    </font><font color="#000000">mapView.setStreetView</font><font color="#000000">(</font><font color="#7f0055">**true**</font><font color="#000000">)</font><font color="#000000">;</font>
  57.  
  58. <font color="#808080">20</font> <font color="#ffffff">    </font><font color="#000000">mapView.invalidate</font><font color="#000000">()</font><font color="#000000">;</font>
  59.  
  60. <font color="#808080">21</font> <font color="#ffffff">  </font><font color="#000000">}</font></code>
  61.  
  62. </td>
  63. <!-- end source code -->
  64. </tr>
  65. </table>
  66. </div>
  67. <!-- = END of automatically generated HTML code = -->
  68. <!-- ======================================================== -->
  69.  
  70.  
  71. </body>

Inden vi går videre, sætter vi vores klasse AndroidSkolenDel3 til at implementere interfacet LocationListener, hvilket betyder, at vi nu både extend'er MapActivity og implementerer LocationListener.

Det betyder samtidig, at vi nu skal tilføje en række metoder, som LocationListener kræver implementeret. Få Eclipse til selv at indsætte metoderne onProviderDisabled, onProviderEnabled, onStatusChanged og onLocationChanged.

Vi tager nu onResume()-koden et par skridt af gangen.

I linje 5 i onResume() oprettes et LocationManager-objekt. Klassen LocationManager bruges generelt til at tilgå telefonens lokationstjenester, GPS og mobilnet.

I linje 6 henter vi en liste af satellitter, som vi tjekker for indhold i linje 8. Hvis ikke listen er tom, henter vi den senest kendte lokation over i et Location-objekt, linje 9. (Tip til emulator-folket: Android indeholder en 'dummy' GPS-provider. Du kan hente et sæt 'mock' GPS-koordinater med Location location = locationManager.getCurrentLocation("gps");)

Samtidig beder vi vores LocationManager om at hente fremtidige opdateringer fra GPS'en, linje 10.

(NB: Ordentlig kodestil ville være at tilføje en 'else' til vores 'if', som viser en fejlmeddelelse på skærmen, hvis listen er tom, og der dermed ikke er nogle tilgængelige satellitter. Det er udeladt for at holde koden simpel.)

I linje 14-15 begynder tingene at minde om noget, vi kender fra tidligere. Her oprettes et GeoPoint, men denne gang ud fra den aktuelle GPS-position, frem for statiske værdier.

I linje 16-20 er fremgangsmåden ganske som før, hvor vi får tegnet kortet ud fra lokationen. Her vælger vi dog også at slå Streetview til på kortet.

Nu vender vi blikket mod den autogenererede skabelon for metoden onLocationChanged, som LocationListener-interfacet krævede implementeret.

Det er den eneste af de fire metode-skabeloner, som vi rent faktisk gør noget ved.

onLocationChanged sikrer, at vi får opdateret og tegnet kortet ud fra den nye GPS-position, hvis vi flytter os med telefonen.

Indholdet i onLocationChanged er dybest set det samme som linje 14-20 i onResume()-metoden.

  1. <head>
  2. <title></title>
  3. <style type="text/css">
  4. <!--code { font-family: Courier New, Courier; font-size: 9pt; margin: 0px; }-->
  5. </style>
  6. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  7. </head><body>
  8.  
  9.  
  10. <!-- ======================================================== -->
  11. <!-- = Java Sourcecode to HTML automatically converted code = -->
  12. <!-- = Java2Html Converter 5.0 [2006-03-04] by Markus Gebhard markus@jave.de = -->
  13. <!-- = Further information: http://www.java2html.de = -->
  14. <div align="left" class="java">
  15. <table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
  16. <tr>
  17. <!-- start source code -->
  18. <td nowrap="nowrap" valign="top" align="left">
  19. <code>
  20. <font color="#808080">1</font> <font color="#7f0055">**public **</font><font color="#7f0055">**void **</font><font color="#000000">onLocationChanged</font><font color="#000000">(</font><font color="#000000">Location loc</font><font color="#000000">) {</font>
  21.  
  22. <font color="#808080">2</font> <font color="#ffffff">    </font><font color="#000000">GeoPoint p = </font><font color="#7f0055">**new **</font><font color="#000000">GeoPoint</font><font color="#000000">((</font><font color="#7f0055">**int**</font><font color="#000000">) (</font><font color="#000000">loc.getLatitude</font><font color="#000000">() </font><font color="#000000">* </font><font color="#990000">1</font><font color="#000000">E6</font><font color="#000000">)</font><font color="#000000">, </font><font color="#000000">(</font><font color="#7f0055">**int**</font><font color="#000000">) (</font><font color="#000000">loc</font>
  23.  
  24. <font color="#808080">3</font> <font color="#ffffff">        </font><font color="#000000">.getLongitude</font><font color="#000000">() </font><font color="#000000">* </font><font color="#990000">1</font><font color="#000000">E6</font><font color="#000000">))</font><font color="#000000">;</font>
  25.  
  26. <font color="#808080">4</font> <font color="#ffffff">    </font><font color="#000000">mc.animateTo</font><font color="#000000">(</font><font color="#000000">p</font><font color="#000000">)</font><font color="#000000">;</font>
  27.  
  28. <font color="#808080">5</font> <font color="#ffffff">    </font><font color="#000000">mc.setZoom</font><font color="#000000">(</font><font color="#990000">17</font><font color="#000000">)</font><font color="#000000">;</font>
  29.  
  30. <font color="#808080">6</font> <font color="#ffffff">    </font><font color="#000000">mapView.setSatellite</font><font color="#000000">(</font><font color="#7f0055">**true**</font><font color="#000000">)</font><font color="#000000">;</font>
  31.  
  32. <font color="#808080">7</font> <font color="#ffffff">    </font><font color="#000000">mapView.setStreetView</font><font color="#000000">(</font><font color="#7f0055">**true**</font><font color="#000000">)</font><font color="#000000">;</font>
  33.  
  34. <font color="#808080">8</font> <font color="#ffffff">    </font><font color="#000000">mapView.invalidate</font><font color="#000000">()</font><font color="#000000">;</font>
  35.  
  36. <font color="#808080">9</font> <font color="#ffffff">  </font><font color="#000000">}</font></code>
  37.  
  38. </td>
  39. <!-- end source code -->
  40. </tr>
  41. </table>
  42. </div>
  43. <!-- = END of automatically generated HTML code = -->
  44. <!-- ======================================================== -->
  45.  
  46.  
  47. </body>

Nu mangler vi blot at give vores applikation lov til at bruge GPS'en. Det gør vi ved at tilføje følgende tags i AndroidManifest.xml.

  1. <head>
  2. <title></title>
  3. <style type="text/css">
  4. <!--code { font-family: Courier New, Courier; font-size: 9pt; margin: 0px; }-->
  5. </style>
  6. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  7. </head><body>
  8.  
  9.  
  10. <!-- ======================================================== -->
  11. <!-- = Java Sourcecode to HTML automatically converted code = -->
  12. <!-- = Java2Html Converter 5.0 [2006-03-04] by Markus Gebhard markus@jave.de = -->
  13. <!-- = Further information: http://www.java2html.de = -->
  14. <div align="left" class="java">
  15. <table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
  16. <tr>
  17. <!-- start source code -->
  18. <td nowrap="nowrap" valign="top" align="left">
  19. <code>
  20. <font color="#ffffff">  </font><font color="#000000"><uses-permission android:name=</font><font color="#2a00ff">"android.permission.ACCESS_FINE_LOCATION"</font><font color="#000000">></font>
  21.  
  22. <font color="#ffffff">                              </font><font color="#000000"></uses-permission></font>
  23.  
  24. <font color="#ffffff">  </font><font color="#000000"><uses-permission android:name=</font><font color="#2a00ff">"android.permission.ACCESS_COARSE_LOCATION"</font><font color="#000000">></font>
  25.  
  26. <font color="#ffffff">                              </font><font color="#000000"></uses-permission></font></code>
  27.  
  28. </td>
  29. <!-- end source code -->
  30. </tr>
  31.  
  32. </table>
  33. </div>
  34. <!-- = END of automatically generated HTML code = -->
  35. <!-- ======================================================== -->
  36.  
  37.  
  38. </body>

De to tags sikrer, at vi kan falde tilbage på det grovkornede niveau (COARSE) med triangulering, hvis ikke der er GPS-signal til telefonen (FINE).

Det adskiller sig fra iPhone-platformen, forklarer Mikkel Bruun.

»På iPhone beder du bare om en location, og så kan du spørge på, hvor præcis den er. På Android er det lidt mere kompliceret, da man ofte bør tage stilling til, hvor præcist en lokation skal bestemmes. Om det er via reel GPS eller via Wifi eller sendemaster,« siger Mikkel Bruun.

Nu er vi klar til at afprøve vores færdige applikation. Lad os tage et kig på hele kildekoden:

  1. <head>
  2. <title></title>
  3. <style type="text/css">
  4. <!--code { font-family: Courier New, Courier; font-size: 9pt; margin: 0px; }-->
  5. </style>
  6. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  7. </head><body>
  8.  
  9.  
  10. <!-- ======================================================== -->
  11. <!-- = Java Sourcecode to HTML automatically converted code = -->
  12. <!-- = Java2Html Converter 5.0 [2006-03-04] by Markus Gebhard markus@jave.de = -->
  13. <!-- = Further information: http://www.java2html.de = -->
  14. <div align="left" class="java">
  15. <table border="0" cellpadding="3" cellspacing="0" bgcolor="#ffffff">
  16. <tr>
  17. <!-- start source code -->
  18. <td nowrap="nowrap" valign="top" align="left">
  19. <code>
  20. <font color="#7f0055">**public class **</font><font color="#000000">AndroidSkolenDel3 </font><font color="#7f0055">**extends **</font><font color="#000000">MapActivity </font>
  21.  
  22. <font color="#ffffff">                 </font><font color="#7f0055">**implements **</font><font color="#000000">LocationListener </font><font color="#000000">{</font>
  23.  
  24. <font color="#ffffff">  </font><font color="#7f0055">**private **</font><font color="#000000">Location location;</font>
  25.  
  26. <font color="#ffffff">  </font><font color="#7f0055">**private **</font><font color="#000000">MapView mapView;</font>
  27.  
  28. <font color="#ffffff">  </font><font color="#7f0055">**private **</font><font color="#000000">MapController mc;</font>
  29.  
  30. <font color="#ffffff">  </font><font color="#7f0055">**private **</font><font color="#000000">LocationManager locationManager;</font>
  31.  
  32. <font color="#ffffff"></font>
  33.  
  34. <font color="#ffffff">  </font><font color="#7f0055">**public **</font><font color="#7f0055">**void **</font><font color="#000000">onCreate</font><font color="#000000">(</font><font color="#000000">Bundle savedInstanceState</font><font color="#000000">) {</font>
  35.  
  36. <font color="#ffffff">    </font><font color="#7f0055">**super**</font><font color="#000000">.onCreate</font><font color="#000000">(</font><font color="#000000">savedInstanceState</font><font color="#000000">)</font><font color="#000000">;</font>
  37.  
  38. <font color="#ffffff">    </font><font color="#000000">setContentView</font><font color="#000000">(</font><font color="#000000">R.layout.main</font><font color="#000000">)</font><font color="#000000">;</font>
  39.  
  40. <font color="#ffffff"></font>
  41.  
  42. <font color="#ffffff">    </font><font color="#000000">mapView = </font><font color="#000000">(</font><font color="#000000">MapView</font><font color="#000000">) </font><font color="#000000">findViewById</font><font color="#000000">(</font><font color="#000000">R.id.mapview1</font><font color="#000000">)</font><font color="#000000">;</font>
  43.  
  44. <font color="#ffffff">    </font><font color="#000000">mapView.setBuiltInZoomControls</font><font color="#000000">(</font><font color="#7f0055">**true**</font><font color="#000000">)</font><font color="#000000">;</font>
  45.  
  46. <font color="#ffffff">    </font><font color="#000000">mc = mapView.getController</font><font color="#000000">()</font><font color="#000000">;</font>
  47.  
  48. <font color="#ffffff">  </font><font color="#000000">}</font>
  49.  
  50. <font color="#ffffff"></font>
  51.  
  52. <font color="#ffffff">  </font><font color="#7f0055">**protected **</font><font color="#7f0055">**void **</font><font color="#000000">onResume</font><font color="#000000">() {</font>
  53.  
  54. <font color="#ffffff">    </font><font color="#000000">List providers;</font>
  55.  
  56. <font color="#ffffff">    </font><font color="#7f0055">**super**</font><font color="#000000">.onResume</font><font color="#000000">()</font><font color="#000000">;</font>
  57.  
  58. <font color="#ffffff"></font>
  59.  
  60. <font color="#ffffff">    </font><font color="#000000">locationManager = </font><font color="#000000">(</font><font color="#000000">LocationManager</font><font color="#000000">) </font><font color="#000000">getSystemService</font><font color="#000000">(</font><font color="#000000">Context.LOCATION_SERVICE</font><font color="#000000">)</font><font color="#000000">;</font>
  61.  
  62. <font color="#ffffff">    </font><font color="#000000">providers = locationManager.getProviders</font><font color="#000000">(</font><font color="#7f0055">**true**</font><font color="#000000">)</font><font color="#000000">;</font>
  63.  
  64. <font color="#ffffff"></font>
  65.  
  66. <font color="#ffffff">    </font><font color="#7f0055">**if **</font><font color="#000000">(</font><font color="#000000">!providers.isEmpty</font><font color="#000000">()) {</font>
  67.  
  68. <font color="#ffffff">      </font><font color="#000000">location = locationManager.getLastKnownLocation</font><font color="#000000">((</font><font color="#000000">String</font><font color="#000000">) </font><font color="#000000">providers</font>
  69.  
  70. <font color="#ffffff">          </font><font color="#000000">.get</font><font color="#000000">(</font><font color="#990000">0</font><font color="#000000">))</font><font color="#000000">;</font>
  71.  
  72. <font color="#ffffff">      </font><font color="#000000">locationManager.requestLocationUpdates</font><font color="#000000">((</font><font color="#000000">String</font><font color="#000000">) </font><font color="#000000">providers.get</font><font color="#000000">(</font><font color="#990000">0</font><font color="#000000">)</font><font color="#000000">,</font>
  73.  
  74. <font color="#ffffff">          </font><font color="#990000">15000</font><font color="#000000">, </font><font color="#990000">1</font><font color="#000000">, </font><font color="#7f0055">**this**</font><font color="#000000">)</font><font color="#000000">;</font>
  75.  
  76. <font color="#ffffff">    </font><font color="#000000">}</font>
  77.  
  78. <font color="#ffffff">    </font><font color="#000000">GeoPoint p = </font><font color="#7f0055">**new **</font><font color="#000000">GeoPoint</font><font color="#000000">((</font><font color="#7f0055">**int**</font><font color="#000000">) (</font><font color="#000000">location.getLatitude</font><font color="#000000">() </font><font color="#000000">* </font><font color="#990000">1</font><font color="#000000">E6</font><font color="#000000">)</font><font color="#000000">,</font>
  79.  
  80. <font color="#ffffff">        </font><font color="#000000">(</font><font color="#7f0055">**int**</font><font color="#000000">) (</font><font color="#000000">location.getLongitude</font><font color="#000000">() </font><font color="#000000">* </font><font color="#990000">1</font><font color="#000000">E6</font><font color="#000000">))</font><font color="#000000">;</font>
  81.  
  82. <font color="#ffffff">    </font><font color="#000000">mc.animateTo</font><font color="#000000">(</font><font color="#000000">p</font><font color="#000000">)</font><font color="#000000">;</font>
  83.  
  84. <font color="#ffffff">    </font><font color="#000000">mc.setZoom</font><font color="#000000">(</font><font color="#990000">17</font><font color="#000000">)</font><font color="#000000">;</font>
  85.  
  86. <font color="#ffffff">    </font><font color="#000000">mapView.setSatellite</font><font color="#000000">(</font><font color="#7f0055">**true**</font><font color="#000000">)</font><font color="#000000">;</font>
  87.  
  88. <font color="#ffffff">    </font><font color="#000000">mapView.setStreetView</font><font color="#000000">(</font><font color="#7f0055">**true**</font><font color="#000000">)</font><font color="#000000">;</font>
  89.  
  90. <font color="#ffffff">    </font><font color="#000000">mapView.invalidate</font><font color="#000000">()</font><font color="#000000">;</font>
  91.  
  92. <font color="#ffffff">  </font><font color="#000000">}</font>
  93.  
  94. <font color="#ffffff"></font>
  95.  
  96. <font color="#ffffff">  </font><font color="#7f0055">**public **</font><font color="#7f0055">**void **</font><font color="#000000">onLocationChanged</font><font color="#000000">(</font><font color="#000000">Location loc</font><font color="#000000">) {</font>
  97.  
  98. <font color="#ffffff">    </font><font color="#000000">GeoPoint p = </font><font color="#7f0055">**new **</font><font color="#000000">GeoPoint</font><font color="#000000">((</font><font color="#7f0055">**int**</font><font color="#000000">) (</font><font color="#000000">loc.getLatitude</font><font color="#000000">() </font><font color="#000000">* </font><font color="#990000">1</font><font color="#000000">E6</font><font color="#000000">)</font><font color="#000000">, </font><font color="#000000">(</font><font color="#7f0055">**int**</font><font color="#000000">) (</font><font color="#000000">loc</font>
  99.  
  100. <font color="#ffffff">        </font><font color="#000000">.getLongitude</font><font color="#000000">() </font><font color="#000000">* </font><font color="#990000">1</font><font color="#000000">E6</font><font color="#000000">))</font><font color="#000000">;</font>
  101.  
  102. <font color="#ffffff">    </font><font color="#000000">mc.animateTo</font><font color="#000000">(</font><font color="#000000">p</font><font color="#000000">)</font><font color="#000000">;</font>
  103.  
  104. <font color="#ffffff">    </font><font color="#000000">mc.setZoom</font><font color="#000000">(</font><font color="#990000">17</font><font color="#000000">)</font><font color="#000000">;</font>
  105.  
  106. <font color="#ffffff">    </font><font color="#000000">mapView.setSatellite</font><font color="#000000">(</font><font color="#7f0055">**true**</font><font color="#000000">)</font><font color="#000000">;</font>
  107.  
  108. <font color="#ffffff">    </font><font color="#000000">mapView.setStreetView</font><font color="#000000">(</font><font color="#7f0055">**true**</font><font color="#000000">)</font><font color="#000000">;</font>
  109.  
  110. <font color="#ffffff">    </font><font color="#000000">mapView.invalidate</font><font color="#000000">()</font><font color="#000000">;</font>
  111.  
  112. <font color="#ffffff">  </font><font color="#000000">}</font>
  113.  
  114. <font color="#ffffff"></font>
  115.  
  116. <font color="#ffffff">  </font><font color="#646464">@Override</font>
  117.  
  118. <font color="#ffffff">  </font><font color="#7f0055">**public **</font><font color="#7f0055">**void **</font><font color="#000000">onProviderDisabled</font><font color="#000000">(</font><font color="#000000">String provider</font><font color="#000000">) {</font>
  119.  
  120. <font color="#ffffff">    </font><font color="#3f7f5f">// TODO</font>
  121.  
  122. <font color="#ffffff">  </font><font color="#000000">}</font>
  123.  
  124. <font color="#ffffff"></font>
  125.  
  126. <font color="#ffffff">  </font><font color="#646464">@Override</font>
  127.  
  128. <font color="#ffffff">  </font><font color="#7f0055">**public **</font><font color="#7f0055">**void **</font><font color="#000000">onProviderEnabled</font><font color="#000000">(</font><font color="#000000">String provider</font><font color="#000000">) {</font>
  129.  
  130. <font color="#ffffff">    </font><font color="#3f7f5f">// TODO</font>
  131.  
  132. <font color="#ffffff">  </font><font color="#000000">}</font>
  133.  
  134. <font color="#ffffff"></font>
  135.  
  136. <font color="#ffffff">  </font><font color="#646464">@Override</font>
  137.  
  138. <font color="#ffffff">  </font><font color="#7f0055">**public **</font><font color="#7f0055">**void **</font><font color="#000000">onStatusChanged</font><font color="#000000">(</font><font color="#000000">String provider, </font><font color="#7f0055">**int **</font><font color="#000000">status, Bundle extras</font><font color="#000000">) {</font>
  139.  
  140. <font color="#ffffff">    </font><font color="#3f7f5f">// TODO</font>
  141.  
  142. <font color="#ffffff">  </font><font color="#000000">}</font>
  143.  
  144. <font color="#ffffff"></font>
  145.  
  146. <font color="#ffffff">  </font><font color="#646464">@Override</font>
  147.  
  148. <font color="#ffffff">  </font><font color="#7f0055">**protected **</font><font color="#7f0055">**boolean **</font><font color="#000000">isRouteDisplayed</font><font color="#000000">() {</font>
  149.  
  150. <font color="#ffffff">    </font><font color="#3f7f5f">// TODO</font>
  151.  
  152. <font color="#ffffff">    </font><font color="#7f0055">**return false**</font><font color="#000000">;</font>
  153.  
  154. <font color="#ffffff">  </font><font color="#000000">}</font>
  155.  
  156. <font color="#000000">}</font></code>
  157.  
  158. </td>
  159. <!-- end source code -->
  160. </tr>
  161. </table>
  162. </div>
  163. <!-- = END of automatically generated HTML code = -->
  164. <!-- ======================================================== -->
  165.  
  166.  
  167. </body>

Der er altså tre primære metoder i selve hovedklassen:

  • onCreate(): stÃ¥r for at oprette vores mapview, nÃ¥r applikationen startes.

  • onResume(): kaldes, nÃ¥r brugeren interagerer med applikationen pÃ¥ skærmen, eller nÃ¥r applikationen kaldes frem efter at have været lagt midlertidigt i baggrunden. StÃ¥r for at hente GPS-koordinater og tegne kort.

  • onLocationChanged(): kaldes, nÃ¥r GPS'en har registreret en ændring i vores position.

Oversæt og kør applikationen med ctrl+b og ctrl+F11.

Herefter skulle du gerne se et kort over det sted, hvor du pt. befinder dig. Du kan kalde zoom-knapperne frem med et tryk på skærmen.

Det var alt i tredje undervisningtime i Version2's Android-skole.

»Det er altid interessant at se sin egen position i forhold til andre lokationer. Så hvis man vil eksperimentere lidt med ruter og afstande, giver location.distanceTo(otherLocation) afstanden mellem to lokationer i meter,« siger Mikkel Bruun om en af mulighederne for at bygge videre på GPS/Google Maps-applikationen.

Næste gang ser vi nærmere på trådning af den grafiske brugergrænseflade i en Android-applikation.

Litteratur:
[1] http://developer.android.com

Skab Danmarks bedste Android-applikation og vind en eksklusiv tur med alt betalt til verdens største mobilmesse i Barcelona. Deadline er 11. januar 2010. Læs mere på http://www.version2.dk/android

19 kommentarer.  Hop til debatten
Denne artikel er gratis...

...men det er dyrt at lave god journalistik. Derfor beder vi dig overveje at tegne abonnement på Version2.

Digitaliseringen buldrer derudaf, og it-folkene tegner fremtidens Danmark. Derfor er det vigtigere end nogensinde med et kvalificeret bud på, hvordan it bedst kan være med til at udvikle det danske samfund og erhvervsliv.

Og der har aldrig været mere akut brug for en kritisk vagthund, der råber op, når der tages forkerte it-beslutninger.

Den rolle har Version2 indtaget siden 2006 - og det bliver vi ved med.

Debatten
Log ind eller opret en bruger for at deltage i debatten.
settingsDebatindstillinger
1
2. december 2009 kl. 13:54

Jeg havde lidt bøvl med at finde keytool på en ny win7 installation, men den ligger bla. a. under java runtime environmnet.

Mvh Thorvald

2
2. december 2009 kl. 14:03

I den første onCreate bruger du mv og mc, men disse er ikke erklæret. De skal være

private MapView mv; private MapController mc;

senere i forløbet begynder du dog at bruge mapView i stedet for mv, så jeg vil foreslå at du bruger variabelnavnet mapView allerede i første eksempel

Thorvald

3
2. december 2009 kl. 14:33

Fin artikel, jeg kan lige tilføje at hele dette eksempel også kan afvikles på android 1.5 (som en den platform, der pt. understøttes af HTC Hero)

Mvh Thorvald