/* Ċ Ġ* Ġ ĠCopyright Ġ( C ) Ġ 2 0 1 7 ĠB ilib ili Ċ Ġ* Ċ Ġ* Ġ Ġ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 . b ilib ili . box ing . utils Ċ Ċ import Ġandroid . app . Activity Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . content . Content U ris Ċ import Ġandroid . content . Context Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Environment Ċ import Ġandroid . provider . Documents Contract Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . util . Log Ċ import Ġandroid . webkit . MimeType Map Ċ import Ġandroidx . core . content . File Provider Ċ import Ġandroidx . document file . provider . Document File Ċ import Ġcom . b ilib ili . box ing . Box ing Ċ import Ġcom . b ilib ili . box ing . model . entity . Base Media Ċ import Ġjava . io . Buffered InputStream Ċ import Ġjava . io . Buffered OutputStream Ċ import Ġjava . io . File Ċ import Ġjava . io . File OutputStream Ċ import Ġjava . net . URLConnection Ċ import Ġjava . util . concurrent . ExecutionException Ċ Ċ /** Ċ Ġ* ĠA Ġfile Ġhelper Ġto Ġmake Ġthing Ġeasier . Ċ Ġ* Ċ Ġ* Ġ@ author ĠChen SL Ċ Ġ*/ Ċ object ĠBox ing File Helper Ġ{ ĊĠĠĠ Ġconst Ġval ĠDEFAULT _ SUB _ DIR Ġ= Ġ"/ box ing " ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Throws ( ExecutionException :: class , ĠInterruptedException :: class ) ĊĠĠĠ Ġfun Ġcreate File ( path : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( path . isNull OrEmpty ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfile . exists () Ġ|| Ġfile . mkdir s () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġget Cache Dir (_ context : ĠContext ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġ_ context Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġcache Dir Ġ= Ġcontext . application Context . external Cache Dir ĊĠĠĠĠĠĠĠ Ġif Ġ( cacheDir Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBox ing Log . d (" cache Ġdir Ġdo Ġnot Ġexist .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġ"${ cacheDir . absolute Path }/ box ing " ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate File ( result ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠExecution Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBox ing Log . d (" cache Ġdir Ġ$ result Ġnot Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInterruptedException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBox ing Log . d (" cache Ġdir Ġ$ result Ġnot Ġexist ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠBox ing Log . d (" cache Ġdir Ġis : Ġ$ result ") ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġget External DC IM ( activity : ĠActivity , Ġsub Dir : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ activity . get External Files Dir ( Environment . DIRECTORY _ PI CTURE S )} $ sub Dir " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Environment . get External Storage Directory (). absolute Path }/${ Environment . DIRECTORY _ PI CTURE S }$ sub Dir " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠBox ing Log . d (" external ĠDC IM Ġis : Ġ$ result ") ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun ĠgetFile Uri ( context : ĠContext , Ġmedia : ĠBase Media ): ĠUri Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBuild . VERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . N Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . from File ( File ( media . path )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmedia . id . isNotEmpty () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . with App ended Path ( Media Store . Images . Media . EXTERNAL _ CONTENT _ URI , Ġmedia . id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Provider . get Uri For File ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ context . application Context . packageName }.${ Box ing . author ities }", ĠFile ( media . path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġis File Valid ( path : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( path . isNull OrEmpty ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠ Ġreturn Ġis File Valid ( file ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġis File Valid ( file : ĠFile ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfile Ġ!= Ġnull Ġ&& Ġfile . exists () Ġ&& Ġfile . isFile Ġ&& Ġfile . length () Ġ> Ġ 0 Ġ&& Ġfile . can Read () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġget Box ing Cache Path (): ĠUri Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠUri . from File ( File ( getCache Dir ( Box ing . mContext ), Ġ"${ System . currentTimeMillis ()}. jpg ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġfile Provider ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun ĠgetFile Uri ( file : ĠFile ): ĠUri Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile Provider . get Uri For File ( Box ing . mContext , Ġ"${ Box ing . mContext . packageName }.${ Box ing . author ities }", Ġfile ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠUri . from File ( file ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġå°Ĩ Uri è½¬ ä¸º File Ċ Ġ*/ Ċ fun ĠUri ?. uri ToFile ( context : ĠContext ): ĠFile ? Ġ{ ĊĠĠĠ Ġthis Ġ?: Ġreturn Ġnull ĊĠĠĠ ĠLog . i (" File Ext ", Ġ" uri ToFile : Ġ$ this ") ĊĠĠĠ Ġreturn Ġwhen Ġ( scheme ) Ġ{ ĊĠĠĠĠĠĠĠ ĠContent Resolver . SCHEME _ FILE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( this . path ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠContent Resolver . SCHEME _ CONTENT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . Q ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetFile From Uri Q ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetFile From Uri N ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġæł¹æį® Uri èİ·åıĸ File ï¼Į Android Q åıĬ ä»¥ä¸Ĭ åı¯çĶ¨ Ċ Ġ* ĠAndroid Q ä¸Ń åıªæľī æ² Ļ çĽ Ĵ ä¸ŃçļĦ æĸĩä»¶ åı¯ä»¥ çĽ´æİ¥ æł¹æį® ç»Ŀ å¯¹ è·¯å¾Ħ èİ·åıĸ File ï¼Į éĿŀ æ² Ļ çĽ Ĵ çİ¯å¢ĥ æĺ¯ æĹłæ³ķ æł¹æį® ç»Ŀ å¯¹ è·¯å¾Ħ è®¿éĹ® çļĦ Ċ Ġ* Ġ åĽłæŃ¤ åħĪ åĪ¤æĸŃ Uri æĺ¯åĲ¦ æĺ¯ æ² Ļ çĽ Ĵ ä¸ŃçļĦ æĸĩä»¶ ï¼Į å¦Ĥæŀľ æĺ¯ çĽ´æİ¥ æĭ ¼ æİ¥ ç»Ŀ å¯¹ è·¯å¾Ħ è®¿éĹ® ï¼Į åĲ¦åĪĻ ä½¿çĶ¨ [ save File By Uri ] å¤įåĪ¶ åĪ° æ² Ļ çĽ Ĵ ä¸Ń çĶŁæĪĲ File Ċ Ġ*/ Ċ fun ĠUri . getFile From Uri Q ( context : ĠContext ): ĠFile ? Ġ{ ĊĠĠĠ Ġvar Ġfile : ĠFile ? Ġ= Ġnull ĊĠĠĠ Ġif Ġ( Documents Contract . is Document Uri ( context , Ġthis )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri Id Ġ= ĠDocuments Contract . getDocument Id ( this ) ĊĠĠĠĠĠĠĠ ĠLog . i (" File Ext ", Ġ" getFile From Uri Q : Ġ${ Documents Contract . getDocument Id ( this )} ") ĊĠĠĠĠĠĠĠ Ġval Ġsplit : ĠList < String > Ġ= Ġuri Id . split (": ") ĊĠĠĠĠĠĠĠ Ġ// æĸĩä»¶ åŃĺåľ¨ æ² Ļ çĽ Ĵ ä¸Ń ï¼Į åı¯ çĽ´æİ¥ æĭ ¼ æİ¥ åħ¨ è·¯å¾Ħ è®¿éĹ® ĊĠĠĠĠĠĠĠ Ġ// åĪ¤æĸŃ ä¾Ŀ æį® çĽ®åīį æĺ¯ Android / data / åĮħ åĲį ï¼Į ä¸į å¤Ł ä¸¥ è° ¨ ĊĠĠĠĠĠĠĠ Ġif Ġ( split . size Ġ> Ġ 1 Ġ&& Ġsplit [ 1 ]. contains (" Android / data /${ context . packageName } ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Android Q æĹłæ³ķ éĢļè¿ĩ Environment . get External Storage Directory () èİ·åıĸ SD åį¡ æł¹ çĽ®å½ķ ï¼Į åĽłæŃ¤ çĽ´æİ¥ / storage / em ulated / 0 / æĭ ¼ æİ¥ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= ĠFile ("/ storage / em ulated / 0 /${ split [ 1 ]} ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġflag Ġ= Ġfile ?. exists () Ġ?: Ġfalse ĊĠĠĠ Ġreturn Ġif Ġ(! flag ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . save File By Uri ( context ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġfile ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġæł¹æį® Uri èİ·åıĸ File ï¼Į Android N ~ Android Q åı¯çĶ¨ Ċ Ġ*/ Ċ fun ĠUri . getFile From Uri N ( context : ĠContext ): ĠFile ? Ġ{ ĊĠĠĠ Ġvar Ġfile : ĠFile ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġuri Ġ= Ġthis ĊĠĠĠ ĠLog . i (" File Ext ", Ġ" getFile From Uri N : Ġ$ uri Ġ${ uri . authority } Ġ${ uri . path }") ĊĠĠĠ Ġval Ġauthority Ġ= Ġuri . authority ĊĠĠĠ Ġval Ġpath Ġ= Ġuri . path ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġmedia ç±»åŀĭçļĦ Uri ï¼Į å½¢ å¦Ĥ content :// media / external / images / media / 1 1 5 6 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġif Ġ( file Ġ== Ġnull Ġ&& Ġauthority Ġ!= Ġnull Ġ&& Ġauthority . startsWith (" media ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġuri . getData Column ( context )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= ĠFile ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġfile Provider æİĪæĿĥ çļĦ Uri ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġif Ġ( file Ġ== Ġnull Ġ&& Ġauthority Ġ!= Ġnull Ġ&& Ġauthority . startsWith ( context . packageName ) Ġ&& Ġpath Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// è¿ĻéĩĮ çļĦåĢ¼ æĿ¥ èĩª ä½łçļĦ provider _ paths . xml ï¼Į å¦Ĥæŀľ ä¸įåĲĮ éľĢè¦ģ èĩªå·± è¿Ľè¡Į æ·»åĬł ä¿®æĶ¹ ĊĠĠĠĠĠĠĠ Ġval Ġexternal s Ġ= Ġmutable ListOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ external ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ external _ path ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ beta _ external _ files _ path ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ external _ cache _ path ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ beta _ external _ path ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ external _ files ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"/ internal " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġexternal s . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path . startsWith ( it )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¦Ĥæŀľä½ł åľ¨ provider _ paths . xml ä¸Ń ä¿®æĶ¹ äºĨ path ï¼Į éľĢè¦ģ èĩªå·± è¿Ľè¡Į ä¿®æĶ¹ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew File Ġ= ĠFile ("${ Environment . get External Storage Directory (). absolute Path }/${ path . replace ( it , Ġ"") }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= Ġnew File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIntent . ACTION _ OPEN _ DOCUMENT éĢīæĭ© çļĦæĸĩä»¶ Uri ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġif Ġ( file Ġ== Ġnull Ġ&& ĠDocuments Contract . is Document Uri ( context , Ġthis )) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri Id Ġ= ĠDocuments Contract . getDocument Id ( this ) ĊĠĠĠĠĠĠĠ ĠLog . i (" File Ext ", Ġ" is Document Uri : Ġ${ Documents Contract . getDocument Id ( this )} ") ĊĠĠĠĠĠĠĠ Ġval Ġsplit : ĠList < String > Ġ= Ġuri Id . split (": ") ĊĠĠĠĠĠĠĠ Ġwhen Ġ( uri . authority ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . android . external storage . documents " Ġ-> Ġ{ Ġ// åĨħéĥ¨ åŃĺåĤ¨ è®¾å¤ĩ ä¸Ń éĢīæĭ© ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( split . size Ġ> Ġ 1 ) Ġfile Ġ= ĠFile ("${ Environment . get External Storage Directory (). absolute Path }/${ split [ 1 ]} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . android . providers . downloads . documents " Ġ-> Ġ{ Ġ// ä¸ĭè½½ åĨħå®¹ ä¸Ń éĢīæĭ© ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri Id . startsWith (" raw :" )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= ĠFile ( split [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// content :// com . android . providers . downloads . documents / document / 5 8 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent Uri Ġ= ĠContent U ris . with App ended Id ( Uri . parse (" content :// downloads / public _ downloads "), Ġuri Id . to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Uri . getData Column ( context )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= ĠFile ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . android . providers . media . documents " Ġ-> Ġ{ Ġ// å¤ļ åªĴ ä½ĵ ä¸Ń éĢīæĭ© ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcontent Uri : ĠUri ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( split [ 0 ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" image " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Uri Ġ= ĠMedia Store . Images . Media . EXTERNAL _ CONTENT _ URI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" video " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Uri Ġ= ĠMedia Store . Video . Media . EXTERNAL _ CONTENT _ URI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" audio " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Uri Ġ= ĠMedia Store . Audio . Media . EXTERNAL _ CONTENT _ URI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Uri ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( split . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri Ġ= ĠContent U ris . with App ended Id ( this , Ġsplit [ 1 ]. to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . i (" File Ext ", Ġ" is Document Uri Ġmedia : Ġ$ uri ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri . getData Column ( context )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= ĠFile ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġflag Ġ= Ġfile ?. exists () Ġ?: Ġfalse ĊĠĠĠ Ġreturn Ġif Ġ(! flag ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// å½¢ å¦Ĥ content :// com . android . providers . downloads . documents / document / 5 8 2 çļĦ ä¸ĭè½½ åĨħå®¹ ä¸ŃçļĦ æĸĩä»¶ ĊĠĠĠĠĠĠĠ Ġ// æĹłæ³ķ æł¹æį® Uri èİ·åıĸ åĪ° çľŁ å®ŀ è·¯å¾Ħ çļĦæĸĩä»¶ ï¼Į ç»Łä¸Ģ ä½¿çĶ¨ save File By Uri ( context ) æĸ¹æ³ķ èİ·åıĸ File ĊĠĠĠĠĠĠĠ Ġuri . save File By Uri ( context ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġfile ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /** Ċ Ġ* Ġæł¹æį® Uri æŁ¥è¯¢ æĸĩä»¶ è·¯å¾Ħ Ċ Ġ* ĠAndroid 4 . 4 ä¹ĭåīį éĥ½ åı¯çĶ¨ ï¼Į Android 4 . 4 ä¹ĭåĲİ åıªæľī ä»İ å¤ļ åªĴ ä½ĵ ä¸Ń éĢīæĭ© çļĦæĸĩä»¶ åı¯çĶ¨ Ċ Ġ*/ Ċ fun ĠUri ?. getData Column ( context : ĠContext ): ĠString ? Ġ{ ĊĠĠĠ Ġif Ġ( this Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠ Ġvar Ġstr : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġcursor : ĠCursor ? Ġ= Ġnull ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġcursor Ġ= Ġcontext . content Resolver . query ( this , ĠarrayOf ( Media Store . Media Columns . DATA ), Ġnull , Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġcursor ?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġthis . getColumnIndex OrThrow ( Media Store . Media Columns . DATA ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġ- 1 ) Ġstr Ġ= Ġthis . getString ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠ Ġcursor ?. close () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġstr Ċ } Ċ Ċ /** Ċ Ġ* Ġæł¹æį® Uri å°Ĩ æĸĩä»¶ ä¿ĿåŃĺ File åĪ° æ² Ļ çĽ Ĵ ä¸Ń Ċ Ġ* ĠæŃ¤ æĸ¹æ³ķ èĥ½ è§£åĨ³ éĥ¨åĪĨ Uri æĹłæ³ķ èİ·åıĸ åĪ° File çļĦéĹ®é¢ĺ Ċ Ġ* Ġ ä½Ĩæĺ¯ ä¼ļ éĢł æĪĲ æĸĩä»¶ åĨ Ĺ ä½Ļ ï¼Į åı¯ä»¥ æł¹æį® å®ŀéĻħ æĥħåĨµ ï¼Į åĨ³å®ļ æĺ¯åĲ¦ éľĢè¦ģ åĪłéĻ¤ Ċ Ġ*/ Ċ fun ĠUri . save File By Uri ( context : ĠContext ): ĠFile ? Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġcontext . content Resolver . open InputStream ( this ) ĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġthis . get FileName ( context ) Ġ?: Ġ"${ System . currentTimeMillis ()}. ${ getExtension By Uri ( context )}" ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( context . get Box ing Default Cache (), ĠfileName ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . createNew File () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġf os Ġ= ĠFileOutputStream ( file ) ĊĠĠĠĠĠĠĠ Ġval Ġbis Ġ= ĠBuffered InputStream ( inputStream ) ĊĠĠĠĠĠĠĠ Ġval Ġb os Ġ= ĠBuffered OutputStream ( fos ) ĊĠĠĠĠĠĠĠ Ġval ĠbyteArray Ġ= ĠByteArray ( 1 0 2 4 ) ĊĠĠĠĠĠĠĠ Ġvar Ġbytes Ġ= Ġbis . read ( byteArray ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( bytes Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb os . write ( byteArray , Ġ 0 , Ġbytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġb os . flush () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbytes Ġ= Ġbis . read ( byteArray ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġb os . close () ĊĠĠĠĠĠĠĠ Ġf os . close () ĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ /** Ċ Ġ* Ġæĸĩä»¶ æĺ¯åĲ¦ åŃĺåľ¨ ä½ľçĶ¨ åŁŁ åĨħ Ċ Ġ*/ Ċ fun ĠString . is Exist Scope (): ĠBoolean Ġ= ĊĠĠĠ Ġthis . contains ("/ Android / data /${ Box ing . mContext . packageName }") Ġ&& ĠFile ( this ). exists () Ċ Ċ fun ĠUri . get FileName ( context : ĠContext ): ĠString ? Ġ{ ĊĠĠĠ Ġval Ġdocument File Ġ= ĠDocument File . from Single Uri ( context , Ġthis ) ĊĠĠĠ Ġreturn Ġdocument File ?. name Ċ } Ċ Ċ /** Ċ Ġ* Ġæł¹æį® Uri èİ·åıĸ æī©å±ķ åĲį Ċ Ġ*/ Ċ fun ĠUri . getExtension By Uri ( context : ĠContext ) Ġ= Ġthis . get MimeType By Uri ( context )?. getExtension By MimeType () Ċ Ċ /** Ċ Ġ* Ġæł¹æį® Uri èİ·åıĸ MimeType Ċ Ġ*/ Ċ fun ĠUri . get MimeType By Uri ( context : ĠContext ) Ġ= Ġcontext . content Resolver . getType ( this ) ĊĊ Ċ /** Ċ Ġ* Ġæł¹æį® MimeType èİ·åıĸ æĭ ĵ å±ķ åĲį Ċ Ġ*/ Ċ fun ĠString . getExtension By MimeType () Ġ= ĠMime TypeMap . get Singleton (). getExtension From MimeType ( this ) Ċ Ċ /** Ċ Ġ* Ġæł¹æį® æĸĩä»¶ åĲį èİ·åıĸ æī©å±ķ åĲį Ċ Ġ*/ Ċ fun ĠString . getExtension By FileName () Ġ= ĊĠĠĠ Ġthis . get MimeType By FileName (). getExtension By MimeType () Ċ Ċ /** Ċ Ġ* Ġæł¹æį® æĸĩä»¶ åĲį èİ·åıĸ MimeType Ċ Ġ*/ Ċ fun ĠString . get MimeType By FileName (): ĠString Ġ= ĊĠĠĠ ĠURL Connection . get FileName Map (). get ContentType For ( this ) ĊĊ Ċ fun ĠContext . get External Or Cache Dir (): ĠFile Ġ{ ĊĠĠĠ Ġ// Ġå¦Ĥæŀľ èİ·åıĸ ä¸ºç©º åĪĻ æĶ¹ ä¸º getCache Dir ĊĠĠĠ Ġval Ġdir Ġ= Ġexternal Cache Dir Ġ?: Ġcache Dir ĊĠĠĠ Ġif Ġ(! dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġdir . mkdir s () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġdir Ċ } Ċ Ċ fun ĠContext . get Box ing Default Cache (): ĠFile Ġ{ ĊĠĠĠ Ġval Ġfile Ġ= ĠFile ( get External Or Cache Dir (), Ġ" box ing ") ĊĠĠĠ Ġfile . mkdir s () ĊĠĠĠ Ġreturn Ġfile Ċ } Ċ