package Ġcom . zp . z photo _ lib . util Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Content Values Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . provider . Media Store Ċ import Ġcom . zp . z photo _ lib . common . Z Photo Help Ċ import Ġcom . zp . z photo _ lib . content . get AppContext Ċ import Ġjava . io .* Ċ import Ġjava . text . Decimal Format Ċ import Ġjava . text . SimpleDateFormat Ċ import Ġjava . util .* Ċ Ċ internal Ġobject ĠZ File Ġ{ ĊĊĠĠĠ Ġ/** Ġæĸĩä»¶ å¤§å°ı åįķä½į ä¸º B Ġ*/ ĊĠĠĠ Ġconst Ġval ĠS IZ ET YPE _ B Ġ= Ġ 1 ĊĠĠĠ Ġ/** Ġæĸĩä»¶ å¤§å°ı åįķä½į ä¸º KB Ġ*/ ĊĠĠĠ Ġconst Ġval ĠS IZ ET YPE _ KB Ġ= Ġ 2 ĊĠĠĠ Ġ/** Ġæĸĩä»¶ å¤§å°ı åįķä½į ä¸º MB Ġ*/ ĊĠĠĠ Ġconst Ġval ĠS IZ ET YPE _ MB Ġ= Ġ 3 ĊĠĠĠ Ġ/** Ġæĸĩä»¶ å¤§å°ı åįķä½į ä¸º GB Ġ*/ ĊĠĠĠ Ġconst Ġval ĠS IZ ET YPE _ GB Ġ= Ġ 4 ĊĊĠĠĠ Ġ/** Ġ æł¹ çĽ®å½ķ Ġ*/ ĊĠĠĠ Ġprivate Ġconst Ġval ĠROOT _ DIR Ġ= Ġ" z photo _ lib " ĊĊĠĠĠ Ġ/** Ġ çħ§ çīĩ çĽ®å½ķ Ġ*/ ĊĠĠĠ Ġconst Ġval ĠPH OTO Ġ= Ġ"/ photo /" ĊĠĠĠ Ġ/** Ġ åĽ¾çīĩ åİĭç¼© Ġ*/ ĊĠĠĠ Ġconst Ġval ĠCOMP RESS Ġ= Ġ"/ compress /" ĊĠĠĠ Ġ/** Ġ åĽ¾çīĩ è£ ģ åī ª Ġ*/ ĊĠĠĠ Ġconst Ġval ĠC ROP Ġ= Ġ"/ crop /" ĊĊĠĠĠ Ġprivate Ġvar Ġstorage Path : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġpackage Files Directory : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** Ġ ç¼ĵåŃĺ åĪĹè¡¨ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget Cache List () Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠ ĠgetPath () Ġ+ ĠPH OTO , ĊĠĠĠĠĠĠĠ ĠgetPath () Ġ+ ĠCOMP RESS , ĊĠĠĠĠĠĠĠ ĠgetPath () Ġ+ ĠC ROP ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¾ĹåĪ° åħ·ä½ĵ çļĦ è·¯å¾Ħ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetPath For Path ( path : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĠgetPath () Ġ+ Ġpath ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( url ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . mkdir s () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġurl ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun ĠgetPath ( context : ĠContext Ġ= Ġget AppContext ()): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( storage Path Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Path Ġ= Ġ"${ context . get External Files Dir ( null )?. path }/ $ ROOT _ DIR " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( storage Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . mkdir s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Path Ġ= ĠgetPath In Package ( context , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġstorage Path ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetPath In Package ( context : ĠContext , Ġgrant Permissions : ĠBoolean ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( package Files Directory Ġ!= Ġnull ) Ġreturn Ġpackage Files Directory ĊĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġ"${ context . files Dir }/ $ ROOT _ DIR " ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! file . mkdir s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZ Log . e (" åľ¨ pak age çĽ®å½ķ åĪĽå»º C GE ä¸´ æĹ¶ çĽ®å½ķ å¤±è´¥ !") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( grant Permissions ) Ġ{ Ġ// Ġè®¾ç½® éļĲèĹı çĽ®å½ķ æĿĥéĻĲ . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . set Executable ( true , Ġfalse )) ĠZ Log . e (" æĸĩä»¶ åı¯ æī§è¡Į ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . set Readable ( true , Ġfalse )) ĠZ Log . e (" æĸĩä»¶ åı¯ è¯» ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . set Writable ( true , Ġfalse )) ĠZ Log . e (" æĸĩä»¶ åı¯ åĨĻ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpackage Files Directory Ġ= Ġpath ĊĠĠĠĠĠĠĠ Ġreturn Ġpackage Files Directory ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæł¹æį® å½ĵåīį æĹ¶éĹ´ Ġ+ Ġ åĲİ ç¼Ģ Ġ åĳ½åĲį ĊĠĠĠĠ Ġ* Ġ@ param Ġsuffix Ġ åĲİ ç¼Ģ ĊĠĠĠĠ Ġ* Ġ@ param Ġindex Ġ Ġä¸ĭ æłĩ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget FileName ( suffix : ĠString , Ġindex : ĠInt Ġ= Ġ- 1 ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsimple DateFormat Ġ= ĠSimpleDateFormat (" yyyy MM dd HH mm ss SS S ", ĠLocale . CH INA ) ĊĠĠĠĠĠĠĠ Ġval Ġtime Stamp Ġ= Ġsimple DateFormat . format ( Date ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( index Ġ> Ġ 0 ) Ġ"${ time Stamp }_ $ index $ suffix " Ġelse Ġtime Stamp Ġ+ Ġsuffix ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ æĮĩå®ļ æĸĩä»¶ æĪĸ æĸĩä»¶å¤¹ çļĦ æĮĩå®ļ åįķä½į çļĦ å¤§å°ı ĊĠĠĠĠ Ġ* Ġ@ param ĠfilePath Ġæĸĩä»¶ æĪĸ æĸĩä»¶å¤¹ è·¯å¾Ħ ĊĠĠĠĠ Ġ* Ġ@ param Ġsize Type Ġèİ·åıĸ å¤§å°ı çļĦ ç±»åŀĭ 1 ä¸º B ãĢģ 2 ä¸º KB ãĢģ 3 ä¸º MB ãĢģ 4 ä¸º GB ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun ĠgetFile Or Files Size ( filePath : ĠString , Ġsize Type : ĠInt Ġ= ĠS IZ ET YPE _ MB ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( filePath ) ĊĠĠĠĠĠĠĠ Ġvar ĠblockSize : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠblockSize Ġ= Ġif Ġ( file . isDirectory ) ĠgetFile Sizes ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġget FileSize ( file ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠZ Log . e (" èİ·åıĸ æĸĩä»¶ å¤§å°ı ---> >> èİ·åıĸ å¤±è´¥ !") ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfor met FileSize ( block Size , Ġsize Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ æĮĩå®ļ æĸĩä»¶ å¤§å°ı ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġget FileSize ( file : ĠFile ) Ġ= Ġif Ġ( file . exists ()) Ġfile . length () Ġelse Ġ 0 L ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ æĮĩå®ļ æĸĩä»¶å¤¹ å¤§å°ı ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠgetFile Sizes ( f : ĠFile ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsize : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġf list Ġ= Ġf . list Files () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġf list !!. indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġif Ġ( f list [ i ]. isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ+ ĠgetFile Sizes ( f list [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ+ Ġget FileSize ( f list [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsize ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è½¬æį¢ æĸĩä»¶ å¤§å°ı , æĮĩå®ļ è½¬æį¢ çļĦ ç±»åŀĭ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġfor met FileSize ( file S : ĠLong , Ġsize Type : ĠInt Ġ= ĠS IZ ET YPE _ MB ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdf Ġ= ĠDecimal Format ("# . 0 0 ") ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( size Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS IZ ET YPE _ B Ġ-> Ġjava . lang . Double . valueOf ( df . format ( file S . toDouble ())) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS IZ ET YPE _ KB Ġ-> Ġjava . lang . Double . valueOf ( df . format ( file S . toDouble () Ġ/ Ġ 1 0 2 4 )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS IZ ET YPE _ MB Ġ-> Ġjava . lang . Double . valueOf ( df . format ( file S . toDouble () Ġ/ Ġ 1 0 4 8 5 7 6 )) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS IZ ET YPE _ GB Ġ-> Ġjava . lang . Double . valueOf ( df . format ( file S . toDouble () Ġ/ Ġ 1 0 7 3 7 4 1 8 2 4 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠåĪłéĻ¤ æĸĩä»¶ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġdelete ( file : ĠFile ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġreturn ĊĠĠĠĠĠĠĠ Ġif Ġ( file . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( file . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild Files Ġ= Ġfile . list Files () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( child Files Ġ== Ġnull Ġ|| Ġchild Files . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġchild Files . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ( child Files [ i ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . delete () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġèİ·åıĸ ç¼ĵåŃĺ çĽ®å½ķ çļĦ å¤§å°ı ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Z Photo Cache Size ( size Type : ĠInt Ġ= ĠS IZ ET YPE _ MB ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsize Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠ Ġget Cache List (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( File ( it ). exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfiles Size Ġ= ĠgetFile Or Files Size ( it , Ġsize Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ+= Ġfiles Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsize ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæ¸ ħ éĻ¤ ç¼ĵåŃĺ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdelete Z Photo Cache (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġis Success Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Cache List (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelete ( File ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Z Photo Help . getInstance (). getConfiguration (). show Log ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZ To aster . makeText S (" æ¸ħ éĻ¤ ç¼ĵåŃĺ å¤±è´¥ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Success Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġis Success ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå°Ĩ Ġæ ² Ļ çĽ Ĵ ĠçļĦ Ġæķ°æį® Ġ ä¿ĿåŃĺ åĪ° æĮĩå®ļ ä½įç½® ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsave Crop Data ( activity : ĠActivity , Ġafter Crop DataArray : ĠArrayList < String > ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcrop FolderPath Ġ= ĠZ Photo Help . getInstance (). getConfiguration (). crop FolderPath ĊĠĠĠĠĠĠĠ Ġif Ġ( after Crop DataArray ?. isNull OrEmpty () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠZ Log . i (" ä¸įæĺ¯ Android ĠQ ĠæĪĸ Ġ æľª åī ª è£ ģ Ġ æĹł æķ°æį® ï¼Į ä¸į è¿Ľè¡Į ä»»ä½ķ æĵįä½ľ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( crop FolderPath . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠZ Log . e (" Z Photo Configuration . crop FolderPath Ġæĺ¯ ç©º çļĦ ï¼Į ä¸į æī§è¡Į å°Ĩ æ² Ļ çĽ Ĵ çļĦ åī ª è£ ģ åĽ¾çīĩ ä¿ĿåŃĺ åĪ° æĮĩå®ļ ä½įç½® ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġafter Crop DataArray . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsave Data In Public Folder By Q ( activity , Ġit , Ġcrop FolderPath ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġå°Ĩ Ġæ ² Ļ çĽ Ĵ ä¸ŃçļĦ Ġæĸĩä»¶ Ġ ä¿ĿåŃĺ åĪ° åħ¬ åħ± çĽ®å½ķ ĊĠĠĠĠ Ġ* Ġ@ param Ġactivity ĠActivity ĊĠĠĠĠ Ġ* Ġ@ param Ġpath ĠString ĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġæ ² Ļ çĽ Ĵ æĸĩä»¶ ĊĠĠĠĠ Ġ* Ġ@ param Ġout FolderPath ĠString ĠĠĠĠĠ Ġ ä¿ĿåŃĺ åĪ° å¤ĸéĥ¨ çļĦæĸĩä»¶ å¤¹ åĲįç§° Ġ å¦Ĥ ï¼ļ abc ï¼Į æľĢç»Ī ä¼ļ åıĺ æĪĲ ĠDC IM / abc ĊĠĠĠĠ Ġ* Ġ@ param Ġout FileName ĠString ĠĠĠĠĠĠĠ Ġ ä¿ĿåŃĺ åĪ° å¤ĸéĥ¨ çļĦæĸĩä»¶ åĲįç§° ĊĠĠĠĠ Ġ* Ġ@ param ĠmimeType ĠString ĠĠĠĠĠĠĠĠĠĠ Ġæĸĩä»¶ ç±»åŀĭ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsave Data In Public Folder By Q ( ĊĠĠĠĠĠĠĠ Ġactivity : ĠActivity , ĊĠĠĠĠĠĠĠ Ġpath : ĠString , ĊĠĠĠĠĠĠĠ Ġout FolderPath : ĠString , ĊĠĠĠĠĠĠĠ Ġout FileName : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ ĠmimeType : ĠString Ġ= Ġ" image / jpeg " ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠéľĢè¦ģ ä¿ĿåŃĺ çļĦ åĲįåŃĹ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdisplayName Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( out FileName . isNull OrEmpty ()) Ġpath . substring ( path . lastIndexOf ("/") Ġ+ Ġ 1 ) Ġelse Ġout FileName ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠContent Values () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . put ( Media Store . Files . File Columns . DISPLAY _ NAME , ĠdisplayName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMedia Store å¯¹åºĶ ç±»åŀĭ åĲį ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . put ( Media Store . Files . File Columns . MIME _ TYPE , ĠmimeType ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . put ( Media Store . Files . File Columns . TITLE , ĠdisplayName ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åħ¬ åħ± çĽ®å½ķ ä¸ĭ çĽ®å½ķ åĲį ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues . put ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMedia Store . Images . Media . REL ATIVE _ PATH , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Download /${ out FolderPath }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ åĨħéĥ¨ åŃĺåĤ¨ çļĦ Download è·¯å¾Ħ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexternal Ġ= ĠMedia Store . Downloads . EXTERNAL _ CONTENT _ URI ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolver Ġ= Ġactivity . content Resolver ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġä½¿çĶ¨ Content Resolver åĪĽå»º éľĢè¦ģ æĵįä½ľ çļĦæĸĩä»¶ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinsert Uri Ġ= Ġresolver . insert ( external , Ġvalues ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġist : ĠInputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġo st : ĠOutputStream ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġist Ġ= ĠFileInputStream ( File ( path )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( insert Uri Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo st Ġ= Ġresolver . open OutputStream ( insert Uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ost Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( 4 0 9 6 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbyte Count Ġ= Ġist . read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( byte Count Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo st . write ( buffer , Ġ 0 , Ġbyte Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZ Log . e ("$ path Ġ ä¿ĿåŃĺ åĪ° ĠDownload /${ out FolderPath } Ġ å¤±è´¥ ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠZ Log . i ("$ path Ġ ä¿ĿåŃĺ åĪ° ĠDownload /${ out FolderPath } Ġ æĪĲåĬŁ ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġist ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo st ?. close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠZ Log . e (" éĿŀ Android ĠQ ä¸į æī§è¡Į ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ