package Ġcom . m zm . t flite . sample . self ie 2 anime . fragments Ċ Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . graphics . Matrix Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . util . Log Ċ import Ġandroid . util . Size Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroidx . camera . core .* Ċ import Ġandroidx . camera . lifecycle . Process Camera Provider Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . fragment . app . Fragment Ċ import Ġandroidx . navigation . fragment . find Nav Controller Ċ import Ġcom . m zm . t flite . sample . self ie 2 anime . MainActivity . Companion . getOutput Directory Ċ import Ġkotlinx . android . synt hetic . main . fragment _ camera .* Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . io . IOException Ċ import Ġjava . io . OutputStream Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . ExecutorService Ċ import Ġjava . util . concurrent . Executors Ċ import Ġcom . m zm . t flite . sample . self ie 2 anime . R Ċ Ċ /** Ċ Ġ* ĠA Ġsimple Ġ[ Fragment ] Ġsubclass Ġthat Ġcaptures Ġa Ġphoto Ġwith ĠCamera X Ċ Ġ*/ Ċ class ĠCamera Fragment Ġ: ĠFragment () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġpreview : ĠPreview ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġimage Capture : ĠImage Capture ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcamera : ĠCamera ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġbitmap : ĠBitmap ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġoutput Directory : ĠFile ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġcamera Executor : ĠExecutor Service ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠĠĠĠĠ Ġinflater : ĠLayoutInflater , Ġcontainer : ĠViewGroup ?, ĊĠĠĠĠĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠĠĠ Ġ): ĠView ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInf late Ġthe Ġlayout Ġfor Ġthis Ġfragment ĊĠĠĠĠĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . fragment _ camera , Ġcontainer , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon View Created ( view : ĠView , ĠsavedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on View Created ( view , ĠsavedInstanceState ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSetup Ġthe Ġlistener Ġfor Ġtake Ġphoto Ġbutton ĊĠĠĠĠĠĠĠ Ġcamera _ capture _ button . setOnClickListener Ġ{ Ġtake Photo () Ġ} ĊĊĠĠĠĠĠĠĠ Ġoutput Directory Ġ= Ġget Output Directory ( require Context ()) ĊĊĠĠĠĠĠĠĠ Ġcamera Executor Ġ= ĠExec utors . new Single Thread Executor () ĊĊĠĠĠĠĠĠĠ Ġstart Camera () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstart Camera () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcamera Provider Future Ġ= ĠProcess Camera Provider . getInstance ( require Context ()) ĊĊĠĠĠĠĠĠĠ Ġcamera Provider Future . addListener ( Runnable Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUsed Ġto Ġbind Ġthe Ġlifecycle Ġof Ġcameras Ġto Ġthe Ġlifecycle Ġowner ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcamera Provider : ĠProcess Camera Provider Ġ= Ġcamera Provider Future . get () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġup ĠPreview ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Ġ= ĠPreview . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġset Ġup ĠCapture ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Capture Ġ= ĠImage Capture . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Capture Mode ( Image Capture . CAPTURE _ MODE _ MIN IM IZE _ LAT ENCY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTarget Resolution ( Size ( 5 1 2 , Ġ 5 1 2 )) Ġ// ĠM arg aret Ġset Ġtarget Ġresolution Ġto Ġ 5 1 2 x 5 1 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSelect Ġfront Ġcamera Ġas Ġdefault Ġfor Ġself ie ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcamera Selector Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCamera Selector . Builder (). require Lens Facing ( Camera Selector . LEN S _ F ACING _ FRONT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () Ġ// M arg aret Ġchange Ġcamera Ġto Ġfront Ġfacing ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠU nb ind Ġuse Ġcases Ġbefore Ġre binding ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Provider . unbind All () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBind Ġuse Ġcases Ġto Ġcamera ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcamera Ġ= Ġcamera Provider . bind To Lifecycle ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , Ġcamera Selector , Ġpreview , Ġimage Capture ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview . set Imp lem nt ation Mode Ġ= ĠPreview View . Implementation Mode . TEXTURE _ VIEW Ġ// ĠM arg aret Ġset Ġto ĠTexture View Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview . set Preferred Implementation Mode () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview ?. set Surface Provider ( view Finder . create Surface Provider ( camera ?. camera Info )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Use Ġcase Ġbinding Ġfailed ", Ġexc ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ}, ĠContext Compat . get Main Executor ( require Context ())) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtake Photo () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠGet Ġa Ġstable Ġreference Ġof Ġthe Ġmod ifiable Ġimage Ġcapture Ġuse Ġcase ĊĠĠĠĠĠĠĠ Ġval Ġimage Capture Ġ= Ġimage Capture Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// ĠCreate Ġtimestamp ed Ġoutput Ġfile Ġto Ġhold Ġthe Ġimage ĊĠĠĠĠĠĠĠ Ġval Ġphoto File Ġ= ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Directory , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSimpleDateFormat ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFIL ENAME _ FORMAT , ĠLocale . US ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ). format ( System . currentTimeMillis ()) Ġ+ Ġ". jpg " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠM arg aret : Ġconvert Ġfrom ĠImage Proxy Ġto ĠBitmap Ġthen Ġpass ĠBitmap Ġfor Ġmodel Ġinference ĊĠĠĠĠĠĠĠ Ġimage Capture . take Picture ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContext Compat . get Main Executor ( require Context ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠImage Capture . On Image Capt ured Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Capture Success ( image : ĠImage Proxy ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġimage . planes [ 0 ]. buffer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . rewind () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠByteArray ( buffer . remaining ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . get ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ= ĠBitmap Factory . decode ByteArray ( bytes , Ġ 0 , Ġbytes . size , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdegrees Ġ= Ġimage . image Info . rotation Degrees ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠM arg aret ĠTODO : Ġmove Ġthis Ġcode Ġto ĠSelf ie 2 anime Fragment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( degrees Ġ!= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap Ġ= Ġrotate Bitmap ( bitmap !! , Ġdegrees ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfilePath Ġ= Ġsave Bitmap ( bitmap , Ġphoto File ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaction Ġ= ĠCamera Fragment Directions . action Camera To Self ie 2 anime ( filePath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( action ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave Bitmap ( bitmap : ĠBitmap ?, Ġfile : ĠFile ): ĠString Ġ{ ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream : ĠOutputStream Ġ= ĠFileOutputStream ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbitmap ?. compress ( Bitmap . Compress Format . JPEG , Ġ 1 0 0 , Ġstream ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream . flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstream . close () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfile . absolute Path ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrotate Bitmap ( bitmap : ĠBitmap , Ġrotation Degrees : ĠInt ): ĠBitmap Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġrotation Matrix Ġ= ĠMatrix () ĊĠĠĠĠĠĠĠ Ġrotation Matrix . post Rotate ( rotation Degrees . toFloat ()) ĊĠĠĠĠĠĠĠ Ġval Ġrotated Bitmap Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap . create Bitmap ( bitmap , Ġ 0 , Ġ 0 , Ġbitmap . width , Ġbitmap . height , Ġrotation Matrix , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġbitmap . recycle () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrotated Bitmap ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Resume () ĊĠĠĠĠĠĠĠ Ġ// ĠMake Ġsure Ġthat Ġall Ġpermissions Ġare Ġstill Ġgranted ĊĠĠĠĠĠĠĠ Ġif Ġ(! Permissions Fragment . all Permissions Granted ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequire Context () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Nav Controller (). navigate ( R . id . action _ camera _ to _ permissions ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Camera Fragment " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠFIL ENAME _ FORMAT Ġ= Ġ" yyyy - MM - dd - HH - mm - ss - SS S " ĊĠĠĠ Ġ} Ċ }