/* Ċ Ġ* ĠMust Ġhave ĠGoogle ĠMaps Ġapplication Ġinstalled Ċ Ġ*/ Ċ Ċ package Ġcourse . examples . map location from contacts Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Target Api Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Contacts Contract Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . Toast Ċ Ċ // Se veral ĠActivity Ġlifecycle Ġmethods Ġare Ġinstrument ed Ġto Ġemit ĠLog Cat Ġoutput Ċ // so Ġyou Ġcan Ġfollow Ġthis Ġclass ' Ġlifecycle Ċ Ċ class ĠMap Location From Contacts Activity Ġ: ĠActivity () Ġ{ ĊĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠThese Ġvariables Ġare Ġsh orthand Ġaliases Ġfor Ġdata Ġitems Ġin ĠContact s - related Ġdatabase Ġtables ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠCONTENT _ ITEM _ TYPE Ġ= ĠContact s Contract . Common Data Kinds . Structured Postal . CONTENT _ TYPE ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFORM ATT ED _ ADDRESS Ġ= ĠContact s Contract . Common Data Kinds . Structured Postal . FORMAT TED _ ADDRESS ĊĊĠĠĠĠĠĠĠ Ġ// ĠThese Ġvariables Ġare Ġused Ġfor Ġinteraction Ġwith ĠContact s Ġapp ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠP ICK _ CONTACT _ REQUEST Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPER MISSION S _ P ICK _ CONTACT _ REQUEST Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠREAD _ CONTACT S _ PERM Ġ= ĠManifest . permission . READ _ CONTACT S ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Map Location From Contacts " ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġhas Permission : ĠBoolean Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbutton : ĠButton ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . main ) ĊĊĠĠĠĠĠĠĠ Ġbutton Ġ= ĠfindViewById ( R . id . map Button ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠCalled Ġwhen Ġuser Ġclicks Ġthe ĠShow ĠMap Ġbutton ĊĠĠĠĠĠĠĠ Ġbutton . setOnClickListener Ġ{ Ġget Contact () Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġneeds Runtime Permission (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthe ĠSDK Ġversion Ġand Ġwhether Ġthe Ġpermission Ġis Ġalready Ġgranted . ĊĠĠĠĠĠĠĠ Ġreturn ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . M Ġ&& Ġcheck Self Permission ( READ _ CONTACT S _ PERM ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Target Api ( Build . VERSION _ CODES . M ) ĊĠĠĠ Ġprivate Ġfun Ġget Contact () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠStep Ġ 1 : ĠEnsure Ġpermissions ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Permission Ġ&& Ġneeds Runtime Permission ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions ( array Of ( READ _ CONTACT S _ PERM ), ĠPER MISSION S _ P ICK _ CONTACT _ REQUEST ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Contacts App () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( request Code : ĠInt , Ġpermissions : ĠArray < String >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠPER MISSION S _ P ICK _ CONTACT _ REQUEST ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPermission Ġis Ġgranted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Permission Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Contacts App () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" This Ġapp Ġrequires Ġaccess Ġto Ġyour Ġcontact Ġlist ", ĠToast . LENGTH _ SHORT ). show () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠStep Ġ 2 : ĠStart ĠContact s ĊĠĠĠ Ġprivate Ġfun Ġstart Contacts App () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate ĠIntent Ġobject Ġfor Ġpicking Ġdata Ġfrom ĠContact s Ġdatabase ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ P ICK ) ĊĠĠĠĠĠĠĠ Ġintent . type Ġ= ĠCONTENT _ ITEM _ TYPE ĊĊĠĠĠĠĠĠĠ Ġif Ġ( package Manager . resolve Activity ( intent , Ġ 0 ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUse Ġintent Ġto Ġstart ĠContact s Ġapplication ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠVariable ĠP ICK _ CONTACT _ REQUEST Ġidentifies Ġthis Ġoperation ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , ĠP ICK _ CONTACT _ REQUEST ) ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCallback Ġinvoked Ġafter Ġpicking Ġcontact ĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġthat Ġthis Ġcall Ġis Ġthe Ġresult Ġof Ġa Ġsuccessful ĠP ICK _ CONTACT _ REQUEST Ġrequest ĊĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== ĠRESULT _ OK Ġ&& Ġrequest Code Ġ== ĠP ICK _ CONTACT _ REQUEST ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThese Ġdetails Ġare Ġcovered Ġin Ġthe Ġlesson Ġon ĠContent Providers ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontact Uri Ġ= Ġdata . data Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprojection Ġ= ĠarrayOf ( FORMAT TED _ ADDRESS ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcr Ġ= Ġcontent Resolver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcursor Ġ= Ġcr . query ( contact Uri , Ġprojection , Ġnull , Ġnull , Ġnull ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġcursor Ġ&& Ġcursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber Index Ġ= Ġcursor . getColumnIndex ( FORMAT TED _ ADDRESS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġformatted Address : ĠString ? Ġ= Ġcursor . getString ( number Index ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġformatted Address ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠProcess Ġtext Ġfor Ġnetwork Ġtransmission ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġformatted Address Ġ= Ġformatted Address . replace (' Ġ', Ġ'+ ') ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate ĠIntent Ġobject Ġfor Ġstarting ĠGoogle ĠMaps Ġapplication ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgeo Intent Ġ= ĠIntent ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠIntent . ACTION _ VIEW , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" geo : 0 , 0 ? q =$ formatted Address ")) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUse Ġthe ĠIntent Ġto Ġstart ĠGoogle ĠMaps Ġapplication Ġusing ĠActivity . startActivity () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( geo Intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor ?. close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Restart () Ġ{ ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" The Ġactivity Ġis Ġabout Ġto Ġbe Ġrestarted .") ĊĠĠĠĠĠĠĠ Ġsuper . on Restart () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" The Ġactivity Ġis Ġabout Ġto Ġbecome Ġvisible .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" The Ġactivity Ġhas Ġbecome Ġvisible Ġ( it Ġis Ġnow Ġ\" res umed \") ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Pause () ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Another Ġactivity Ġis Ġtaking Ġfocus Ġ( this Ġactivity Ġis Ġabout Ġto Ġbe Ġ\" paused \") ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Stop () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Stop () ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" The Ġactivity Ġis Ġno Ġlonger Ġvisible Ġ( it Ġis Ġnow Ġ\" stopped \") ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" The Ġactivity Ġis Ġabout Ġto Ġbe Ġdestroyed .") ĊĠĠĠ Ġ} Ċ } Ċ