package Ġcom . work ah olic lab . camera album test Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Intent Ċ import Ġandroid . graphics . Bitmap Ċ import Ġandroid . graphics . Bitmap Factory Ċ import Ġandroid . graphics . Matrix Ċ import Ġandroid . media . Ex if Interface Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . provider . Media Store Ċ import Ġandroidx . core . content . File Provider Ċ import Ġkotlinx . android . synt hetic . main . activity _ main .* Ċ import Ġjava . io . File Ċ Ċ class ĠMainActivity Ġ: ĠAppCompatActivity () Ġ{ ĊĠĠĠ Ġval Ġtake Photo Ġ= Ġ 1 ĊĠĠĠ Ġlateinit Ġvar Ġimage Uri Ġ: Uri ĊĠĠĠ Ġlateinit Ġvar Ġoutput Image : ĠFile ĊĊĠĠĠ Ġval Ġfrom Album Ġ= Ġ 2 ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ main ) ĊĠĠĠĠĠĠĠ Ġtake Photo Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// åĪĽå»º File å¯¹è±¡ ï¼Į çĶ¨äºİ åŃĺåĤ¨ æĭ į çħ§ åĲİçļĦ åĽ¾çīĩ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Image Ġ= ĠFile ( external Cache Dir ," output _ image . jpg ") // éĩĩçĶ¨ åºĶçĶ¨ ç®¡çĲĨ çĽ®å½ķ æĿ¥ ç¼ĵåŃĺ ï¼Ī éģ¿åħį è¯» åĨĻ SD åį¡ çļĦ åį ± éĻ© æĿĥéĻĲ ï¼ī ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( output Image . exists ()){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Image . delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Image . createNew File () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimage Uri Ġ= Ġif ( Build . VERSION . SDK _ INT >= ĠBuild . VERSION _ CODES . N ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å°Ĩ File å¯¹è±¡ è½¬ åĮĸ æĪĲ ä¸Ģä¸ª å°ģè£ħ è¿ĩ çļĦ Uri å¯¹è±¡ ï¼Ī File Provider å¯¹ æķ°æį® è¿Ľè¡Į äºĨ ä¿Ŀ æĬ¤ ï¼ī ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Provider . get Uri For File ( this ," com . work ah olic lab . camera album test . file provider ", output Image ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else { ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . from File ( output Image ) Ġ// è¯¥ è®¾å¤ĩ ä½İ äºİ android 7 å°± è°ĥçĶ¨ Uri çļĦ from File æĸ¹æ³ķ å°Ĩ File è½¬ è¯Ŀ ä¸º Uri å¯¹è±¡ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// è¿Ļä¸ª Uri å¯¹è±¡ åĮħåĲ« äºĨ è¿Ļ å¼ł åĽ¾çīĩ çļĦ çľŁ å®ŀ åŃĺåľ¨ çļĦ è·¯å¾Ħ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// åĲ¯åĬ¨ çĽ¸ æľº ç¨ĭåºı ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Intent (" android . media . action . IMAGE _ CAPTURE ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( Media Store . EXTRA _ OUTPUT , image Uri )// æĮĩå®ļ åĽ¾çīĩ çļĦ è¾ĵåħ¥ åľ°åĿĢ ï¼Į è¿ĻéĩĮ ä¸º åĪļ åĪļ çļĦ Uri å¯¹è±¡ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , take Photo ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// éĢī åıĸ çĽ¸ åĨĮ ĊĠĠĠĠĠĠĠ Ġfrom Album Btn . setOnClickListener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// æīĵå¼Ģ æĸĩä»¶ éĢīæĭ© åĻ¨ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ OPEN _ DOCUMENT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Category ( Intent . CATEGORY _ OP ENABLE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// æĮĩå®ļ åıª æĺ¾ç¤º åĽ¾çīĩ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . type Ġ=" image /* " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , from Album ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġwhen ( request Code ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtake Photo ->{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Code Ġ== Activity . RESULT _ OK ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å°Ĩ æĭ į æĳ Ħ çļĦ çħ§ çīĩ æĺ¾ç¤º åĩºæĿ¥ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap = ĠBitmap Factory . decode Stream ( content Resolver . open InputStream ( image Uri )) // å°Ĩ è¿Ļ å¼ł åĽ¾çīĩ è§£æŀĲ ç§° ä¸º Bitmap å¯¹è±¡ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageView . setImage Bitmap ( rotate If Required ( bitmap )) // åıĺ æĪĲ ImageView ï¼Į éľĢè¦ģ æ³¨æĦı ä¸ĢäºĽ æīĭæľº ä¸Ĭ æĭ į çħ§ è½¬ åĮĸ ä¼ļ åıĳçĶŁ ä¸ĢäºĽ æĹ ĭ è½¬ ï¼Į éľĢè¦ģ å¤ĦçĲĨ ä¸Ģä¸ĭ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfrom Album ->{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( result Code Ġ== ĠActivity . RESULT _ OK Ġ&& Ġdata Ġ!= Ġnull ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata . data ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å°Ĩ éĢīæĭ© çļĦ åĽ¾çīĩ æĺ¾ç¤º ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbitmap = get Bitmap From Uri ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠimageView . setImage Bitmap ( bitmap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Bitmap From Uri ( uri : ĠUri ) Ġ= Ġcontent Resolver ĊĠĠĠĠĠĠĠ Ġ. open FileDescriptor ( uri ," r ") ?. use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBitmap Factory . decode FileDescriptor ( it . file Descriptor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ// çħ§ çīĩ æĹ ĭ è½¬ å¤ĦçĲĨ ĊĠĠĠ Ġprivate Ġfun Ġrotate If Required ( bitmap : ĠBitmap ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġex if Ġ= ĠEx if Interface ( output Image . path ) ĊĠĠĠĠĠĠĠ Ġval Ġorientation Ġ= Ġex if . getAttribute Int ( Ex if Interface . TAG _ OR IENTATION , Ex if Interface . OR IENTATION _ NORMAL ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( orientation ){ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface . OR IENTATION _ ROT ATE _ 9 0 -> rotate Bitmap ( bitmap , 9 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface . OR IENTATION _ ROT ATE _ 1 8 0 -> rotate Bitmap ( bitmap , 1 8 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEx if Interface . OR IENTATION _ ROT ATE _ 2 7 0 -> rotate Bitmap ( bitmap , 2 7 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse -> Ġbitmap ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrotate Bitmap ( bitmap : ĠBitmap , Ġdegree : ĠInt ): ĠBitmap Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatrix Ġ= Matrix () ĊĠĠĠĠĠĠĠ Ġmatrix . post Rotate ( degree . toFloat ()) ĊĠĠĠĠĠĠĠ Ġval Ġrotate Bitmap Ġ= ĠBitmap . create Bitmap ( bitmap , 0 , 0 , bitmap . width , bitmap . height , matrix , true ) ĊĠĠĠĠĠĠĠ Ġbitmap . recycle () // å°Ĩ ä¸į åĨį éľĢè¦ģ çļĦ Bitmap å¯¹è±¡ åĽŀ æĶ¶ ĊĠĠĠĠĠĠĠ Ġreturn Ġrotate Bitmap ĊĠĠĠ Ġ} Ċ }