package Ġcom . rev ature . expiration _ date Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . widget . Button Ċ import Ġandroid . widget . Toast Ċ import Ġandroidx . activity . Component Activity Ċ import Ġandroidx . camera . core . Camera Selector Ċ import Ġandroidx . camera . core . Image Capture Ċ import Ġandroidx . camera . core . Image Capture Exception Ċ import Ġandroidx . camera . core . Preview Ċ import Ġandroidx . camera . lifecycle . Process Camera Provider Ċ import Ġandroidx . camera . view . Preview View Ċ import Ġandroidx . core . app . Activity Compat Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġjava . io . File Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ Ċ class ĠCamera Function Ġ: ĠComponent Activity () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġimage Capture : ĠImage Capture ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġoutput Directory : ĠFile ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcamera Executor : ĠExecutor Service ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġbtn Capture : ĠButton ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġview Finder : ĠPreview View ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠREQUIRED _ PERMISSION S Ġ= ĠarrayOf ( Manifest . permission . CAMERA ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠREQUEST _ CODE _ PERMISSION S Ġ= Ġ 1 0 ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTAG Ġ= Ġ" Camera X " ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠFIL ENAME _ FORMAT Ġ= Ġ" yyyy - MM - dd - HH - mm - ss - SS S " ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĠĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĊĠĠĠĠĠĠĠ Ġbtn Capture Ġ= ĠfindViewById ( R . id . camera _ capture _ button ) ĊĠĠĠĠĠĠĠ Ġview Finder Ġ= ĠfindViewById ( R . id . view Finder ) ĊĊĊĠĠĠĠĠĠĠ Ġ// request Ġpermissions ĊĊĠĠĠĠĠĠĠ Ġif Ġ( all Permission Granted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Camera () ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠActivity Compat . request Permissions ( this , ĠREQUIRED _ PERMISSION S , ĠREQUEST _ CODE _ PERMISSION S ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// set Ġthe Ġlistener Ġfor Ġthe Ġbutton ĊĊĠĠĠĠĠĠĠ Ġbtn Capture . setOnClickListener Ġ{ Ġtake Photo () Ġ} ĊĊĠĠĠĠĠĠĠ Ġoutput Directory Ġ= Ġget Output Directory () ĊĊĠĠĠĠĠĠĠ Ġcamera Executor Ġ= ĠExec utors . new Single Thread Executor () ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠĠĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠĠĠĠĠ Ġpermissions : ĠArray < out ĠString >, ĊĠĠĠĠĠĠĠ Ġgrant Results : ĠInt Array ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠREQUEST _ CODE _ PERMISSION S ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( all Permission Granted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Camera () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( this , Ġ" Permission Ġnot Ġgranted Ġby Ġuser ", ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinish () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġall Permission Granted () Ġ= ĠREQUIRED _ PERMISSION S . all Ġ{ ĊĊĠĠĠĠĠĠĠ ĠContext Compat . check Self Permission ( base Context , Ġit ) Ġ== ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Camera () Ġ{ ĊĊĊĠĠĠĠĠĠĠ Ġval Ġcamera Provider Future Ġ= ĠProcess Camera Provider . getInstance ( this ) ĊĊĠĠĠĠĠĠĠ Ġcamera Provider Future . addListener ( Runnable Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcamera Provider : ĠProcess Camera Provider Ġ= Ġcamera Provider Future . get () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// preview ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpreview Ġ= ĠPreview . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġit . set Surface Provider ( view Finder . surface Provider ) Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Capture Ġ= ĠImage Capture . Builder (). build () ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcamera Selector Ġ= ĠCamera Selector . DEFAULT _ BACK _ CAMERA ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Provider . unbind All () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Provider . bind To Lifecycle ( this , Ġcamera Selector , Ġpreview , Ġimage Capture ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" use Ġcase Ġbinding Ġfailed ", Ġexc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}, ĠContext Compat . get Main Executor ( this )) ĊĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Output Directory (): ĠFile Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmedia Dir Ġ= Ġexternal Media Dirs . first OrNull ()?. let Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( it , Ġresources . getString ( R . string . app _ name )). apply Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmkdir s () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( media Dir Ġ!= Ġnull Ġ&& Ġmedia Dir . exists ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia Dir Ġelse Ġfiles Dir ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtake Photo () Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġimage Capture Ġ= Ġimage Capture Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// create Ġa Ġfile Ġto Ġhold Ġthe Ġimage ĊĊĠĠĠĠĠĠĠ Ġval Ġphoto File Ġ= ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Directory , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSimpleDateFormat ( FILENAME _ FORMAT , ĠLocale . US ). format ( System . currentTimeMillis ()) Ġ+ Ġ". jpg " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// create Ġoutput Ġoptions Ġobject Ġwhich Ġcontains ĠFile + metadata ĊĊĠĠĠĠĠĠĠ Ġval Ġoutput Options Ġ= ĠImage Capture . OutputFile Options . Builder ( photo File ). build () ĊĊĠĠĠĠĠĠĠ Ġimage Capture . take Picture ( output Options , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Main Executor ( this ), Ġobject Ġ: ĠImage Capture . On Image Saved Callback Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun ĠonError ( exception : ĠImage Capture Exception ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Photo ĠCapture ĠFailed :${ exception . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Image Saved ( output : ĠImage Capture . OutputFile Results ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsaved File Ġ= ĠUri . from File ( photo File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmsg Ġ= Ġ" Photo Ġcaptured Ġsuccessfully : Ġ$ saved File " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToast . makeText ( base Context , Ġmsg , ĠToast . LENGTH _ LONG ). show () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . d ( TAG , Ġmsg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Destroy () ĊĠĠĠĠĠĠĠ Ġcamera Executor . shutdown () ĊĠĠĠ Ġ} Ċ Ċ }