package Ġcom . ns z . kotlin . storage Ċ Ċ import Ġandroid . content . Content Values Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Bundle Ċ import Ġandroid . os . Environment Ċ import Ġandroid . os . storage . Storage Manager Ċ import Ġandroid . provider . Documents Contract Ċ import Ġandroid . provider . Media Store Ċ import Ġandroid . util . Log Ċ import Ġandroidx . appcompat . app . AppCompatActivity Ċ import Ġcom . ns z . kotlin . R Ċ import Ġjava . io . InputStream Ċ Ċ class ĠS AF Activity Ġ: ĠAppCompatActivity () Ġ{ ĊĊĠĠĠ Ġ// Ġhttps :// blog . cs dn . net / GR Y _ Y J / article / details / 1 0 5 9 5 1 0 8 9 ĊĠĠĠ Ġ// Ġhttps :// www . jian shu . com / p / d 5 5 7 3 e 3 1 2 bb 8 ĊĠĠĠ Ġ// Ġhttps :// blog . cs dn . net / hy c 1 9 8 8 1 0 7 / article / details / 8 3 8 2 5 2 3 7 /? utm _ medium = distribute . pc _ relevant . none - task - blog - baidu js _ title - 0 & sp m = 1 0 0 1 . 2 1 0 1 . 3 0 0 1 . 4 2 4 2 ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠTAG Ġ= Ġ" SA F Activity " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠonCreate ( savedInstanceState : ĠBundle ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . onCreate ( savedInstanceState ) ĊĠĠĠĠĠĠĠ ĠsetContentView ( R . layout . activity _ storage _ saf ) ĊĠĠĠĠĠĠĠ Ġinit View () ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinit View () Ġ{ ĊĠĠĠĠĠĠĠ Ġoperate SD Card Storage () ĊĠĠĠĠĠĠĠ Ġval ĠinputStream Ġ= Ġresources . assets . open (" test . txt ") ĊĠĠĠĠĠĠĠ Ġsave File To Public Directory ( inputStream ) ĊĠĠĠĠĠĠĠ Ġopen Tree () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Document () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ OPEN _ DOCUMENT ) ĊĠĠĠĠĠĠĠ Ġintent . add Category ( Intent . CATEGORY _ OP ENABLE ) ĊĠĠĠĠĠĠĠ Ġ// Ġintent . type Ġ= Ġ"* /* " ĊĠĠĠĠĠĠĠ Ġintent . type Ġ= Ġ" text /* " ĊĠĠĠĠĠĠĠ Ġ// Ġæĺ¯åĲ¦ æĶ¯æĮģ å¤ļ éĢī Ġé»ĺè®¤ ä¸į æĶ¯æĮģ ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( Intent . EXTRA _ ALLOW _ MULTIPLE , Ġfalse ) ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , Ġ 1 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġopen Tree () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġuri : ĠUri Ġ= ĠUri . parse (" content :// com . android . external " Ġ+ Ġ" storage . documents / document / primary : Download ") ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ OPEN _ DOCUMENT _ TREE ) ĊĠĠĠĠĠĠĠ Ġif Ġ( android . os . Build . VERSION . SDK _ INT Ġ>= Ġandroid . os . Build . VERSION _ CODES . O ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( Documents Contract . EXTRA _ INITIAL _ URI , Ġuri ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , Ġ 1 0 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Document () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ CREATE _ DOCUMENT ) ĊĠĠĠĠĠĠĠ Ġintent . add Category ( Intent . CATEGORY _ OP ENABLE ) ĊĠĠĠĠĠĠĠ Ġintent . type Ġ= Ġ" text /* " ĊĠĠĠĠĠĠĠ Ġintent . putExtra ( Intent . EXTRA _ TITLE , Ġ" 1 2 3 . txt ") ĊĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , Ġ 1 0 2 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsave File To Public Directory ( inputStream : ĠInputStream ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= ĠContent Values () ĊĠĠĠĠĠĠĠ Ġval ĠcurrentTime Millis Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġvalues . put ( Media Store . Images . Media . TITLE , Ġ" k tx _$ currentTimeMillis ") ĊĠĠĠĠĠĠĠ Ġvalues . put ( Media Store . Downloads . DISPLAY _ NAME , Ġ" k tx _$ currentTimeMillis . txt ") ĊĠĠĠĠĠĠĠ Ġvalues . put ( Media Store . Downloads . REL ATIVE _ PATH , ĠEnvironment . DIRECTORY _ DOWNLOAD S Ġ+ Ġ"/ k tx ") ĊĠĠĠĠĠĠĠ Ġval Ġcontent Uri Ġ= ĠMedia Store . Downloads . EXTERNAL _ CONTENT _ URI ĊĠĠĠĠĠĠĠ Ġcontent Resolver . insert ( content Uri , Ġvalues ). let Ġ{ Ġuri Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠoutputStream Ġ= Ġcontent Resolver . open OutputStream ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( output Stream Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputStream . use Ġ{ Ġops Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteArray ( 2 0 4 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlen : ĠInt Ġ= ĠinputStream . read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( len Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġops . write ( buffer , Ġ 0 , Ġlen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlen Ġ= ĠinputStream . read ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġex . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġoperate SD Card Storage () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstorage Manager Ġ= Ġget System Service ( Context . STORAGE _ SERVICE ) Ġas ĠStorage Manager ĊĠĠĠĠĠĠĠ Ġif Ġ( android . os . Build . VERSION . SDK _ INT Ġ>= Ġandroid . os . Build . VERSION _ CODES . N ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstorage Volumes Ġ= Ġstorage Manager . storage Volumes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( sv Ġin Ġstorage Volumes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" storage Volume : Ġ$ sv ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sv . is Remov able Ġ&& Ġsv . state Ġ== ĠEnvironment . MEDIA _ MOUNT ED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= Ġsv . create Open Document Tree Intent () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠstartActivity For Result ( intent , Ġ 1 0 0 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Activity Result ( request Code : ĠInt , ĠresultCode : ĠInt , Ġdata : ĠIntent ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Activity Result ( request Code , ĠresultCode , Ġdata ) ĊĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġdata . data ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e ( TAG , Ġ" uri : Ġ$ uri ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( data Ġ!= Ġnull Ġ&& Ġrequest Code Ġ== Ġ 1 0 0 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġdata . data ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( data Ġ!= Ġnull Ġ&& Ġrequest Code Ġ== Ġ 1 0 0 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= Ġdata . data ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflags Ġ= Ġintent . flags Ġand Ġ( Intent . FLAG _ GRANT _ READ _ URI _ PERMISSION Ġor ĠIntent . FLAG _ GRANT _ WRITE _ URI _ PERMISSION ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Resolver . take Persist able Uri Permission ( uri , Ġflags ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }