/* ĠCopyright Ġ 2 0 1 7 ĠThe ĠTensorFlow ĠAuthors . ĠAll ĠRights ĠReserved . Ċ Ċ Licensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ you Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ You Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat ĊĊĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ċ Unless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ distributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ WITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ See Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ limitations Ġunder Ġthe ĠLicense . Ċ ================================================================ ============== */ Ċ Ċ package Ġcom . ed vard . pose est imation Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . AlertDialog Ċ import Ġandroid . app . Dialog Ċ import Ġandroid . app . Dialog Fragment Ċ import Ġandroid . app . Fragment Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . content . res . Configuration Ċ import Ġandroid . graphics . Image Format Ċ import Ġandroid . graphics . Matrix Ċ import Ġandroid . graphics . Point Ċ import Ġandroid . graphics . Rect F Ċ import Ġandroid . graphics . Surface Texture Ċ import Ġandroid . hardware . camera 2 . Camera AccessException Ċ import Ġandroid . hardware . camera 2 . Camera Capture Session Ċ import Ġandroid . hardware . camera 2 . Camera Character istics Ċ import Ġandroid . hardware . camera 2 . Camera Device Ċ import Ġandroid . hardware . camera 2 . Camera Manager Ċ import Ġandroid . hardware . camera 2 . Capture Request Ċ import Ġandroid . hardware . camera 2 . Capture Result Ċ import Ġandroid . hardware . camera 2 . Total Capture Result Ċ import Ġandroid . media . Image Reader Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Handler Thread Ċ import Ġandroid . support . v 1 3 . app . Fragment Compat Ċ import Ġandroid . support . v 4 . content . Context Compat Ċ import Ġandroid . util . Log Ċ import Ġandroid . util . Size Ċ import Ġandroid . view . LayoutInflater Ċ import Ġandroid . view . Surface Ċ import Ġandroid . view . Texture View Ċ import Ġandroid . view . View Ċ import Ġandroid . view . ViewGroup Ċ import Ġandroid . widget . TextView Ċ import Ġandroid . widget . Toast Ċ import Ġjava . io . IOException Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . Arrays Ċ import Ġjava . util . Collections Ċ import Ġjava . util . Comparator Ċ import Ġjava . util . concurrent . Semaphore Ċ import Ġjava . util . concurrent . TimeUnit Ċ Ċ /** Ċ Ġ* ĠBasic Ġfragments Ġfor Ġthe ĠCamera . Ċ Ġ*/ Ċ class ĠCamera 2 Basic Fragment Ġ: ĠFragment (), ĠFragment Compat . On Request Permissions Result Callback Ġ{ ĊĊĠ Ġprivate Ġval Ġlock Ġ= ĠAny () ĊĠ Ġprivate Ġvar Ġrun Classifier Ġ= Ġfalse ĊĠ Ġprivate Ġvar Ġchecked Permissions Ġ= Ġfalse ĊĠ Ġprivate Ġvar ĠtextView : ĠTextView ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġtexture View : ĠAuto Fit Texture View ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġlayout Frame : ĠAuto Fit Frame Layout ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġdraw View : ĠDraw View ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġclassifier : ĠImage Classifier ? Ġ= Ġnull ĊĠ Ġprivate Ġvar Ġlayout Bottom : ĠViewGroup ? Ġ= Ġnull ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ[ Texture View . Surface Texture Listener ] Ġhandles Ġseveral Ġlifecycle Ġevents Ġon Ġa Ġ[ Ġ]. ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġsurface Texture Listener Ġ= Ġobject Ġ: ĠTexture View . Surface Texture Listener Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġon Surface Texture Available ( ĊĠĠĠĠĠ Ġtexture : ĠSurface Texture , ĊĠĠĠĠĠ Ġwidth : ĠInt , ĊĠĠĠĠĠ Ġheight : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġopen Camera ( width , Ġheight ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Surface Texture Size Changed ( ĊĠĠĠĠĠ Ġtexture : ĠSurface Texture , ĊĠĠĠĠĠ Ġwidth : ĠInt , ĊĠĠĠĠĠ Ġheight : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġconfigure Transform ( width , Ġheight ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Surface Texture Destroyed ( texture : ĠSurface Texture ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Surface Texture Updated ( texture : ĠSurface Texture ) Ġ{} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠID Ġof Ġthe Ġcurrent Ġ[ Camera Device ]. ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġvar Ġcamera Id : ĠString ? Ġ= Ġnull ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠA Ġ[ Camera Capture Session ] Ġfor Ġcamera Ġpreview . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġvar Ġcapture Session : ĠCamera Capture Session ? Ġ= Ġnull ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠA Ġreference Ġto Ġthe Ġopened Ġ[ Camera Device ]. ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġvar Ġcamera Device : ĠCamera Device ? Ġ= Ġnull ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠThe Ġ[ android . util . Size ] Ġof Ġcamera Ġpreview . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġvar Ġpreview Size : ĠSize ? Ġ= Ġnull ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ[ Camera Device . State Callback ] Ġis Ġcalled Ġwhen Ġ[ Camera Device ] Ġchanges Ġits Ġstate . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġstate Callback Ġ= Ġobject Ġ: ĠCamera Device . State Callback () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġon Opened ( current Camera Device : ĠCamera Device ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠThis Ġmethod Ġis Ġcalled Ġwhen Ġthe Ġcamera Ġis Ġopened . Ġ ĠWe Ġstart Ġcamera Ġpreview Ġhere . ĊĠĠĠĠĠ Ġcamera Open Close Lock . release () ĊĠĠĠĠĠ Ġcamera Device Ġ= Ġcurrent Camera Device ĊĠĠĠĠĠ Ġcreate Camera Preview Session () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Disconnected ( current Camera Device : ĠCamera Device ) Ġ{ ĊĠĠĠĠĠ Ġcamera Open Close Lock . release () ĊĠĠĠĠĠ Ġcurrent Camera Device . close () ĊĠĠĠĠĠ Ġcamera Device Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonError ( ĊĠĠĠĠĠ Ġcurrent Camera Device : ĠCamera Device , ĊĠĠĠĠĠ Ġerror : ĠInt ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠ Ġcamera Open Close Lock . release () ĊĠĠĠĠĠ Ġcurrent Camera Device . close () ĊĠĠĠĠĠ Ġcamera Device Ġ= Ġnull ĊĠĠĠĠĠ Ġval Ġactivity Ġ= Ġactivity ĊĠĠĠĠĠ Ġactivity ?. finish () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAn Ġadditional Ġthread Ġfor Ġrunning Ġtasks Ġthat Ġshouldn 't Ġblock Ġthe ĠUI . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġvar Ġbackground Thread : ĠHandler Thread ? Ġ= Ġnull ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠA Ġ[ Handler ] Ġfor Ġrunning Ġtasks Ġin Ġthe Ġbackground . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġvar Ġbackground Handler : ĠHandler ? Ġ= Ġnull ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠAn Ġ[ Image Reader ] Ġthat Ġhandles Ġimage Ġcapture . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġvar Ġimage Reader : ĠImage Reader ? Ġ= Ġnull ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ[ Capture Request . Builder ] Ġfor Ġthe Ġcamera Ġpreview ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġvar Ġpreview RequestBuilder : ĠCapture Request . Builder ? Ġ= Ġnull ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ[ Capture Request ] Ġgenerated Ġby Ġ[. preview RequestBuilder ] ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġvar Ġpreview Request : ĠCapture Request ? Ġ= Ġnull ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠA Ġ[ Semaphore ] Ġto Ġprevent Ġthe Ġapp Ġfrom Ġexiting Ġbefore Ġclosing Ġthe Ġcamera . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġcamera Open Close Lock Ġ= ĠSem aphore ( 1 ) ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠA Ġ[ Camera Capture Session . Capture Callback ] Ġthat Ġhandles Ġevents Ġrelated Ġto Ġcapture . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġcapture Callback Ġ= Ġobject Ġ: ĠCamera Capture Session . Capture Callback () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġon Capture Prog ressed ( ĊĠĠĠĠĠ Ġsession : ĠCamera Capture Session , ĊĠĠĠĠĠ Ġrequest : ĠCapture Request , ĊĠĠĠĠĠ Ġpartial Result : ĠCapture Result ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Capture Completed ( ĊĠĠĠĠĠ Ġsession : ĠCamera Capture Session , ĊĠĠĠĠĠ Ġrequest : ĠCapture Request , ĊĠĠĠĠĠ Ġresult : ĠTotal Capture Result ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġrequired Permissions : ĠArray < String > ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠ Ġval Ġactivity Ġ= Ġactivity ĊĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġactivity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. package Manager ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. get Package Info ( activity . packageName , ĠPackage Manager . GET _ PERMISSION S ) ĊĠĠĠĠĠĠĠ Ġval Ġps Ġ= Ġinfo . requested Permissions ĊĠĠĠĠĠĠĠ Ġif Ġ( ps Ġ!= Ġnull Ġ&& Ġps . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġps ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠarrayOf () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ ĠarrayOf () ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠTakes Ġphotos Ġand Ġclassify Ġthem Ġperiodically . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġval Ġperiodic Class ify Ġ= Ġobject Ġ: ĠRunnable Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠ Ġsynchronized ( lock ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( run Classifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġclassify Frame () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġbackground Handler !!. post ( this ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠShows Ġa Ġ[ Toast ] Ġon Ġthe ĠUI Ġthread Ġfor Ġthe Ġclassification Ġresults . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġtext ĠThe Ġmessage Ġto Ġshow ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġshow Toast ( text : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġactivity Ġ= Ġactivity ĊĠĠĠ Ġactivity ?. run On Ui Thread Ġ{ ĊĠĠĠĠĠ ĠtextView !!. text Ġ= Ġtext ĊĠĠĠĠĠ Ġdraw View !!. invalidate () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠLayout Ġthe Ġpreview Ġand Ġbuttons . ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġfun ĠonCreate View ( ĊĠĠĠ Ġinflater : ĠLayoutInflater , ĊĠĠĠ Ġcontainer : ĠViewGroup ?, ĊĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠ Ġ): ĠView ? Ġ{ ĊĠĠĠ Ġreturn Ġinflater . inflate ( R . layout . fragment _ camera 2 _ basic , Ġcontainer , Ġfalse ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠConnect Ġthe Ġbuttons Ġto Ġtheir Ġevent Ġhandler . ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġfun Ġon View Created ( ĊĠĠĠ Ġview : ĠView , ĊĠĠĠ ĠsavedInstanceState : ĠBundle ? ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġtexture View Ġ= Ġview . findViewById ( R . id . texture ) ĊĠĠĠ ĠtextView Ġ= Ġview . findViewById ( R . id . text ) ĊĠĠĠ Ġlayout Frame Ġ= Ġview . findViewById ( R . id . layout _ frame ) ĊĠĠĠ Ġdraw View Ġ= Ġview . findViewById ( R . id . draw view ) ĊĠĠĠ Ġlayout Bottom Ġ= Ġview . findViewById ( R . id . layout _ bottom ) Ċ // ĠĠĠ Ġif Ġ( classifier Ġ!= Ġnull ) Ċ // ĠĠĠĠĠ Ġdraw View !!. set Img Size ( classifier !!. image Size X , Ġclassifier !!. image Size Y ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠLoad Ġthe Ġmodel Ġand Ġlabels . ĊĠĠ Ġ*/ ĊĠ Ġoverride Ġfun Ġon Activity Created ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠ Ġsuper . on Activity Created ( savedInstanceState ) ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġ// Ġcreate Ġeither Ġa Ġnew ĠImage Classifier Quant ized Mobile Net Ġor Ġan ĠImage Classifier Float In ception ĊĠĠĠĠĠ Ġ// ĠĠĠĠĠ Ġclassifier Ġ= Ġnew ĠImage Classifier Quant ized Mobile Net ( getActivity ()); ĊĠĠĠĠĠ Ġclassifier Ġ= ĠImage Classifier Float In ception . create ( activity ) ĊĠĠĠĠĠ Ġif Ġ( draw View Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠ Ġdraw View !!. set Img Size ( classifier !!. image Size X , Ġclassifier !!. image Size Y ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Failed Ġto Ġinitialize Ġan Ġimage Ġclassifier .", Ġe ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġstart Background Thread () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Resume () Ġ{ ĊĠĠĠ Ġsuper . on Resume () ĊĠĠĠ Ġstart Background Thread () ĊĊĠĠĠ Ġ// ĠWhen Ġthe Ġscreen Ġis Ġturned Ġoff Ġand Ġturned Ġback Ġon , Ġthe ĠSurface Texture Ġis Ġalready ĊĠĠĠ Ġ// Ġavailable , Ġand Ġ" on Surface Texture Available " Ġwill Ġnot Ġbe Ġcalled . ĠIn Ġthat Ġcase , Ġwe Ġcan Ġopen ĊĠĠĠ Ġ// Ġa Ġcamera Ġand Ġstart Ġpreview Ġfrom Ġhere Ġ( otherwise , Ġwe Ġwait Ġuntil Ġthe Ġsurface Ġis Ġready Ġin ĊĠĠĠ Ġ// Ġthe ĠSurface Texture Listener ). ĊĠĠĠ Ġif Ġ( texture View !!. is Available ) Ġ{ ĊĠĠĠĠĠ Ġopen Camera ( texture View !!. width , Ġtexture View !!. height ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġtexture View !!. surface Texture Listener Ġ= Ġsurface Texture Listener ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Pause () Ġ{ ĊĠĠĠ Ġclose Camera () ĊĠĠĠ Ġstop Background Thread () ĊĠĠĠ Ġsuper . on Pause () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Destroy () Ġ{ ĊĠĠĠ Ġclassifier !!. close () ĊĠĠĠ Ġsuper . on Destroy () ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSets Ġup Ġmember Ġvariables Ġrelated Ġto Ġcamera . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġwidth Ġ ĠThe Ġwidth Ġof Ġavailable Ġsize Ġfor Ġcamera Ġpreview ĊĠĠ Ġ* Ġ@ param Ġheight ĠThe Ġheight Ġof Ġavailable Ġsize Ġfor Ġcamera Ġpreview ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun ĠsetUp Camera Outputs ( ĊĠĠĠ Ġwidth : ĠInt , ĊĠĠĠ Ġheight : ĠInt ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġactivity Ġ= Ġactivity ĊĠĠĠ Ġval Ġmanager Ġ= Ġactivity . getSystem Service ( Context . CAMERA _ SERVICE ) Ġas ĠCamera Manager ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġfor Ġ( camera Id Ġin Ġmanager . camera IdList ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcharacteristics Ġ= Ġmanager . get Camera Character istics ( camera Id ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġdon 't Ġuse Ġa Ġfront Ġfacing Ġcamera Ġin Ġthis Ġsample . ĊĠĠĠĠĠĠĠ Ġval Ġfacing Ġ= Ġcharacteristics . get ( Camera Character istics . LEN S _ F ACING ) ĊĠĠĠĠĠĠĠ Ġif Ġ( facing Ġ!= Ġnull Ġ&& Ġfacing Ġ== ĠCamera Character istics . LEN S _ F ACING _ FRONT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmap Ġ= ĊĠĠĠĠĠĠĠĠĠ Ġcharacteristics . get ( Camera Character istics . SCAL ER _ STREAM _ CONFIGURATION _ MAP ) Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠ Ġ// Ġ// ĠFor Ġstill Ġimage Ġcaptures , Ġwe Ġuse Ġthe Ġlargest Ġavailable Ġsize . ĊĠĠĠĠĠĠĠ Ġval Ġlargest Ġ= ĠCollections . max ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArrays . asList (* map . getOutput Sizes ( Image Format . JPEG )), ĠCompare Sizes By Area () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġimage Reader Ġ= ĠImage Reader . newInstance ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlargest . width , Ġlargest . height , ĠImage Format . JPEG , Ġ/* max Images */ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠFind Ġout Ġif Ġwe Ġneed Ġto Ġswap Ġdimension Ġto Ġget Ġthe Ġpreview Ġsize Ġrelative Ġto Ġsensor ĊĠĠĠĠĠĠĠ Ġ// Ġcoordinate . ĊĠĠĠĠĠĠĠ Ġval Ġdisplay Rotation Ġ= Ġactivity . window Manager . default Display . rotation ĊĊĠĠĠĠĠĠĠ Ġ/* ĠOrientation Ġof Ġthe Ġcamera Ġsensor Ġ*/ ĊĠĠĠĠĠĠĠ Ġval Ġsensor Orientation Ġ= Ġcharacteristics . get ( Camera Character istics . SENSOR _ OR IENTATION ) !! ĊĠĠĠĠĠĠĠ Ġvar Ġsw apped Dimensions Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġwhen Ġ( display Rotation ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠSurface . ROT ATION _ 0 , ĠSurface . ROT ATION _ 1 8 0 Ġ-> Ġif Ġ( sensor Orientation Ġ== Ġ 9 0 Ġ|| Ġsensor Orientation Ġ== Ġ 2 7 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsw apped Dimensions Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠSurface . ROT ATION _ 9 0 , ĠSurface . ROT ATION _ 2 7 0 Ġ-> Ġif Ġ( sensor Orientation Ġ== Ġ 0 Ġ|| Ġsensor Orientation Ġ== Ġ 1 8 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsw apped Dimensions Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLog . e ( TAG , Ġ" Display Ġrotation Ġis Ġinvalid : Ġ$ display Rotation ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdisplay Size Ġ= ĠPoint () ĊĠĠĠĠĠĠĠ Ġactivity . window Manager . default Display . getSize ( display Size ) ĊĠĠĠĠĠĠĠ Ġvar Ġrotated Preview Width Ġ= Ġwidth ĊĠĠĠĠĠĠĠ Ġvar Ġrotated Preview Height Ġ= Ġheight ĊĠĠĠĠĠĠĠ Ġvar Ġmax Preview Width Ġ= Ġdisplay Size . x ĊĠĠĠĠĠĠĠ Ġvar Ġmax Preview Height Ġ= Ġdisplay Size . y ĊĊĠĠĠĠĠĠĠ Ġif Ġ( sw apped Dimensions ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġrotated Preview Width Ġ= Ġheight ĊĠĠĠĠĠĠĠĠĠ Ġrotated Preview Height Ġ= Ġwidth ĊĠĠĠĠĠĠĠĠĠ Ġmax Preview Width Ġ= Ġdisplay Size . y ĊĠĠĠĠĠĠĠĠĠ Ġmax Preview Height Ġ= Ġdisplay Size . x ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( max Preview Width Ġ> ĠMAX _ PRE VIEW _ WIDTH ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġmax Preview Width Ġ= ĠMAX _ PRE VIEW _ WIDTH ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( max Preview Height Ġ> ĠMAX _ PRE VIEW _ HEIGHT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġmax Preview Height Ġ= ĠMAX _ PRE VIEW _ HEIGHT ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġpreview Size Ġ= Ġchoose Opt imal Size ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap . getOutput Sizes ( Surface Texture :: class . java ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrotated Preview Width , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrotated Preview Height , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Preview Width , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Preview Height , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlargest ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġfit Ġthe Ġaspect Ġratio Ġof ĠTexture View Ġto Ġthe Ġsize Ġof Ġpreview Ġwe Ġpicked . ĊĠĠĠĠĠĠĠ Ġval Ġorientation Ġ= Ġresources . configuration . orientation ĊĠĠĠĠĠĠĠ Ġif Ġ( orientation Ġ== ĠConfiguration . OR IENTATION _ LAND SC APE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlayout Frame !!. set AspectRatio ( preview Size !!. width , Ġpreview Size !!. height ) ĊĠĠĠĠĠĠĠĠĠ Ġtexture View !!. set AspectRatio ( preview Size !!. width , Ġpreview Size !!. height ) ĊĠĠĠĠĠĠĠĠĠ Ġdraw View !!. set AspectRatio ( preview Size !!. width , Ġpreview Size !!. height ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlayout Frame !!. set AspectRatio ( preview Size !!. height , Ġpreview Size !!. width ) ĊĠĠĠĠĠĠĠĠĠ Ġtexture View !!. set AspectRatio ( preview Size !!. height , Ġpreview Size !!. width ) ĊĠĠĠĠĠĠĠĠĠ Ġdraw View !!. set AspectRatio ( preview Size !!. height , Ġpreview Size !!. width ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġthis . camera Id Ġ= Ġcamera Id ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠCamera AccessException ) Ġ{ ĊĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Failed Ġto Ġaccess ĠCamera ", Ġe ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠNullPointerException ) Ġ{ ĊĠĠĠĠĠ Ġ// ĠCurrently Ġan ĠN PE Ġis Ġthrown Ġwhen Ġthe ĠCamera 2 API Ġis Ġused Ġbut Ġnot Ġsupported Ġon Ġthe ĊĠĠĠĠĠ Ġ// Ġdevice Ġthis Ġcode Ġruns . ĊĠĠĠĠĠ ĠError Dialog . newInstance ( getString ( R . string . camera _ error )) ĊĠĠĠĠĠĠĠĠĠ Ġ. show ( child FragmentManager , ĠFR AG MENT _ DIALOG ) ĊĠĠĠ Ġ} ĊĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠOpen s Ġthe Ġcamera Ġspecified Ġby Ġ[ Camera 2 Basic Fragment . camera Id ]. ĊĠĠ Ġ*/ ĊĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠ Ġprivate Ġfun Ġopen Camera ( ĊĠĠĠ Ġwidth : ĠInt , ĊĠĠĠ Ġheight : ĠInt ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġif Ġ(! checked Permissions Ġ&& Ġ! all Permissions Granted ()) Ġ{ ĊĠĠĠĠĠ ĠFragment Compat . request Permissions ( this , Ġrequired Permissions , ĠPER MISSION S _ REQUEST _ CODE ) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġchecked Permissions Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ ĠsetUp Camera Outputs ( width , Ġheight ) ĊĠĠĠ Ġconfigure Transform ( width , Ġheight ) ĊĠĠĠ Ġval Ġactivity Ġ= Ġactivity ĊĠĠĠ Ġval Ġmanager Ġ= Ġactivity . getSystem Service ( Context . CAMERA _ SERVICE ) Ġas ĠCamera Manager ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġif Ġ(! camera Open Close Lock . try Acquire ( 2 5 0 0 , ĠTimeUnit . MILLISECONDS )) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException (" Time Ġout Ġwaiting Ġto Ġlock Ġcamera Ġopening .") ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġmanager . open Camera ( camera Id !! , Ġstate Callback , Ġbackground Handler ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠCamera AccessException ) Ġ{ ĊĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Failed Ġto Ġopen ĠCamera ", Ġe ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠRuntimeException (" Inter rupted Ġwhile Ġtrying Ġto Ġlock Ġcamera Ġopening .", Ġe ) ĊĠĠĠ Ġ} ĊĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġall Permissions Granted (): ĠBoolean Ġ{ ĊĠĠĠ Ġfor Ġ( permission Ġin Ġrequired Permissions ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( Context Compat . check Self Permission ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactivity , Ġpermission ĊĠĠĠĠĠĠĠĠĠ Ġ) Ġ!= ĠPackage Manager . PERMISSION _ GRAN TED ĊĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Request Permissions Result ( ĊĠĠĠ Ġrequest Code : ĠInt , ĊĠĠĠ Ġpermissions : ĠArray < String >, ĊĠĠĠ Ġgrant Results : ĠInt Array ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġsuper . on Request Permissions Result ( request Code , Ġpermissions , Ġgrant Results ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCloses Ġthe Ġcurrent Ġ[ Camera Device ]. ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġclose Camera () Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġcamera Open Close Lock . acquire () ĊĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġcapture Session ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcapture Session !!. close () ĊĠĠĠĠĠĠĠ Ġcapture Session Ġ= Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġcamera Device ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcamera Device !!. close () ĊĠĠĠĠĠĠĠ Ġcamera Device Ġ= Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġimage Reader ) Ġ{ ĊĠĠĠĠĠĠĠ Ġimage Reader !!. close () ĊĠĠĠĠĠĠĠ Ġimage Reader Ġ= Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠRuntimeException (" Inter rupted Ġwhile Ġtrying Ġto Ġlock Ġcamera Ġclosing .", Ġe ) ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠ Ġcamera Open Close Lock . release () ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠStarts Ġa Ġbackground Ġthread Ġand Ġits Ġ[ Handler ]. ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġstart Background Thread () Ġ{ ĊĠĠĠ Ġbackground Thread Ġ= ĠHandler Thread ( HANDLE _ THREAD _ NAME ) ĊĠĠĠ Ġbackground Thread !!. start () ĊĠĠĠ Ġbackground Handler Ġ= ĠHandler ( background Thread !!. lo oper ) ĊĠĠĠ Ġsynchronized ( lock ) Ġ{ ĊĠĠĠĠĠ Ġrun Classifier Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġbackground Handler !!. post ( periodic Class ify ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠSto ps Ġthe Ġbackground Ġthread Ġand Ġits Ġ[ Handler ]. ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġstop Background Thread () Ġ{ ĊĠĠĠ Ġbackground Thread !!. quit S af ely () ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġbackground Thread !!. join () ĊĠĠĠĠĠ Ġbackground Thread Ġ= Ġnull ĊĠĠĠĠĠ Ġbackground Handler Ġ= Ġnull ĊĠĠĠĠĠ Ġsynchronized ( lock ) Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Classifier Ġ= Ġfalse ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Inter rupted Ġwhen Ġstopping Ġbackground Ġthread ", Ġe ) ĊĠĠĠ Ġ} ĊĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠCreates Ġa Ġnew Ġ[ Camera Capture Session ] Ġfor Ġcamera Ġpreview . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġcreate Camera Preview Session () Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġval Ġtexture Ġ= Ġtexture View !!. surface Texture !! ĊĊĠĠĠĠĠ Ġ// ĠWe Ġconfigure Ġthe Ġsize Ġof Ġdefault Ġbuffer Ġto Ġbe Ġthe Ġsize Ġof Ġcamera Ġpreview Ġwe Ġwant . ĊĠĠĠĠĠ Ġtexture . setDefault BufferSize ( preview Size !!. width , Ġpreview Size !!. height ) ĊĊĠĠĠĠĠ Ġ// ĠThis Ġis Ġthe Ġoutput ĠSurface Ġwe Ġneed Ġto Ġstart Ġpreview . ĊĠĠĠĠĠ Ġval Ġsurface Ġ= ĠSurface ( texture ) ĊĊĠĠĠĠĠ Ġ// ĠWe Ġset Ġup Ġa ĠCapture Request . Builder Ġwith Ġthe Ġoutput ĠSurface . ĊĠĠĠĠĠ Ġpreview RequestBuilder Ġ= Ġcamera Device !!. create Capture Request ( Camera Device . TEMPLATE _ PRE VIEW ) ĊĠĠĠĠĠ Ġpreview RequestBuilder !!. add Target ( surface ) ĊĊĠĠĠĠĠ Ġ// ĠHere , Ġwe Ġcreate Ġa ĠCamera Capture Session Ġfor Ġcamera Ġpreview . ĊĠĠĠĠĠ Ġcamera Device !!. create Capture Session ( ĊĠĠĠĠĠĠĠĠĠ ĠArrays . asList ( surface ), ĊĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠCamera Capture Session . State Callback () Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Configured ( camera Capture Session : ĠCamera Capture Session ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġcamera Ġis Ġalready Ġclosed ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġcamera Device ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWhen Ġthe Ġsession Ġis Ġready , Ġwe Ġstart Ġdisplaying Ġthe Ġpreview . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapture Session Ġ= Ġcamera Capture Session ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAuto Ġfocus Ġshould Ġbe Ġcontinuous Ġfor Ġcamera Ġpreview . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview RequestBuilder !!. set ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AF _ MODE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCapture Request . CONTROL _ AF _ MODE _ CONT IN UO US _ PI CTURE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFinally , Ġwe Ġstart Ġdisplaying Ġthe Ġcamera Ġpreview . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Request Ġ= Ġpreview RequestBuilder !!. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcapture Session !!. set Repe ating Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreview Request !! , Ġcapture Callback , Ġbackground Handler ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠCamera AccessException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Failed Ġto Ġset Ġup Ġconfig Ġto Ġcapture ĠCamera ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Configure Failed ( camera Capture Session : ĠCamera Capture Session ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġshow Toast (" Failed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ}, Ġnull ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠCamera AccessException ) Ġ{ ĊĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Failed Ġto Ġpreview ĠCamera ", Ġe ) ĊĠĠĠ Ġ} ĊĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠConfig ures Ġthe Ġnecessary Ġ[ android . graphics . Matrix ] Ġtransformation Ġto Ġ` texture View `. ĠThis ĊĠĠ Ġ* Ġmethod Ġshould Ġbe Ġcalled Ġafter Ġthe Ġcamera Ġpreview Ġsize Ġis Ġdetermined Ġin ĠsetUp Camera Outputs Ġand ĊĠĠ Ġ* Ġalso Ġthe Ġsize Ġof Ġ` texture View ` Ġis Ġfixed . ĊĠĠ Ġ* ĊĠĠ Ġ* Ġ@ param Ġview Width Ġ ĠThe Ġwidth Ġof Ġ` texture View ` ĊĠĠ Ġ* Ġ@ param Ġview Height ĠThe Ġheight Ġof Ġ` texture View ` ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġconfigure Transform ( ĊĠĠĠ Ġview Width : ĠInt , ĊĠĠĠ Ġview Height : ĠInt ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġactivity Ġ= Ġactivity ĊĠĠĠ Ġif Ġ( null Ġ== Ġtexture View Ġ|| Ġnull Ġ== Ġpreview Size Ġ|| Ġnull Ġ== Ġactivity ) Ġ{ ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġrotation Ġ= Ġactivity . window Manager . default Display . rotation ĊĠĠĠ Ġval Ġmatrix Ġ= ĠMatrix () ĊĠĠĠ Ġval Ġview Rect Ġ= ĠRect F ( 0 f , Ġ 0 f , Ġview Width . toFloat (), Ġview Height . toFloat ()) ĊĠĠĠ Ġval Ġbuffer Rect Ġ= ĠRect F ( 0 f , Ġ 0 f , Ġpreview Size !!. height . toFloat (), Ġpreview Size !!. width . toFloat ()) ĊĠĠĠ Ġval Ġcenter X Ġ= Ġview Rect . center X () ĊĠĠĠ Ġval Ġcenter Y Ġ= Ġview Rect . center Y () ĊĠĠĠ Ġif Ġ( Surface . ROT ATION _ 9 0 Ġ== Ġrotation Ġ|| ĠSurface . ROT ATION _ 2 7 0 Ġ== Ġrotation ) Ġ{ ĊĠĠĠĠĠ Ġbuffer Rect . offset ( center X Ġ- Ġbuffer Rect . center X (), Ġcenter Y Ġ- Ġbuffer Rect . center Y ()) ĊĠĠĠĠĠ Ġmatrix . set Rect To Rect ( view Rect , Ġbuffer Rect , ĠMatrix . Scale To Fit . FILL ) ĊĠĠĠĠĠ Ġval Ġscale Ġ= ĠMath . max ( ĊĠĠĠĠĠĠĠĠĠ Ġview Height . toFloat () Ġ/ Ġpreview Size !!. height , ĊĠĠĠĠĠĠĠĠĠ Ġview Width . toFloat () Ġ/ Ġpreview Size !!. width ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġmatrix . post Scale ( scale , Ġscale , Ġcenter X , Ġcenter Y ) ĊĠĠĠĠĠ Ġmatrix . post Rotate (( 9 0 Ġ* Ġ( rotation Ġ- Ġ 2 )). toFloat (), Ġcenter X , Ġcenter Y ) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( Surface . ROT ATION _ 1 8 0 Ġ== Ġrotation ) Ġ{ ĊĠĠĠĠĠ Ġmatrix . post Rotate ( 1 8 0 f , Ġcenter X , Ġcenter Y ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġtexture View !!. set Transform ( matrix ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠClass ifies Ġa Ġframe Ġfrom Ġthe Ġpreview Ġstream . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġfun Ġclassify Frame () Ġ{ ĊĠĠĠ Ġif Ġ( classifier Ġ== Ġnull Ġ|| Ġactivity Ġ== Ġnull Ġ|| Ġcamera Device Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġshow Toast (" Un initialized ĠClass ifier Ġor Ġinvalid Ġcontext .") ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġbitmap Ġ= Ġtexture View !!. get Bitmap ( classifier !!. image Size X , Ġclassifier !!. image Size Y ) ĊĠĠĠ Ġval Ġtext To Show Ġ= Ġclassifier !!. classify Frame ( bitmap ) ĊĠĠĠ Ġbitmap . recycle () ĊĊĠĠĠ Ġ// ĠĠĠĠĠĠĠ Ġdraw View . set Draw Point ( classifier . m Print Point Array , Ġ 0 . 2 5 f ); ĊĠĠĠ Ġdraw View !!. set Draw Point ( classifier !!. m Print Point Array !! , Ġ 0 . 5 f ) ĊĊĠĠĠ Ġshow Toast ( text To Show ) ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠComp ares Ġtwo Ġ` Size ` s Ġbased Ġon Ġtheir Ġareas . ĊĠĠ Ġ*/ ĊĠ Ġprivate Ġclass ĠCompare Sizes By Area Ġ: ĠComparator < Size > Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcompare ( ĊĠĠĠĠĠ Ġlhs : ĠSize , ĊĠĠĠĠĠ Ġrhs : ĠSize ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠ Ġ// ĠWe Ġcast Ġhere Ġto Ġensure Ġthe Ġmultip lications Ġwon 't Ġoverflow ĊĠĠĠĠĠ Ġreturn Ġjava . lang . Long . sign um ( ĊĠĠĠĠĠĠĠĠĠ Ġlhs . width . to Long () Ġ* Ġlhs . height Ġ- Ġrhs . width . to Long () Ġ* Ġrhs . height ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠShows Ġan Ġerror Ġmessage Ġdialog . ĊĠĠ Ġ*/ ĊĠ Ġclass ĠError Dialog Ġ: ĠDialog Fragment () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate Dialog ( savedInstanceState : ĠBundle ): ĠDialog Ġ{ ĊĠĠĠĠĠ Ġval Ġactivity Ġ= Ġactivity ĊĠĠĠĠĠ Ġreturn ĠAlertDialog . Builder ( activity ) ĊĠĠĠĠĠĠĠĠĠ Ġ. setMessage ( arguments . getString ( ARG _ MESSAGE )) ĊĠĠĠĠĠĠĠĠĠ Ġ. set Positive Button ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġandroid . R . string . ok ĊĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġdialog Interface , Ġi Ġ-> Ġactivity . finish () Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠ Ġprivate Ġval ĠARG _ MESSAGE Ġ= Ġ" message " ĊĊĠĠĠĠĠ Ġfun Ġnew Instance ( message : ĠString ): ĠError Dialog Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdialog Ġ= ĠError Dialog () ĊĠĠĠĠĠĠĠ Ġval Ġargs Ġ= ĠBundle () ĊĠĠĠĠĠĠĠ Ġargs . putString ( ARG _ MESSAGE , Ġmessage ) ĊĠĠĠĠĠĠĠ Ġdialog . arguments Ġ= Ġargs ĊĠĠĠĠĠĠĠ Ġreturn Ġdialog ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTag Ġfor Ġthe Ġ[ Log ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" Tf Lite Camera Demo " ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠFR AG MENT _ DIALOG Ġ= Ġ" dialog " ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠHANDLE _ THREAD _ NAME Ġ= Ġ" Camera Background " ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠPER MISSION S _ REQUEST _ CODE Ġ= Ġ 1 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMax Ġpreview Ġwidth Ġthat Ġis Ġguaranteed Ġby ĠCamera 2 ĠAPI ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ PRE VIEW _ WIDTH Ġ= Ġ 1 9 2 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMax Ġpreview Ġheight Ġthat Ġis Ġguaranteed Ġby ĠCamera 2 ĠAPI ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġconst Ġval ĠMAX _ PRE VIEW _ HEIGHT Ġ= Ġ 1 0 8 0 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRes izes Ġimage . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠAt tempting Ġto Ġuse Ġtoo Ġlarge Ġa Ġpreview Ġsize Ġcould Ġ Ġexceed Ġthe Ġcamera Ġbus ' Ġbandwidth Ġlimitation , ĊĠĠĠĠ Ġ* Ġresulting Ġin Ġg orge ous Ġpre views Ġbut Ġthe Ġstorage Ġof Ġgarbage Ġcapture Ġdata . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠGiven Ġ` choices ` Ġof Ġ` Size ` s Ġsupported Ġby Ġa Ġcamera , Ġchoose Ġthe Ġsmallest Ġone Ġthat Ġis ĊĠĠĠĠ Ġ* Ġat Ġleast Ġas Ġlarge Ġas Ġthe Ġrespective Ġtexture Ġview Ġsize , Ġand Ġthat Ġis Ġat Ġmost Ġas Ġlarge Ġas Ġthe ĊĠĠĠĠ Ġ* Ġrespective Ġmax Ġsize , Ġand Ġwhose Ġaspect Ġratio Ġmatches Ġwith Ġthe Ġspecified Ġvalue . ĠIf Ġsuch Ġsize ĊĠĠĠĠ Ġ* Ġdoesn 't Ġexist , Ġchoose Ġthe Ġlargest Ġone Ġthat Ġis Ġat Ġmost Ġas Ġlarge Ġas Ġthe Ġrespective Ġmax Ġsize , Ġand ĊĠĠĠĠ Ġ* Ġwhose Ġaspect Ġratio Ġmatches Ġwith Ġthe Ġspecified Ġvalue . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġchoices ĠĠĠĠĠĠĠĠĠĠ ĠThe Ġlist Ġof Ġsizes Ġthat Ġthe Ġcamera Ġsupports Ġfor Ġthe Ġintended Ġoutput Ġclass ĊĠĠĠĠ Ġ* Ġ@ param Ġtexture View Width Ġ ĠThe Ġwidth Ġof Ġthe Ġtexture Ġview Ġrelative Ġto Ġsensor Ġcoordinate ĊĠĠĠĠ Ġ* Ġ@ param Ġtexture View Height ĠThe Ġheight Ġof Ġthe Ġtexture Ġview Ġrelative Ġto Ġsensor Ġcoordinate ĊĠĠĠĠ Ġ* Ġ@ param ĠmaxWidth ĠĠĠĠĠĠĠĠĠ ĠThe Ġmaximum Ġwidth Ġthat Ġcan Ġbe Ġchosen ĊĠĠĠĠ Ġ* Ġ@ param ĠmaxHeight ĠĠĠĠĠĠĠĠ ĠThe Ġmaximum Ġheight Ġthat Ġcan Ġbe Ġchosen ĊĠĠĠĠ Ġ* Ġ@ param Ġaspect Ratio ĠĠĠĠĠĠ ĠThe Ġaspect Ġratio ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġoptimal Ġ` Size `, Ġor Ġan Ġarbitrary Ġone Ġif Ġnone Ġwere Ġbig Ġenough ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġchoose Opt imal Size ( ĊĠĠĠĠĠ Ġchoices : ĠArray < Size >, ĊĠĠĠĠĠ Ġtexture View Width : ĠInt , ĊĠĠĠĠĠ Ġtexture View Height : ĠInt , ĊĠĠĠĠĠ ĠmaxWidth : ĠInt , ĊĠĠĠĠĠ ĠmaxHeight : ĠInt , ĊĠĠĠĠĠ Ġaspect Ratio : ĠSize ĊĠĠĠ Ġ): ĠSize Ġ{ ĊĊĠĠĠĠĠ Ġ// ĠCollect Ġthe Ġsupported Ġresolution s Ġthat Ġare Ġat Ġleast Ġas Ġbig Ġas Ġthe Ġpreview ĠSurface ĊĠĠĠĠĠ Ġval Ġbig En ough Ġ= ĠArrayList < Size >() ĊĠĠĠĠĠ Ġ// ĠCollect Ġthe Ġsupported Ġresolution s Ġthat Ġare Ġsmaller Ġthan Ġthe Ġpreview ĠSurface ĊĠĠĠĠĠ Ġval Ġnot Big En ough Ġ= ĠArrayList < Size >() ĊĠĠĠĠĠ Ġval Ġw Ġ= Ġaspect Ratio . width ĊĠĠĠĠĠ Ġval Ġh Ġ= Ġaspect Ratio . height ĊĠĠĠĠĠ Ġfor Ġ( option Ġin Ġchoices ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( option . width Ġ<= ĠmaxWidth ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġoption . height Ġ<= ĠmaxHeight ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġoption . height Ġ== Ġoption . width Ġ* Ġh Ġ/ Ġw ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( option . width Ġ>= Ġtexture View Width Ġ&& Ġoption . height Ġ>= Ġtexture View Height ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbig En ough . add ( option ) ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot Big En ough . add ( option ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// ĠPick Ġthe Ġsmallest Ġof Ġthose Ġbig Ġenough . ĠIf Ġthere Ġis Ġno Ġone Ġbig Ġenough , Ġpick Ġthe ĊĠĠĠĠĠ Ġ// Ġlargest Ġof Ġthose Ġnot Ġbig Ġenough . ĊĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġbig En ough . size Ġ> Ġ 0 Ġ-> ĠCollections . min ( big En ough , ĠCompare Sizes By Area ()) ĊĠĠĠĠĠĠĠ Ġnot Big En ough . size Ġ> Ġ 0 Ġ-> ĠCollections . max ( not Big En ough , ĠCompare Sizes By Area ()) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" Couldn 't Ġfind Ġany Ġsuitable Ġpreview Ġsize ") ĊĠĠĠĠĠĠĠĠĠ Ġchoices [ 0 ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnew Instance (): ĠCamera 2 Basic Fragment Ġ{ ĊĠĠĠĠĠ Ġreturn ĠCamera 2 Basic Fragment () ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ