package Ġcom . f int ek . utils _ android x . storage Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Environment Ċ import Ġandroid . os . Stat Fs Ċ import Ġandroid . os . storage . Storage Manager Ċ import Ġandroid . os . storage . Storage Volume Ċ import Ġandroid . text . format . Formatter Ċ import Ġandroidx . annotation . Requires Api Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġcom . f int ek . utils _ android x . F int ek Utils Ċ import Ġcom . f int ek . utils _ android x . throwable . saf ely Void Ċ import Ġjava . io . File Ċ import Ġjava . lang . reflect . Invocation TargetException Ċ import Ġjava . util . ArrayList Ċ Ċ /** Ċ Ġ* ĠCreated Ġby ĠCh ao Sh en Ġon Ġ 2 0 2 0 / 1 1 / 1 0 Ċ Ġ*/ Ċ object ĠSD Card Utils Ġ{ ĊĠĠĠ Ġprivate Ġval Ġsd Card Contain List Ġ= ĠarrayOf (" sd card ", Ġ" Sd Card ", Ġ" sd Card ") ĊĠĠĠ Ġprivate Ġconst Ġval ĠEX TRA _ SD _ PATH Ġ= Ġ" extra " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġwhether Ġsd card Ġis Ġenabled Ġby Ġenvironment . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġ` true `: Ġenabled Ġ Ġ` false `: Ġdisabled ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġis SD Card Enable By Environment (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠEnvironment . MEDIA _ MOUNT ED Ġ== ĠEnvironment . get External Storage State () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġfun Ġis SD Card Extra (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġapps Dir Ġ= ĠContext Compat . get External Files Dirs ( F int ek Utils . required Context , Ġnull ) ĊĠĠĠĠĠĠĠ Ġvar Ġcontain Extra Sd Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġapps Dir . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . path . contains ( EXTRA _ SD _ PATH )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontain Extra Sd Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcontain Extra Sd ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠ Ġfun ĠgetTotal Size (): ĠLong Ġ= Ġget Disk (). second ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠ Ġfun Ġget Available Size (): ĠLong Ġ= Ġget Disk (). first ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠ Ġfun Ġget Used Size (): ĠLong Ġ= ĠgetTotal Size () Ġ- Ġget Available Size () ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠ Ġfun ĠgetTotal Size String (): ĠString Ġ= Ġget Disk String (). second ĊĊĠĠĠ Ġ@ Jvm Static ĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠ Ġfun Ġget Available Size String (): ĠString Ġ= Ġget Disk String (). first ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠ Ġprivate Ġfun Ġget Disk (): ĠPair < Long , ĠLong > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsd Card Info Ġ= Ġget SD Card Info () ĊĠĠĠĠĠĠĠ Ġif Ġ( sd Card Info . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 L Ġto Ġ 0 L ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġsd Card Info . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sd Card Info [ i ]. is Remov able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġsd Card Info [ i ]. path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Disk Capacity Ignore Unit ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 L Ġto Ġ 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠ Ġprivate Ġfun Ġget Disk String (): ĠPair < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsd Card Info Ġ= Ġget SD Card Info () ĊĠĠĠĠĠĠĠ Ġif Ġ( sd Card Info . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" Ġto Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġsd Card Info . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sd Card Info [ i ]. is Remov able ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġsd Card Info [ i ]. path ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġget Disk Capacity String ( s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"" Ġto Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠ Ġprivate Ġfun Ġget Disk Capacity String ( ĊĠĠĠĠĠĠĠ Ġpath : ĠString ĊĠĠĠ Ġ): ĠPair < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" Ġto Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstat Ġ= ĠStat Fs ( path ) ĊĠĠĠĠĠĠĠ Ġval ĠblockSize Ġ= Ġstat . block Size Long ĊĠĠĠĠĠĠĠ Ġval Ġtotal Block Count Ġ= Ġstat . block Count Long ĊĠĠĠĠĠĠĠ Ġval Ġfee Block Count Ġ= Ġstat . available Blocks Long ĊĠĠĠĠĠĠĠ Ġreturn ĠFormatter . format FileSize ( F int ek Utils . required Context , ĠblockSize Ġ* Ġfee Block Count ) Ġto ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFormatter . format FileSize ( F int ek Utils . required Context , ĠblockSize Ġ* Ġtotal Block Count ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Requires Api ( Build . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) ĊĠĠĠ Ġfun Ġget Disk Capacity Ignore Unit ( path : ĠString ): ĠPair < Long , ĠLong > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 0 L Ġto Ġ 0 L ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġstat Ġ= ĠStat Fs ( path ) ĊĠĠĠĠĠĠĠ Ġval ĠblockSize Ġ= Ġstat . block Size Long ĊĠĠĠĠĠĠĠ Ġval Ġtotal Block Count Ġ= Ġstat . block Count Long ĊĠĠĠĠĠĠĠ Ġval Ġfee Block Count Ġ= Ġstat . available Blocks Long ĊĠĠĠĠĠĠĠ Ġreturn ĠblockSize Ġ* Ġfee Block Count Ġto ĠblockSize Ġ* Ġtotal Block Count ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget SD Card Info (): ĠList < SD Card Info > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpaths : ĠMutable List < SD Card Info > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠArrayList () ĊĠĠĠĠĠĠĠ Ġval Ġsm Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠF int ek Utils . required Context . getSystem Service ( Context . STORAGE _ SERVICE ) Ġas ? ĠStorage Manager ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġpaths ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstorage Volumes Ġ= Ġsm . storage Volumes ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsafely Void Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠgetPath Method Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Volume :: class . java . getMethod (" getPath ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( storage Volume Ġin Ġstorage Volumes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Remov able Ġ= Ġstorage Volume . is Remov able Ġ// æĺ¯åĲ¦ åı¯ åį ¸ è½½ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= Ġstorage Volume . state Ġ// æĺ¯åĲ¦ å·² è½½ åħ¥ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetPath Method . invoke ( storage Volume ) Ġas ĠString Ġ// è·¯å¾Ħ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaths . add ( SD Card Info ( path , Ġstate , Ġis Remov able )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaths ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsafely Void Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstorage Volume Clazz Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass . forName (" android . os . storage . Storage Volume ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠgetPath Method Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Volume Clazz . getMethod (" getPath ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Remov able Method Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstorage Volume Clazz . getMethod (" is Remov able ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġget Volume State Method Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Manager :: class . java . getMethod ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" get Volume State ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString :: class . java ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġget Volume List Method Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStorage Manager :: class . java . getMethod (" get Volume List ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġget Volume List Method . invoke ( sm ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlength Ġ= Ġjava . lang . reflect . Array . getLength ( result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġlength ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstorage Volume Element Ġ= Ġjava . lang . reflect . Array . get ( result , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetPath Method . invoke ( storage Volume Element ) Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Remov able Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Remov able Method . invoke ( storage Volume Element ) Ġas ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstate Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Volume State Method . invoke ( sm , Ġpath ) Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpaths . add ( SD Card Info ( path , Ġstate , Ġis Remov able )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpaths ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠSD Card Info ( ĊĠĠĠĠĠĠĠ Ġval Ġpath : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġstate : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġis Remov able : ĠBoolean ĊĠĠĠ Ġ) Ċ }