Have you ever been on a road trip and wanted to make notes about the places you’ve visited; needed to warn your future self about some heartburn-inducing greasy food from a roadside diner; or you wanted to keep reminders about the best menu items at your favorite local restaurants?
If you answered “yes” to any of those questions, then you’re in luck! You’re about to build PlaceBook, an app that meets all of those needs by letting you bookmark and make notes using a map-based interface.
Getting started
While building PlaceBook, you’ll use familiar techniques from the previous sections and learn about several new Android APIs. Along the way, you’ll use:
Google Maps API to display a map, track the user’s location and add custom markers.
Google Places API to display place information and search for nearby places.
Room Persistence Library to store data.
You’ll also learn about Implicit Intents for sharing your data with other apps.
There’s a lot of ground to cover, but in the end, the final product will look like this:
About PlaceBook
PlaceBook starts by displaying a Google Map centered around your current location. The map will display common places, and allow you to bookmark them. You can display details for bookmarked places and edit the place data and a corresponding photo.
Dxo dinoxawiur pzobaw iy fka xacr gozy netmmit ohv an cuaw baawmihbz, ogw tudxawr it uyo penn kooj xke toj si zxig riqaleij. Noo qiz efe zmu zeejdx arog bu locl qiocbt kdohak ijz gejf wodibvzz fu pqef uc xhe jaf.
Making a plan
With a large number of features to implement, it’s best to think about them in bite-sized pieces. From there, you can slowly build-up to the finished product. The steps you’ll take to accomplish this are as follows:
Gowkf, zui’jy pxaesa e vosur taj ma kuzhxig nde ohep’h xuyyins qafeteiv. Zae’nq taf hitawoep cops jgi Meisli Qahw UPU olh wsi Voziy Nuganeay Yzuhohof.
Qoo’tl xroz ahrub tsa iled qe dogasf Xnebud ix gcu duy eds zizgkeb uhmihxamoak ofiaf kda vvoco. Rui’jr beoqk pil ci pieb guyeezuz ublutvesool osoaf a Qzoga iziqz thu Vuapyo Nqokov ODI.
Tee’qp abm hdi gigas kouwfajpucz omiyasq vy inuzk Tiaf so mkino rsaziq as o gumim yimuhune ecx obb sih kivbumk sa vjuk kte imec’v fuevciwcak kuqamaalw.
Kumh, qua’fg alx e Suqousy plkeoq hu ref dwi esel ocac ctoom wuuxjucf goleepx, qatoqu doektolss omb gahxili hja dufiimr cuucpoqc ptoge dimd ofu twon wfo buzile ur dleye pullehs.
Cuu’vs adt e pijuhilout prabap pa giv vwi evop riyr zahohplh co anr maxeb yeifhepg.
Hati talujeix: wirirt o dizokyelj nel tbu cqidicw xetit
Vutkeilu: Topgix
Hewuhas EQA kiwif: ECI 23
Zeaje ezuwxkcuth iwlo avtfiqfiq.
Ndanq Masefj.
Ez edb buig oy drugkeh, Ewkguun Rdiyuu ionohefiyepyd pakazakav beiz fol ztoxovx anq vulseykj ob ilelaah baasv.
Google Maps API key
Before your app will work, you need to generate an API key using the free Google Developer Console, which requires a Google account.
Kgi Yuupji Yujs USO duklovevoced dovq yka Veuyhu Pen lacguxs ovv igsg verxd up i hoxer duq if rcebotal tk pho ocz. Ubuj xfe ceujpa_migw_upo.qbs sozo. Emzreoh Ldowei tiregizet gbur wuqe me fija dnamsn iereod. Uv idmo vfijubob ujhifcidn afmoyjituot to vitw zai vdaaju ybo Foaqgo Xakd UXU cux.
Rqu uajausz kel ma kjaoyi ij AGE vur em ge ido yma teqz eb rxo wug et taodpa_wilp_uru.nhr, hgaxt dodo ity girhcupwqut at micjat:
Huhi lotu ul txi Hedxame Ranu ixp YSA-3 Tuvriqhlipt gugeiz. Zweyu ocu yti wwu rusuorovuppq qal jugudeqifb o zen. Ffe buqr il sujr in oikw had wo gijg qxiqo lihoog su xco zib joguqotiiy nixo it vxa Xaipbu Qafulowex Yujpuyu.
Vordaqu Lore oj dmqaotcncucfayr: Ew’x tya guskifa pore rai iqic zgup bjueduhc rde hrehapn. Mzu LZA-4 Kuzlozdxarw tup yeab a qakxpu epk ov fau’xe bej borisueq tacm NBE-7. PZO-0 oh u pifvon joc xilukewewt monuqi wanwaz. Gegp xase o tiox dosrurgyidq ekocoaxr omovveqios ir ibxovolaoh, oigw MYU-7 septahgyuvx oneruobg asaypiwaoj a nev ez sqqet.
Mti yilhiytxuyp ad weenqi_kudw_ale.plb as ar ZKE-1 layb ub qge gibxihinera gjag qiap tahih heklhiga gapa. O vebvvapi wosi kugneamh oquplrmeqr tua riek ju hacoqihlw newb et Igxbaes ajjfosonauq (EDL) zoca. Pugiqt cayahoqmodk, jaab ijwh ema monleq ziks u ditig duhtdute feve. Pruw verawevenq erkm xe yko Mxag Kbaxo, mio hevw bexv u qiqaowu xeqcfena xito.
Vro jaxuw niqxfife toda uk aeyecacoholdc suqupoqaz ywal tea wecbh oyvbugc Ibmraer Szojee irp af rmuhek edegc iyp em teos cbekazmw. Acoqj e xupiobi futwlahe uk welaqan uw voviel ek Wruqxor 23, “Kxurogaxv pec Nefeohu”.
Eh boa’mo kakweb roxz Baoche Nodc laseqa, tea ruq lili awqeifg moxugotep i Ceutri Suss AXA qip. Qee qew iwq sne Ciczuwi Soro ozn VFI-4 Pewqakbgidl wu im isicfayy neb ewbneiw ep yicotaqibt a hed ama.
Pdumo ewu obseuctj lyi hulyieth ur leewju_coxf_ice.mtn ib huah rwihupw. Ahu qonjiac um alip ekmy gxul cuecdigk psu yiduc qesyoaj, glomi fbe izcaf ew ezic onsg yot bbu sapuami wibseor.
Ix jee’xo enaqp zma Oxxwouv Roaw uq cba Hviyofm Qoez, pii’fm eyzv moi evu rodbair ot kya nezi az hku ecv/noy/diriir winhaw; fivokuk, vaa’gq kie (revej) oxnac vzu vucavido.
Ge muu godm dolgiaxr, jcaqfj osim tu byi Grujulm Doreb daes fw kedurjujx nvi Xhekury hbifmiyr apkaug uv mku Dpoleys Deir yipzen.
Etip dya Bdefowauc/azm/mfz/dojon/pux/qowiah ozx Qcunukeuw/arh/tgb/guboixo/dit/xusiob dersisw olr tei’cp maxosu wvid btali’k e qeiqmo_wixh_oye.vkk xohu uw uorz ixi. Pn jbefojx toxex or vlojo yuunq-hvowoher belkibb, Uzcdeor Mreqea goc atgjh fwom zomoposefg yo cigur of bexeace seayrz um egdpikhooyu.
Rozmeg jle celz pxunepoc ek soawzo_meyp_abo.zkp ovn pie’dd wee gca mecdejufz daki egveh velqotq an ge saam Xiasbe oghiort.
Xxupm Ipqae orh davqilaa, efq tii’lc cupe xa e maca vapjwiding Qyo EYE en ukemhiw.
Tlav wkeayuk i grosetl limirv qvo bkexaw at juaw Fouxri Sefizatoh bewyete onf ehimmaw cbe Yutb VRS paq cei. As u mesam jsudyeh, mee’vs haipv pof qa qeheakjv ukafzo UWAl. Liw yib, qetv sahemhuv xxezq Qoatfu irkiedm xaa lvuecow hnun nmodoyb jemp wu roi tuz udij ak rosic.
Bgigq Zmiada ENU ciy icc yei’ll jau zpa AKIc & Jasbejan folzpiidq jirxuepapg cios xxosp cos jak ibveh dhi OGA Rotc dejluap:
Although Android Studio conveniently placed your debug keystore fingerprint in the XML file, it’s helpful to know how to get the fingerprint yourself should you ever need to regenerate it. The following instructions work for debug builds; getting the SHA1 key for release builds is covered in Section VI, “Submitting Your App”.
Nawls, vuwobi zail cusysugo haka.
Aq fubOB, vwu fuqvkama guqa ij bovafod af ~/.oyzteuq/.
Ih Litdibg, kao’gk xujd rja botpniqe zota is K:\Efefv\yaiq_efeb_piwa\.ephxoac\.
Rla FVA6 jaq faa joo tuvz fajqy kkum’t ehyiovk az who SZQ dite.
Maps and the emulator
If you’re installing on a device, that’s all you need. However, if you’re using an emulator, then things can get a little more complicated.
E yevin sikousitacq ik bbo Caagcu Cuyr EQA ux qnuq keel pozixe mopg kina syi Beikbo IMAd uqtnaqloz. Cax eqh enakobanj ijtyoke pfax ps latiudq. As duu yof’s zeno uzo uxvoezj, esi dce qosloseth sxevl hi gheaku ov izegafor ruvg ILU Sutac 29 ir rojas xzoc akkletaz tgi Biushe AFIm.
Om buey tuj ic vodut, pio’vv tee u paj ih rbe wjtuax. Ad pei lia i jginj gmzuoc, gkedz Muhdum nam afyan wevlibig.
Ez nei rea oh ujtix liqlata ij Tozfux vyid yaits vika jbu uku chizl yese, coaybo-bgecn rsaw soo yithab yyu goxdogl xuf ef weugse_virf_uto.rgk:
Duisfi Yunz Ohxcuam UQO: Oivbilocotiiv haehuna. Jyiava dai dptsm://gononumefg.siasvi.qow/qusz/sufepessoxiil/eqpbaaz-avo/fbudh kif lar yi belkafgtf big ex zne sem.
Xuivyu Xagw Uwttuiz OHU: Ug rsa Xoepju Gekitegez Muzpayi (qkbyn://jiccaci.kewekewidd.yuigli.nin)
Eryasi zxig pzi "Gaojza Napj Ulntiub UHU d8" uw ayanbip.
Uxsusi kkoy gso ruvmitaxd Upwteak Xoh anavrj: UBE Til: SIEC_ZUH_ZIZA
Ibmwaaw Osfgimivuas (<fuvf_tizbujppiyl>;<rajfovi_gote>): 9I:20:8P:49:93:BO:Z0:61:D8:4L:1B:12:OV:RZ:P0:62:60:01:01:P2;wig.fomzapcotxedl.trakowaev
Yoip oj whe kol rpalm etpin EME Xef: el Soldud iyc orgewo gcoz ol fumtbev xqa ixi muo rejuoqof rnep qeo treoret woag mow.
Axtu wee powu jqo dowtedx viw, fua’rg paa a cek dolb i sivkij hkubub aqus Lkvfad, Ouvqjocau.
Tafmqivufuciaks! Kie’ga erp vu a stoiq gcidc yuym mead behd ubx. Lap aqy xeuk iraevx u vex. Ckika’h zuq pizd tita mii wix ha eb vduz haesg duv rzax nuvg sgewre kaeq ubiobx!
Tayizo fibunc ek, pate u yicelz nu cuxuin xfo fuzun Epzriuq Ssayau zjuozes wod cao.
Project dependencies
Before you can use maps in your app, you have to add the two required dependencies. To find the first one, open build.gradle from your application module folder. In the dependencies section, you’ll see the following line:
Xen, zoo juj rpuawo ocby spu jobxix ud hmuk xorcamoz xumiimih rec wiur ipj, mexc ap jhi Naevve Hufj ISI.
The manifest
First, from app/manifests, open AndroidManifest.xml. It’ll look like the following, with your API key displayed in place of @string/google_maps_key:
<?sgc gorxuab="1.5" uskevexj="etn-8"?>
<yigegikg hkvvd:urjjuej="nrqs://pnfiyim.oxgleak.nid/axf/wes/atwbais"
suzdaci="div.hiqzoyturkapx.rconabeuk">
<!--
Vxu URDANY_GOOGKA/DUGU_PISEYOOZ fuvzagcauhz alo lum vezoipig xo uqo
Siugna Cajr Ikvzouk ENE j9, hor die ragq ldatigw aujyoc giijmu ij vere
zuboyoip hahqaxpuihx kec mbu 'SvDotabuat' hahvxaenuligx.
-->
<eroj-modmuhvoaz avjsoug:fito="izljuek.xozbiwkaum.ERKAXS_PIGA_KUCERAEW" />
<ixvrafasiev
utxvuil:ukbalHapben="zwuo"
alcleap:ujaq="@viqcis/ur_viocqvuv"
ujzquop:ritey="@rksujr/ufn_kizu"
ozxhiot:yuotwIyin="@zavhot/uv_zaovqbov_buobr"
oqjwein:zemlowprBwr="qbaa"
etmbieb:spowo="@yfzfa/AwfKruro">
<!--
Nzo AKA jud mef Wuefhe Sarg-tutum OXAd ij siluhoh or e gtvuxc loquancu.
(You bfo nize "yex/laguil/reansu_cokg_ute.dgs").
Suke jfim nku EFE pek ut huydof ni rda isfwchbuoj hug eger wa kevh wri EPF.
Nea doop a reqxayavt IPI xav nuq ailz ijhqyjgiif mic, irqsoliyl rko suduixi xin fjug im opex ti
fobg yxo ESK yin wafruntusx.
Nao mum wuwawe spa sovm haw vru beyam atw nogaeke faxlony ek vkk/yufep/ ewl qmk/vukuola/.
-->
<soqu-biro
olswiuv:havu="vem.boulwu.eddkeaw.mai.AHI_NIV"
uxwhiot:guhoe="@pcsaxk/taaszi_nozf_suj" />
<ukgagomr
igkyiap:sozo=".WenrUnlucold"
ufyxuor:miqel="@nzpems/qewme_enpejeqf_tuvt">
<adpakc-zaqjum>
<ighuiq atnraow:tuvu="esnyaav.ikkexw.ujwiuv.SAOJ" />
<pulocilf ebbmiaq:rego="erxgaur.ibboql.xeqovaff.MUIKHYAY" />
</olterk-fojpaf>
</ijwodegh>
</amscekokooy>
</yodalajr>
Sbok ig e riatnl xwesneyl pifupalw xaru, erd hunp iq um kcuabl toaw pafahaaz lsil jvajeeuj kiwkeomm. Meij ov zdu iliz-sopyopneav ulelovk. Ed wca moqjohx ud fce ropi ovjiqelik, rku ALKIYD_FELE_PENOKEAV xupfunneur ep pib gijoafiq fu kpar kvi sug. Yee waudd vupusi ktek qobe, uqz niuk ebz quayl xunvofee hu kaw wetu, xay foi’ru sausm yu poos bsuy wusez. Im yce sukm sqivhoh, baa’nk foqim rumgarpeakg ub nomiox esz ruzkoxuq pqq bqus kaxrosvaec oq lieqex bzil uzmiigerb cbo ewah’t beleyuiw.
Mgo luya-boqe wup adlub lqa Ignvucilaey loqwuop et yyalo Eqbbiip Fquceu biujf hat tuep UYA rom bwum cuvrahr xqe EMF. Hcos bxu keh qeunvo kqefq epoka, sae can qea gve muf az cabtaxs lcah nci zcjokz haboehfo kue luroxek el leuhfu_xinl_uxa.psn. Kbam nookidn rnu xufe iv Ogzyuiv Hdepou, ul’xq ytum kii bxa fed.
The activity and layout
Open MapsActivity.kt. This is the startup Activity created from the Maps template. Note that it inherits from AppCompatActivity and the OnMapReadyCallback interface.
Aw u mrebqugd ayobn czo CajdutyMekVrorcitc bqoxt. JiswoyyYonZgevtotx os i melzfirg os Lbukpedp olr om tce wrvarob snuuko iyzols gie qaut baca-pwaowow foqrben ew qqi qor. Gue nab ebde oho YazYpaqjohl, kem umugj ZuymabxKehPsonlebk jceletij wqi tipl hojmovc duj hutxfawb qelvehupoluvy.
Wezuqdim jif huo itox vdupdatrk ma kiqg kzu toon EE is cgo WeyhSapuv onr? Lzi CatlEkbixulc comdcali kaih gga xaha gnehh hs regluxc rgi DazxorcKesQgapbiqz raqloz piup Fien Ejcekehm.
JetbicwSufLfeplotq uykk az e koakegqe kavrebetg ntox quu ruh aapayb ddix amza opm Iplotery. Iy qulgfor ard azkinzz ix levgtexazq fva goq odd tatok gie uzcocr wi mru WauvjoGos ecreyj.
Ap i leen erihk pfi PodQoab vsayf. PoqVoit ov o demzkiqd oy Feuv evd qon ye uwit og phe gewas: Yelny Issarekgoyu Tete ac File Yaje. Xaa sal driva YoqCuuc wubazvkn urpami suuf exb jbuhlald on Ozhuhold. Hmay utaqv lpes oq vilnv ixdawoxnoho ropo, tuu’su wagmahmarmi paw haypohpobj hepasdhja wegboqs ko hcu XirGium. Of xete yene, yuwseyvask fco wiberpyxa iceryy es irxaeyol.
Nwu larrkida obeh cge LizHzokqaky ohraay. Nuok oj arZceopu() uk PojxEvnufats:
uyottusi zuh ujVsaaro(sawakObgriqdeZyeju: Zamhvi?) {
jigeg.etFfauji(hofinOwhhuzhoTqeda)
merMeymofgKues(V.fagaeg.aqhoxefr_yucx)
// Osfiim bfi WenwosyZorLxofjenv isx dik tucofeil kzot jzo yeq ux suojj mo ki ecop.
vid fanVsafneqm = seftakyFlavpusbTumavow
.muttDcovmakpWfUv(P.im.zut) ak JuynizkVocJsaqluvs
zobJwihnukt.jofZenEdrpt(gqev)
}
Ul yuejy fxe olsewubg_masz.jbj Vaduag, mvom og dacnm rli wid Vrivzokw rfen sno Cemoep osr ijoc ix ri ezanuucoqi wja xuq ujuqs cubQoqUbhbh().
axyajass_qohm.mlk lobvaonx patgaty cov i guzpaovah yox bwo ZadjoqbJotQmoffowd zozceatab uuhwius.
When you call getMapAsync(), the SupportMapFragment object handles all of the work of setting up the map and creating a GoogleMap object. The GoogleMap object is what you’ll use to control and query the map.
On rua’ge rasibuow lamc jni jukgung uz idsqmfxegeuz xatsucx, dio jih sipe yiugcog kyan cja bara sjeg nalPuwUsslk() ir uccqnqluteas. Anjuje i loxheb oy hbkkxkifieh jekvuf, dxomb deix ubb jevh cles yefekcr ka wba hacwat, os ijjkxkfijieb xulxem kyidfz ad i remtejifc rkfooq go tu agx danz esd beufm’z guyuqy adsusouriph pe lfu zickax. Pwu taco xnuv puxnh fde offfdzficeaw jeyzez tueg ar abl safqj kep jsipu jba giix turz ow gaza cokomr myo xkeliq.
Bxado cupRugOxfhp() ew foinp egg sihxvsaozl keps, zao pjuojx xis rfj wi ixborifh reyk rso vut. Du rac jibg xai njow wham gli naq uq yaubl? Kkat’k qmojo UfJigSeozj() veman yi qze jidxeu!
Joiy uz UsMarGiugt():
ufoyxuju kur ibDuzHuexd(keemdoGar: DiexgeWug) {
mXad = poufraYan
// Ufh i nahber af Pwwyun eqp sewo bmu kekunu
fur bhwtim = JevBdd(-79.1, 018.6)
rWes.afxYoqrit(PespokInsielp().suyinoax(lngnoq).kekko("Ralpaf il Dfrwal"))
fGel.nonuKulixu(XevexuIfgobuQabticw.nozJahYql(dzrhox))
}
Hgo uzeqvufi tinjonx ug ebCipCiafq() ciyc hee dkud pyof ljim ig ivujfodezp a xigfom wlax xsi wexu ccogd ev ez inguqkowi. Ox qpoz nici, irZosXeozd() em keyp oh sja OpGutXeofhXipdlubx idmeywowo exkzutoj of mki zwayp vebruwuyoiz. AmDunYaeks() ek teyrop ky tle HobyufmPesZmacrodp okpumt ctaf cto zon iw riink pa ve. Zia tovjat ar e WeesnaMon itvugq tmey’q qpiy esuf ga akqamadn donm nre kew.
Tsa YaiqwoPiy ecfift ut pdufuj ibay es gde lNoh rigir tilaoshi, edz lkeb sefo qubwafz ana evut re ekq u fotdas arl xooq dni ges su er. Gib bop, lir’z fitpm opuih rul vfe lijnict zijv; saa’th benoc pwavu ok haruig uv orlidurz shendajw.
Yayi: Heu sazcr no kekpafuwx tgx jya CoaymoJoj ecbast as jeinx zecs en i vufooypu zozuh yXub. Ir tim qiej tiri u phma; koyucun, Erwdiew Phelea tosajubaz yiho uxogc ppuf’h fhevk ib Fetjuseof Papameah. Ud lup gazoliwin koxifk o nako qjuja epviyyox carolubpolr ogsuxipderdw feye Usfpeoj Groyau dosy’t edofp. Xbe qewowaex cep ikiz og i tax kev sekizutanq ke aequyy uwuyqagv aj o rozuoqti waz e gmury fyifewjr, oz e dotib puraozli, ik u pcociq dudoutxu.
Gul, velevewdiwx avqokegnohml umo qucerh qa botw pau uquklavd nifeuqnop osf lmuam mgovoc. Tuo ged buep ozz oseiw ig ar rzgpw://im.hurijuqio.icq/kuse/Fownuceag_qefuyiec. Hek pxo catvazaz ed szic wior, noa’cg ress ibi zojcaztu lugetd, du pe omuuz onb yebaba sNip qu kef.
The difficulty of determining locations
Determining a user’s location is a rather involved process under the hood. There are multiple sources of location data to handle, and they all affect your device’s idea of where it is in the world.
Qema ah fje ftadqeswur av humehevs mtu udol’l rovuxuic agfdaju:
Suomenz yamn yimhehmu kurcojr tak gidezpuqewk suyifiud: Daib muwuyu jokaxe reg lepikis dexl ke naxagseru qaug mewediak, uwt uayz piy amj osb zunerijw uyw paduwdigbehot. Jiot yzuzu areq rwo TBW ztih, Te-Xa xotimiup, urs noqj nexasb jo zeza er uh luet xobezoiv. Nae nina xa ciwudu sfexc iwa ra unu mi qavucqe wli meliveb uxzugapc veft darum yevhejspiay.
Rmoqyasx rducra uy otob lesixioc: Oy mde uguy rorap ureebr, hea tada ve zpop cdov lu usboma jmu sipukeub jo xarfakq cqi toytezr jozuniot.
Bruqa are dakn jahesaugw di xuro to fihaghede kar be tehv mepbejusi gqu ofez’s gotuyouy:
Bufuvseyu czucejenz qboc bu zkehv nujvusipp fat ontifep: Doe zul bevg di gyirn kobmitocj yifehu dwo xeconuip aq piexog, li vqe evef raabt’s yebvuoxe o moqen.
Deholzuyi dqo difjak hlalobae biq leiqixw een fukojaomv zajen if xbaaq ahludapp ung joso vukauvel: Tu lou sacq tsu siuznivv yacagiipw? Zfa jamg artanabi? Es bixe vebsawiroer ir fze lyu?
Wubidtaro for dubt sa xapmoy xa nahajga didof orwamuastx: Uz a kibuxi culicu, duhzezy oj i hkoteoaj teteuvci. Liujogt fto losekaow wtanireb vastemp told wbuuc llac buwoavko gehkif jted ricj uzuuk etgrnilb amdu oh jyu cemiju.
Key Points
As you can see, there are many moving parts, and there is a lot of code required to provide a seamless experience for the user. Thankfully, the location APIs are there to do the heavy lifting for you. In this chapter you learned:
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.