package Ġedu . uw . eep 5 2 3 . location example Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . Manifest . permission . ACCESS _ CO AR SE _ LOCATION Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . content . pm . PackageManager . PERMISSION _ GRAN TED Ċ import Ġandroid . location . Address Ċ import Ġandroid . location . Geo coder Ċ import Ġandroid . location . Location Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Settings Ċ import Ġcom . google . android . material . sn ackbar . Snackbar Ċ import Ġcom . google . android . material . sn ackbar . Snackbar . LENGTH _ IN DEFIN ITE Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . util . Log Ċ import Ġandroid . view . View Ċ import Ġandroid . widget . ProgressBar Ċ import Ġandroid . widget . TextView Ċ import Ġcom . google . android . gms . location . F used Location Provider Client Ċ import Ġcom . google . android . gms . location . Location Services Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġjava . io . IOException Ċ import Ġjava . util .* ĊĊĊ Ċ /** Ċ Ġ* ĠD emon str ates Ġuse Ġof Ġthe ĠLocation ĠAPI Ġto Ġretrieve Ġthe Ġlast Ġknown Ġlocation Ġfor Ġa Ġdevice . Ċ Ġ*/ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠVis ible Ġwhile Ġthe Ġaddress Ġis Ġbeing Ġfetched . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġlateinit Ġvar ĠprogressBar : ĠProgress Bar ĊĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" MainActivity " ĊĠĠĠ Ġprivate Ġval ĠREQUEST _ PERMISSION S _ REQUEST _ CODE Ġ= Ġ 3 4 ĊĠĠĠ Ġprivate Ġvar Ġaddress Requested Ġ= Ġfalse ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRepresents Ġa Ġgeo graphical Ġlocation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġlast Location : ĠLocation ? Ġ= Ġnull ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġformatted Ġlocation Ġaddress . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġaddress Output Ġ= Ġ"" ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġthe Ġentry Ġpoint Ġto Ġthe ĠF used ĠLocation ĠProvider ĠAPI . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġf used Location Client : ĠF used Location Provider Client ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlatitude Text : ĠTextView ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġlongitude Text : ĠTextView ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġgeo coder Ġ: ĠGeo coder ĊĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ ĠprogressBar Ġ= ĠfindViewById ( R . id . progress _ bar ) ĊĠĠĠĠĠĠĠ Ġlatitude Text Ġ= ĠfindViewById ( R . id . latitude _ text ) ĊĠĠĠĠĠĠĠ Ġlongitude Text Ġ= ĠfindViewById ( R . id . longitude _ text ) ĊĠĠĠĠĠĠĠ ĠprogressBar Ġ= ĠfindViewById ( R . id . progress _ bar ) ĊĠĠĠĠĠĠĠ Ġf used Location Client Ġ= ĠLocation Services . getF used Location Provider Client ( this ) ĊĠĠĠĠĠĠĠ Ġgeo coder Ġ= ĠGeo coder ( this , ĠLocale . getDefault ()) ĊĠĠĠĠĠĠĠ Ġupdate UI Widgets () ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġupdate UI Widgets () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( address Requested ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠProgress Bar . VISIBLE ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠprogressBar . visibility Ġ= ĠProgress Bar . GONE ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun ĠonStart () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onStart () ĊĠĠĠĠĠĠĠ Ġif Ġ(! check Permissions ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permissions () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetLast Location () ĊĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ////////////////////////////////////////////////////////////////// /////// ĊĠĠĠ Ġ// ĠĠĠĠĠĠ ĠGET TING ĠTHE ĠLOC ATION ĠIN ĠLONG IT UDE - LAT IT UDE ĠVALUES ĊĠĠĠ Ġ////////////////////////////////////////////////////////////////// //// ĊĠĠĠ Ġ// Function Ġcalled Ġwhen Ġthe Ġuser Ġclicks Ġon Ġthe Ġlocation Ġbutton ĊĠĠĠ Ġfun Ġlocation Button ( v : View ){ ĊĠĠĠĠĠĠĠ ĠgetLast Location () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠProvides Ġa Ġsimple Ġway Ġof Ġgetting Ġa Ġdevice 's Ġlocation Ġand Ġis Ġwell Ġsuit ed Ġfor ĊĠĠĠĠ Ġ* Ġapplications Ġthat Ġdo Ġnot Ġrequire Ġa Ġfine - gr ained Ġlocation Ġand Ġthat Ġdo Ġnot Ġneed Ġlocation ĊĠĠĠĠ Ġ* Ġupdates . ĠGets Ġthe Ġbest Ġand Ġmost Ġrecent Ġlocation Ġcurrently Ġavailable , Ġwhich Ġmay Ġbe Ġnull ĊĠĠĠĠ Ġ* Ġin Ġrare Ġcases Ġwhen Ġa Ġlocation Ġis Ġnot Ġavailable . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote : Ġthis Ġmethod Ġshould Ġbe Ġcalled Ġafter Ġlocation Ġpermission Ġhas Ġbeen Ġgranted . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetLast Location () Ġ{ ĊĠĠĠĠĠĠĠ Ġf used Location Client . last Location ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add On Complete Listener Ġ{ Ġtask Location Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( task Location . is Successful Ġ&& Ġtask Location . result Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Location Ġ= Ġtask Location . result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlatitude Text . text Ġ= Ġresources . getString ( R . string . latitude _ label ) Ġ+ Ġ": Ġ"+ last Location ?. latitude . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlongitude Text . text Ġ= Ġresources . getString ( R . string . longitude _ label ) Ġ+ Ġ": Ġ" Ġ+ last Location ?. longitude ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Snackbar ( R . string . no _ location _ detected ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ////////////////////////////////////////////////////////////////// /////// ĊĠĠĠ Ġ// ĠĠĠĠĠĠ ĠGET TING ĠTHE ĠLOC ATION ĠADDRESS ĊĠĠĠ Ġ////////////////////////////////////////////////////////////////// //// ĊĠĠĠ Ġ// This Ġfunc iton Ġis Ġcalled Ġwhen Ġthe Ġuser Ġclic s Ġon Ġthe Ġad ress Ġbutton ĊĠĠĠ Ġfun Ġhandle Button Address ( v : View ){ ĊĠĠĠĠĠĠĠ Ġaddress Requested Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġupdate UI Widgets () ĊĠĠĠĠĠĠĠ Ġget Address () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGets Ġthe Ġaddress Ġfor Ġthe Ġlast Ġknown Ġlocation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Address () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġaddresses : ĠList < Address > Ġ= Ġempty List () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( address Requested ) ĊĠĠĠĠĠĠĠ Ġ// ĠAddress Ġfound Ġusing Ġthe ĠGeo coder . ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Location Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġuser Ġpressed Ġthe Ġfetch Ġaddress Ġbutton Ġbefore Ġwe Ġhad Ġthe Ġlocation , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġwill Ġbe Ġset Ġto Ġtrue Ġindicating Ġthat Ġwe Ġshould Ġkick Ġoff Ġthe Ġintent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġservice Ġafter Ġfetching Ġthe Ġlocation . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUsing Ġget From Location () Ġreturns Ġan Ġarray Ġof ĠAdd resses Ġfor Ġthe Ġarea Ġimmediately ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsurrounding Ġthe Ġgiven Ġlatitude Ġand Ġlongitude . ĠThe Ġresults Ġare Ġa Ġbest Ġguess Ġand Ġare ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnot Ġguaranteed Ġto Ġbe Ġaccurate . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddresses Ġ= Ġgeo coder . get From Location ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Location !!. latitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Location !!. longitude , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIn Ġthis Ġsample , Ġwe Ġget Ġjust Ġa Ġsingle Ġaddress . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io Exception : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCatch Ġnetwork Ġor Ġother ĠI / O Ġproblems . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( il legal ArgumentException : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCatch Ġinvalid Ġlatitude Ġor Ġlongitude Ġvalues . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHandle Ġcase Ġwhere Ġno Ġaddress Ġwas Ġfound . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( addresses . isEmpty ()) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddress Ġ= Ġaddresses [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFetch Ġthe Ġaddress Ġlines Ġusing Ġ{@ code Ġget Address Line }, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġjoin Ġthem , Ġand Ġsend Ġthem Ġto Ġthe Ġthread . ĠThe Ġ{@ link Ġandroid . location . address } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġclass Ġprovides Ġother Ġoptions Ġfor Ġfetching Ġaddress Ġdetails Ġthat Ġyou Ġmay Ġprefer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto Ġuse . ĠHere Ġare Ġsome Ġexamples : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Local ity () Ġ(" Mount ain ĠView ", Ġfor Ġexample ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Admin Area () Ġ(" CA ", Ġfor Ġexample ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Postal Code () Ġ(" 9 4 0 4 3 ", Ġfor Ġexample ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget CountryCode () Ġ(" US ", Ġfor Ġexample ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Country Name () Ġ(" United ĠStates ", Ġfor Ġexample ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddress Fragments Ġ= Ġwith ( address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 .. max Address Line Index ). map Ġ{ Ġget Address Line ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Output Ġ= Ġ Ġaddress Fragments . join ToString ( separator Ġ= Ġ"\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext _ ad ress . text Ġ= Ġaddress Output ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaddress Requested Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate UI Widgets () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ////////////////////////////////////////////////////////////////// /////// ĊĠĠĠ Ġ// ĠĠĠ ĠFUNCTIONS ĠFOR ĠCHECK ING ĠAND ĠAS K ING ĠFOR ĠPER MISSION S ĊĠĠĠ Ġ////////////////////////////////////////////////////////////////// //// ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġcurrent Ġstate Ġof Ġthe Ġpermissions Ġneeded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck Permissions () Ġ= ĊĠĠĠĠĠĠĠ ĠActivity Compat . check Self Permission ( this , ĠACCESS _ CO AR SE _ LOCATION ) Ġ== ĠPER MISSION _ GRAN TED ĊĊĠĠĠ Ġprivate Ġfun Ġstart Location Permission Request () Ġ{ ĊĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĠarrayOf ( ACCESS _ CO AR SE _ LOCATION ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST _ PERMISSION S _ REQUEST _ CODE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Permissions () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Activity Compat . should Show Request Permission R ationale ( this , ĠACCESS _ CO AR SE _ LOCATION )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠProvide Ġan Ġadditional Ġr ationale Ġto Ġthe Ġuser . ĠThis Ġwould Ġhappen Ġif Ġthe Ġuser Ġdenied Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrequest Ġpreviously , Ġbut Ġdidn 't Ġcheck Ġthe Ġ" Don 't Ġask Ġagain " Ġcheckbox . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Display ing Ġpermission Ġr ationale Ġto Ġprovide Ġadditional Ġcontext .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshow Snackbar ( R . string . permission _ ration ale , Ġandroid . R . string . ok , ĠView . OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRequest Ġpermission ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Location Permission Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRequest Ġpermission . ĠIt 's Ġpossible Ġthis Ġcan Ġbe Ġauto Ġanswered Ġif Ġdevice Ġpolicy ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsets Ġthe Ġpermission Ġin Ġa Ġgiven Ġstate Ġor Ġthe Ġuser Ġdenied Ġthe Ġpermission ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpreviously Ġand Ġchecked Ġ" Never Ġask Ġagain ". ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i ( TAG , Ġ" Request ing Ġpermission ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Location Permission Request () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCallback Ġreceived Ġwhen Ġa Ġpermissions Ġrequest Ġhas Ġbeen Ġcompleted . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < String >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠREQUEST _ PERMISSION S _ REQUEST _ CODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġuser Ġinteraction Ġwas Ġinterrupted , Ġthe Ġpermission Ġrequest Ġis Ġcancelled Ġand Ġyou ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreceive Ġempty Ġarrays . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgrant Results . isEmpty () Ġ-> ĠLog . i ( TAG , Ġ" User Ġinteraction Ġwas Ġcancelled .") ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPermission Ġgranted . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( grant Results [ 0 ] Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ) Ġ-> { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Address () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetLast Location () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPermission Ġdenied . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNotify Ġthe Ġuser Ġvia Ġa ĠSn ackBar Ġthat Ġthey Ġhave Ġrejected Ġa Ġcore Ġpermission Ġfor Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġapp , Ġwhich Ġmakes Ġthe ĠActivity Ġuseless . ĠIn Ġa Ġreal Ġapp , Ġcore Ġpermissions Ġwould ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġtypically Ġbe Ġbest Ġrequested Ġduring Ġa Ġwelcome - screen Ġflow . ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdditionally , Ġit Ġis Ġimportant Ġto Ġremember Ġthat Ġa Ġpermission Ġmight Ġhave Ġbeen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrejected Ġwithout Ġasking Ġthe Ġuser Ġfor Ġpermission Ġ( device Ġpolicy Ġor Ġ" Never Ġask ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġagain " Ġpromp ts ). ĠTherefore , Ġa Ġuser Ġinterface Ġaff ordance Ġis Ġtypically Ġimplemented ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġpermissions Ġare Ġdenied . ĠOtherwise , Ġyour Ġapp Ġcould Ġappear Ġun responsive Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġto uches Ġor Ġinteractions Ġwhich Ġhave Ġrequired Ġpermissions . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Snackbar ( R . string . permission _ den ied _ explanation , ĠR . string . settings , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠView . OnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBuild Ġintent Ġthat Ġdisplays Ġthe ĠApp Ġsettings Ġscreen . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaction Ġ= ĠSettings . ACTION _ APPLICATION _ DETAILS _ SETTINGS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Ġ= ĠUri . from Parts (" package ", ĠpackageName , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflags Ġ= ĠIntent . FLAG _ ACTIVITY _ NEW _ TASK ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity ( intent ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ////////////////////////////////////////////////////////////////// /////// ĊĠĠĠ Ġ// ĠĠĠĠĠĠ ĠSHOW ĠA ĠSN ACK ĠBAR ĊĠĠĠ Ġ////////////////////////////////////////////////////////////////// //// ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠShows Ġa Ġ[ Snackbar ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsn ack Str Id ĠThe Ġid Ġfor Ġthe Ġstring Ġresource Ġfor Ġthe ĠSn ackbar Ġtext . ĊĠĠĠĠ Ġ* Ġ@ param Ġaction Str Id ĠThe Ġtext Ġof Ġthe Ġaction Ġitem . ĊĠĠĠĠ Ġ* Ġ@ param Ġlistener ĠThe Ġlistener Ġassociated Ġwith Ġthe ĠSn ackbar Ġaction . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow Snackbar ( ĊĠĠĠĠĠĠĠ Ġsn ack Str Id : ĠInt , ĊĠĠĠĠĠĠĠ Ġaction Str Id : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġlistener : ĠView . OnClickListener ? Ġ= Ġnull ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsn ackbar Ġ= ĠSn ackbar . make ( findViewById ( android . R . id . content ), ĠgetString ( sn ack Str Id ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLEN GTH _ IN DEFIN ITE ) ĊĠĠĠĠĠĠĠ Ġif Ġ( action Str Id Ġ!= Ġ 0 Ġ&& Ġlistener Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsn ackbar . setAction ( getString ( action Str Id ), Ġlistener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsn ackbar . show () ĊĠĠĠ Ġ} Ċ } Ċ