{"id":39,"date":"2013-04-02T17:02:26","date_gmt":"2013-04-02T17:02:26","guid":{"rendered":"http:\/\/android.wp.xpkode.com\/?p=39"},"modified":"2013-04-03T01:19:58","modified_gmt":"2013-04-03T01:19:58","slug":"mapas-e-geolocalizacao-com-mapfragment","status":"publish","type":"post","link":"http:\/\/android.w3.pt\/?p=39","title":{"rendered":"Mapas e geolocaliza\u00e7\u00e3o com MapFragment"},"content":{"rendered":"<p>Ficheiros da aplica\u00e7\u00e3o<\/p>\n<ul>\n<li>No menu, abrir a vista de Navigator: Window &#8211; Show View &#8211; Navigator<\/li>\n<li>Em Navigator (janela do lado esquerdo), premir o bot\u00e3o direito do rato e escolher New &#8211; Project. Depois selecionar Android e Android Application Project. Premir Next. Surge uma janela de di\u00e1logo.\n<ul>\n<li>Em Application Name, colocar \u201cMapas\u201d<\/li>\n<li>Em Project Name, colocar \u201cMapas\u201d<\/li>\n<li>Em package name, colocar \u201ccom.lingweb.mapa\u201d<\/li>\n<li>Em Minimum Required SDK selecionar Google APIs 3.0<\/li>\n<li>Em Target SDK selecionar Google APIs 4.2 (ou vers\u00e3o mais recente)<\/li>\n<li>Premir Next tr\u00eas vezes<\/li>\n<li>Em Create Activity, selecionar BlankActivity. Premir Next<\/li>\n<li>Em Activity Name, colocar \u201cMapas\u201d<\/li>\n<li>Em Layout Name, colocar \u201cmapas_layout\u201d<\/li>\n<li>Premir Finish<\/li>\n<\/ul>\n<\/li>\n<li>Em Navigator, premir o bot\u00e3o direito do rato sobre o projeto Mapas e criar uma diretoria com o nome \u201cdeploy\u201d<\/li>\n<li>Em Navigator, abrir o ficheiro AndroidManifest.xml e colocar dentro da marca application, as seguinte linhas (antes de &lt;application&gt;):<\/li>\n<\/ul>\n<div style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace; font-size: 0.8em;\">\n<p>&lt;permission<br \/>\nandroid:name=&#8221;com.example.mapdemo.permission.MAPS_RECEIVE&#8221;<br \/>\nandroid:protectionLevel=&#8221;signature&#8221; \/&gt;<\/p>\n<p>&lt;uses-feature<br \/>\nandroid:glEsVersion=&#8221;0x00020000&#8243;<br \/>\nandroid:required=&#8221;true&#8221; \/&gt;<\/p>\n<p>&lt;uses-permission<br \/>\nandroid:name=&#8221;com.example.mapdemo.permission.MAPS_RECEIVE&#8221; \/&gt;<br \/>\n&lt;uses-permission<br \/>\nandroid:name=&#8221;android.permission.INTERNET&#8221; \/&gt;<br \/>\n&lt;uses-permission<br \/>\nandroid:name=&#8221;android.permission.WRITE_EXTERNAL_STORAGE&#8221; \/&gt;<br \/>\n&lt;uses-permission android:name=<br \/>\n&#8220;com.google.android.providers.gsf.permission.READ_GSERVICES&#8221; \/&gt;<br \/>\n&lt;uses-permission<br \/>\nandroid:name=&#8221;android.permission.ACCESS_COARSE_LOCATION&#8221; \/&gt;<br \/>\n&lt;uses-permission<br \/>\nandroid:name=&#8221;android.permission.ACCESS_FINE_LOCATION&#8221; \/&gt;<\/p>\n<\/div>\n<p>e no fim (antes de &lt;\/application&gt;):<\/p>\n<div style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace; font-size: 0.8em;\">&lt;meta-data<br \/>\nandroid:name=&#8221;com.google.android.maps.v2.API_KEY&#8221;<br \/>\nandroid:value=&#8221;XXX&#8230;XXX&#8221; \/&gt;<\/div>\n<p>Na linha anterior deve ser colocada a chave fornecida pelo Google.<\/p>\n<ul>\n<li>Em Navigator, abrir o ficheiro \/res\/layout\/mapas_layout.xml e substituir o seu conte\u00fado pelo c\u00f3digo seguinte. No par\u00e2metro android:apiKey deve colocar a chave que obteve no Google. O c\u00f3digo abaixo cont\u00e9m tr\u00eas objetos que constituem o esquema gr\u00e1fico da aplica\u00e7\u00e3o: o primeiro \u00e9 um objeto do tipo MapView, onde \u00e9 colocado o mapa, os outros dois s\u00e3o textos onde \u00e9 escrita a posi\u00e7\u00e3o (latitude e longitude) do telem\u00f3vel.<\/li>\n<\/ul>\n<div style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace; font-size: 0.8em;\">\n<p>&lt;RelativeLayout \u00a0\u00a0\u00a0\u00a0\u00a0 xmlns:android=&#8221;http:\/\/schemas.android.com\/apk\/res\/android&#8221;<br \/>\nxmlns:tools=&#8221;http:\/\/schemas.android.com\/tools&#8221;<br \/>\nandroid:layout_width=&#8221;match_parent&#8221;<br \/>\nandroid:layout_height=&#8221;match_parent&#8221;<br \/>\ntools:context=&#8221;.Mapas&#8221; &gt;<\/p>\n<p>&lt;fragment<br \/>\nandroid:id=&#8221;@+id\/map&#8221;<br \/>\nandroid:layout_width=&#8221;match_parent&#8221;<br \/>\nandroid:layout_height=&#8221;match_parent&#8221;<br \/>\n\/&gt;<\/p>\n<p>&lt;\/RelativeLayout&gt;<\/p>\n<\/div>\n<p>\u00c9 necess\u00e1rio importar a biblioteca do Google Play services descarregada anteriormente atrav\u00e9s do SDK Manager e inclu\u00ed-la no projeto.<\/p>\n<ul>\n<li>No Eclipse, selecionar:<\/li>\n<li>File &#8211; Import &#8211; Android &#8211; Existing Android Code into Workspace<\/li>\n<li>Premir Next. Em Browse, selecionar o caminho para a biblioteca:<br \/>\nC:\\adt-bundle-windows-x86_64\\sdk\\extras\\google\\google_play_services\\ \\libproject\\google-play-services_lib<\/li>\n<li>Marcar a op\u00e7\u00e3o Copy projects into workspace e premir Finish<\/li>\n<li>Em Navigator, premir o bot\u00e3o direito do rato sobre o projeto e selecionar Properties<\/li>\n<li>Selecionar Android. Em Library, n\u00e3o marcar a caixa Is Library e adicionar a biblioteca google-play-services_lib<\/li>\n<li>Por fim, colocar o c\u00f3digo da aplica\u00e7\u00e3o:<\/li>\n<li>Em Navigator, dentro das diretorias do projeto, abrir o ficheiro \/src\/com\/ \/lingweb\/mapa\/Mapas.java e colocar o c\u00f3digo:<\/li>\n<\/ul>\n<div style=\"border: 2px solid black; border-radius: 5px; box-shadow: 5px 5px 5px grey; background-color: lightyellow; margin: 10px; padding: 8px; font-family: monospace; font-size: 0.8em;\">package com.lingweb.mapa;import android.app.Activity;<br \/>\nimport android.location.Location;<br \/>\nimport android.location.LocationListener;<br \/>\nimport android.location.LocationManager;<br \/>\nimport android.os.Bundle;<br \/>\nimport android.widget.Toast;import com.google.android.gms.maps.CameraUpdateFactory;<br \/>\nimport com.google.android.gms.maps.GoogleMap;<br \/>\nimport com.google.android.gms.maps.MapFragment;<br \/>\nimport com.google.android.gms.maps.model.BitmapDescriptorFactory;<br \/>\nimport com.google.android.gms.maps.model.LatLng;<br \/>\nimport com.google.android.gms.maps.model.Marker;<br \/>\nimport com.google.android.gms.maps.model.MarkerOptions;<\/p>\n<p>public class Mapas extends Activity implements LocationListener {<br \/>\nstatic final LatLng LISBOA = new LatLng(38.725, -9.151);<br \/>\nprivate GoogleMap mapa;<br \/>\nLocationManager lm;<br \/>\nMarker lisboa, aqui;<\/p>\n<p>@Override<br \/>\nprotected void onCreate(Bundle savedInstanceState) {<br \/>\nsuper.onCreate(savedInstanceState);<br \/>\nsetContentView(R.layout.mapas_layout);<br \/>\nlm = (LocationManager) getSystemService(LOCATION_SERVICE);<br \/>\nlm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 3, this);<br \/>\nmapa = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))<br \/>\n.getMap();<br \/>\nlisboa = mapa.addMarker(new MarkerOptions().position(LISBOA)<br \/>\n.title(&#8220;Lisboa&#8221;));<br \/>\naqui = mapa.addMarker(new MarkerOptions()<br \/>\n.position(LISBOA)<br \/>\n.title(&#8220;Bom dia&#8221;)<br \/>\n.snippet(&#8220;Voc\u00ea est\u00e1 aqui&#8221;)<br \/>\n.icon(BitmapDescriptorFactory<br \/>\n.fromResource(R.drawable.ic_launcher)));<\/p>\n<p>\/\/ Move a c\u00e2mara instanteneamente para lisboa com um zoom de 15.<br \/>\nmapa.moveCamera(CameraUpdateFactory.newLatLngZoom(LISBOA, 10));<br \/>\nif ( !lm.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {<br \/>\nToast.makeText(getApplicationContext(), &#8220;Por favor, ative o GPS&#8221;, Toast.LENGTH_LONG).show();<br \/>\n}<\/p>\n<p>}<\/p>\n<p>@Override<br \/>\npublic void onLocationChanged(Location loc) {<br \/>\ndouble lat = loc.getLatitude();<br \/>\ndouble lng = loc.getLongitude();<br \/>\nLatLng sitio = new LatLng(lat, lng);<br \/>\n\/\/ Zoom in, com anima\u00e7\u00e3o da c\u00e2mara.<br \/>\nmapa.animateCamera(CameraUpdateFactory.newLatLngZoom(sitio, 15), 2000, null);<br \/>\naqui.setPosition(sitio);<br \/>\n}<\/p>\n<p>@Override<br \/>\npublic void onProviderDisabled(String a) {}<br \/>\n@Override<br \/>\npublic void onProviderEnabled(String a) {}<br \/>\n@Override<br \/>\npublic void onStatusChanged(String a, int b, Bundle c) {}<\/p>\n<p>}<\/p>\n<\/div>\n<p>No caso do Eclipse produzir um erro devido \u00e0 falta de tradu\u00e7\u00e3o de cadeias de carateres, o problema pode ser contornado da seguinte forma:<\/p>\n<ul>\n<li>No Eclipse, em Window &#8211; Preferences, selecionar Android e na caixa procurar CorrectnessMessages<\/li>\n<li>Premir ExtraTranslation e alterar a Severity para Warning. Fazer o mesmo com a op\u00e7\u00e3o MissingTranslation<\/li>\n<\/ul>\n<p>As aplica\u00e7\u00f5es que usam a biblioteca google-play-services_lib n\u00e3o podem ser executadas no emulador. \u00c9 necess\u00e1rio criar uma aplica\u00e7\u00e3o assinada e execut\u00e1-la num dispositivo f\u00edsico.<br \/>\nPara executar esta aplica\u00e7\u00e3o tem que instalar o Google Play Services no dispositivo, a partir da loja do Android: Google Play.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ficheiros da aplica\u00e7\u00e3o No menu, abrir a vista de Navigator: Window &#8211; Show View &#8211; Navigator Em Navigator (janela do lado esquerdo), premir o bot\u00e3o direito do rato e escolher New &#8211; Project. Depois selecionar Android e Android Application Project. Premir Next. Surge uma janela de di\u00e1logo. Em Application Name, colocar \u201cMapas\u201d Em Project Name, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/posts\/39"}],"collection":[{"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/android.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=39"}],"version-history":[{"count":4,"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/posts\/39\/revisions"}],"predecessor-version":[{"id":49,"href":"http:\/\/android.w3.pt\/index.php?rest_route=\/wp\/v2\/posts\/39\/revisions\/49"}],"wp:attachment":[{"href":"http:\/\/android.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=39"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/android.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=39"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/android.w3.pt\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=39"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}