package Ġcom . github . dr jack y . image picker . provider Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroidx . activity . result . Activity Result Ċ import Ġandroidx . core . app . Activity Compat . request Permissions Ċ import Ġcom . github . dr jack y . image picker . Image Picker Activity Ċ import Ġcom . github . dr jack y . image picker . R Ċ import Ġcom . github . dr jack y . image picker . util . File Util Ċ import Ġcom . github . dr jack y . image picker . util . Intent Utils Ċ import Ġcom . github . dr jack y . image picker . util . Permission Util Ċ Ċ /** Ċ Ġ* ĠCapture Ġnew Ġimage Ġusing Ġcamera Ċ Ġ* Ċ Ġ* Ġ@ author ĠD hav al ĠP ate l Ċ Ġ* Ġ@ version Ġ 1 . 0 Ċ Ġ* Ġ@ since Ġ 0 4 ĠJanuary Ġ 2 0 1 9 Ċ Ġ*/ Ċ class ĠCamera Provider ( ĊĠĠĠ Ġactivity : ĠImage Picker Activity , ĊĠĠĠ Ġprivate Ġval Ġtry Front Camera : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġprivate Ġval Ġlauncher : Ġ( Intent ) Ġ-> ĠUnit Ċ ) Ġ: ĊĠĠĠ ĠBase Provider ( activity ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠKey Ġto ĠSave / Retrieve ĠCamera ĠFile Ġstate ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSTATE _ CAMERA _ URI Ġ= Ġ" state . camera _ uri " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠPermission ĠRequire Ġfor ĠImage ĠCapture Ġusing ĠCamera ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠREQUIRED _ PERMISSION S Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . READ _ EXTERNAL _ STORAGE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . CAMERA ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠPermission ĠRequire Ġfor ĠImage ĠCapture Ġusing ĠCamera ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠREQUIRED _ PERMISSION S _ EXT ENDED Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . WRITE _ EXTERNAL _ STORAGE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠManifest . permission . CAMERA ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠPER MISSION _ INT ENT _ REQ _ CODE Ġ= Ġ 4 2 8 2 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTemp ĠCamera ĠFile ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġm Camera Uri : ĠUri ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSave ĠCamera Provider Ġstate ĊĊĠĠĠĠ Ġ* Ġm Camera File Ġwill Ġlose Ġits Ġstate Ġwhen Ġactivity Ġis Ġre created Ġon ĊĠĠĠĠ Ġ* ĠOrientation Ġchange Ġor Ġfor ĠLow Ġmemory Ġdevice . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠHere , ĠWe ĠWill Ġsave Ġits Ġstate Ġfor Ġlater Ġuse ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote : ĠTo Ġproduce Ġthis Ġscenario , Ġenable Ġ" Don 't Ġkeep Ġactivities " Ġfrom Ġdeveloper Ġoptions ĊĠĠĠĠ Ġ**/ ĊĠĠĠ Ġoverride Ġfun Ġon Save InstanceState ( out State : ĠBundle ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSave ĠCamera ĠFile ĊĠĠĠĠĠĠĠ Ġout State . put Parcelable ( STATE _ CAMERA _ URI , Ġm Camera Uri ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRetrieve ĠCamera Provider Ġstate ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Restore InstanceState ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠRestore ĠCamera ĠFile ĊĠĠĠĠĠĠĠ Ġm Camera Uri Ġ= ĠsavedInstanceState ?. get Parcelable ( STATE _ CAMERA _ URI ) Ġas ĠUri ? ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart ĠCamera ĠCapture ĠIntent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart Intent () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! Intent Utils . is Camera App Available ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetError ( R . string . error _ camera _ app _ not _ found ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġcheck Permission () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck ĠRequire Ġpermission Ġfor ĠT aking ĠPicture . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIf Ġpermission Ġis Ġnot Ġgranted Ġrequest ĠPermission , ĠElse Ġstart ĠCamera ĠIntent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġcheck Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( is Permission Granted ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPermission ĠGr anted , ĠStart ĠCamera ĠIntent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstart Camera Intent () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRequest ĠPermission ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Permission () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart ĠCamera ĠIntent ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠCreate ĠTemporary ĠFile Ġobject Ġand ĠPass Ġit Ġto ĠCamera ĠIntent ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġstart Camera Intent () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġand Ġget Ġempty Ġfile Ġto Ġstore Ġcapture Ġimage Ġcontent ĊĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠFile Util . getImage Uri ( this ) ĊĠĠĠĠĠĠĠ Ġm Camera Uri Ġ= Ġuri ĊĊĠĠĠĠĠĠĠ Ġ// ĠCheck Ġif Ġfile Ġexists ĊĠĠĠĠĠĠĠ Ġif Ġ( uri Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlauncher . invoke ( Intent Utils . get Camera Intent ( uri , Ġtry Front Camera )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠsetError ( R . string . error _ failed _ to _ create _ camera _ image _ file ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠHandle ĠRequest ed ĠPermission ĠResult ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Request Permissions Result ( request Code : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( request Code Ġ== ĠPER MISSION _ INT ENT _ REQ _ CODE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġagain Ġif Ġpermission Ġis Ġgranted ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Permission Granted ( this )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠPermission Ġis Ġgranted , ĠStart ĠCamera ĠIntent ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Camera Intent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠExit Ġwith Ġerror Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Res Ġ= ĠR . string . permission _ camera _ den ied ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠsetError ( getString ( error Res )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhandle Result ( result : ĠActivity Result ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( result . result Code Ġ== ĠActivity . RESULT _ OK ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġactivity . setImage ( m Camera Uri !! , Ġis Camera Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Result Cancel () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDelete ĠCamera Ġfile Ġis Ġexists ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġon Failure () Ġ{ ĊĠĠĠĠĠĠĠ Ġdelete () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDelete ĠCamera ĠFile , ĠIf Ġnot Ġrequired ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAfter ĠCamera ĠImage ĠC rop / Compress ĠOriginal ĠFile Ġwill Ġnot Ġrequired ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdelete () Ġ{ ĊĠĠĠĠĠĠĠ Ġm Camera Uri ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver . delete ( it , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Camera Uri Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRequest ĠRuntime ĠPermission Ġrequired Ġfor ĠT aking ĠP ictures . ĊĠĠĠĠ Ġ* ĠĠ ĠRef : Ġhttps :// github . com / D hav al 2 4 0 4 / Image Picker / issues / 3 4 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġrequest Permission () Ġ{ ĊĠĠĠĠĠĠĠ Ġrequest Permissions ( activity , Ġget Required Permission ( activity ), ĠPER MISSION _ INT ENT _ REQ _ CODE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġrequire Ġpermission Ġgranted Ġfor ĠT aking ĠPicture . ĊĠĠĠĠ Ġ* ĠĠ ĠRef : Ġhttps :// github . com / D hav al 2 4 0 4 / Image Picker / issues / 3 4 ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext ĠApplication ĠContext ĊĠĠĠĠ Ġ* Ġ@ return Ġboolean Ġtrue Ġif Ġall Ġrequired Ġpermission Ġgranted Ġelse Ġfalse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġis Permission Granted ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Required Permission ( context ). none Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ! Permission Util . is Permission Granted ( context , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCheck Ġif Ġpermission ĠEx ists Ġin ĠManifest ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext ĠApplication ĠContext ĊĠĠĠĠ Ġ* Ġ@ return ĠArray < String > Ġreturns Ġpermission Ġwhich Ġare Ġadded Ġin ĠManifest ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Required Permission ( context : ĠContext ): ĠArray < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠREQUIRED _ PERMISSION S . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPermission Util . is Permission In Manifest ( context , Ġit ) ĊĠĠĠĠĠĠĠ Ġ}. to Typed Array () ĊĠĠĠ Ġ} Ċ Ċ } Ċ