package Ġcn . lan ru . lr application . module . utils . m anger Ċ Ċ import Ġandroid . app . Download Manager Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . Intent Ċ import Ġandroid . content . SharedPreferences Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . os . Environment Ċ import Ġandroid . os . Handler Ċ import Ġandroid . os . Looper Ċ import Ġandroid . util . Log Ċ import Ġandroidx . core . content . File Provider Ċ import Ġcn . hc . download m anger . My Application Ċ import Ġcn . hc . download m anger . SP Utils Ċ import Ġcn . hc . download m anger . m anger . Down Load A pk Listener Ċ import Ġjava . io . File Ċ import Ġjava . text . Decimal Format Ċ import Ġjava . util .* Ċ import Ġkotlin . collections . ArrayList ĊĊ Ċ /** Ċ Ġ* Ġ@ ClassName : ĠDown Load M anger Utils Ċ Ġ* Ġ@ Description : Ġjava ç±» ä½ľçĶ¨ æııè¿° Ċ Ġ* Ġ@ Author : Ġz eng qi ang Ċ Ġ* Ġ@ github : Ġhttps :// github . com / zq My self Ċ Ġ* Ġ@ Date : Ġ 2 0 2 1 - 0 7 - 0 9 Ġ 1 4 : 4 4 Ċ Ġ*/ Ċ class ĠDownload Manager Utils Ġ{ ĊĊĠĠĠ Ġvar Ġdownload Manager Ġ: Download Manager ?= null ĊĠĠĠ Ġvar Ġid Ġ= Ġ 0 L ĊĠĠĠ Ġvar Ġurl Ġ= Ġ"" ĊĠĠĠ Ġvar Ġm Handler Ġ= ĠHandler ( Looper . get Main Looper ()) ĊĠĠĠ Ġvar Ġtimer Ġ: ĠTimer ?= null ĊĠĠĠ Ġcompanion Ġobject ĊĠĠĠ Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġlistener List Ġ= ĠArrayList < Down Load A pk Listener >() ĊĠĠĠĠĠĠĠ Ġfun Ġset Down Load A pk Listener ( down Load A pk Listener : Down Load A pk Listener ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener List . add ( down Load A pk Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġremove Down Load A pk Listener ( down Load A pk Listener : Down Load A pk Listener ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlistener List . remove ( down Load A pk Listener ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun Ġdown Load ( title : String , description : String , down Load Html Url : String ){ ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfun ĠgetData Size ( size : ĠLong ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠGB Ġ= Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 ;// å®ļä¹ī GB çļĦ è®¡ç®Ĺ å¸¸ éĩı ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠMB Ġ= Ġ 1 0 2 4 Ġ* Ġ 1 0 2 4 ;// å®ļä¹ī MB çļĦ è®¡ç®Ĺ å¸¸ éĩı ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠKB Ġ= Ġ 1 0 2 4 ;// å®ļä¹ī KB çļĦ è®¡ç®Ĺ å¸¸ éĩı ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġ Ġdf Ġ= ĠDecimal Format (" 0 . 0 0 "); // æł¼å¼ı åĮĸ å°ı æķ° ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult Size Ġ= Ġ""; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( size Ġ/ ĠGB Ġ>= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¦Ĥæŀľ å½ĵåīį Byte çļĦåĢ¼ å¤§äºİ çŃīäºİ 1 GB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Size Ġ= Ġdf . format ( size Ġ/ Ġ ĠGB . toFloat ()) Ġ+ Ġ" GB "; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( size Ġ/ ĠMB Ġ>= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¦Ĥæŀľ å½ĵåīį Byte çļĦåĢ¼ å¤§äºİ çŃīäºİ 1 MB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Size Ġ= Ġdf . format ( size Ġ/ Ġ ĠMB . toFloat ()) Ġ+ Ġ" MB "; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( size Ġ/ ĠKB Ġ>= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å¦Ĥæŀľ å½ĵåīį Byte çļĦåĢ¼ å¤§äºİ çŃīäºİ 1 KB ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Size Ġ= Ġdf . format ( size Ġ/ ĠKB . toFloat ()) Ġ+ Ġ" KB "; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Size Ġ= Ġ Ġ"$ size ĠB "; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult Size ; ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġ Ġnotify Listener ( state : Int , progress : Int ){ ĊĊĠĠĠĠĠĠĠ Ġm Handler . post Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġiterator Ġ= Ġlistener List . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlistener Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlistener . call ( url , Ġstate , Ġprogress ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdown Load ( title : String , description : String , down Load Html Url : String ){ ĊĠĠĠĠĠĠĠ Ġthis . url Ġ= Ġdown Load Html Url ĊĊĠĠĠĠĠĠĠ Ġvar Ġuri Ġ= ĠUri . parse ( down Load Html Url ) ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠDownload Manager . Request ( uri ) ĊĠĠĠĠĠĠĠ Ġ// è®¾ç½® æ¼ « æ¸¸ æĿ¡ä»¶ ä¸ĭ æĺ¯åĲ¦ åı¯ä»¥ ä¸ĭè½½ ĊĠĠĠĠĠĠĠ Ġrequest . set Allowed Over Roaming ( false ) ĊĠĠĠĠĠĠĠ Ġ// åľ¨ éĢļçŁ¥ æłı ä¸Ń æĺ¾ç¤º ï¼Į é»ĺè®¤ å°±æĺ¯ æĺ¾ç¤º çļĦ ĊĠĠĠĠĠĠĠ Ġrequest . set Notification Visibility ( Download Manager . Request . VIS IBILITY _ VISIBLE ) ĊĠĠĠĠĠĠĠ Ġ// è®¾ç½® éĢļçŁ¥ æłĩé¢ĺ ĊĠĠĠĠĠĠĠ Ġrequest . setTitle ( title ) ĊĠĠĠĠĠĠĠ Ġ// è®¾ç½® éĢļçŁ¥ æłĩé¢ĺ message ĊĠĠĠĠĠĠĠ Ġrequest . setDescription ( description ) ĊĠĠĠĠĠĠĠ Ġrequest . setVisible In Downloads Ui ( true ) ĊĠĠĠĠĠĠĠ Ġrequest . allow Sc anning By Media Scanner () ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġdown Load Html Url . lastIndexOf ("/") ĊĠĠĠĠĠĠĠ Ġval Ġapk Name : ĠString Ġ= Ġdown Load Html Url . substring ( index Ġ+ Ġ 1 , Ġdown Load Html Url . length ) ĊĠĠĠĠĠĠĠ Ġ// è®¾ç½® æĸĩä»¶ åŃĺ æĶ¾ è·¯å¾Ħ ĊĠĠĠĠĠĠĠ Ġval Ġdirectory Ġ= Ġget Disk Cache Dir ( My Application . context !! ) ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( directory , Ġ"/ download /$ apk Name ") ĊĊĠĠĠĠĠĠĠ Ġrequest . set Destination Uri ( Uri . from File ( file )) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( download Manager Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdownload Manager Ġ= ĠMy Application . context !!. getSystem Service ( Context . DOWNLOAD _ SERVICE ) Ġas ĠDownload Manager ĊĠĠĠĠĠĠĠ Ġ// å°Ĩ ä¸ĭè½½ è¯·æ±Ĥ åĬłåħ¥ ä¸ĭè½½ éĺŁåĪĹ ï¼Į åĬłåħ¥ ä¸ĭè½½ éĺŁåĪĹ åĲİ ä¼ļ ç»Ļ è¯¥ ä»»åĬ¡ è¿ĶåĽŀ ä¸Ģä¸ª long åŀĭ çļĦ id ï¼Į éĢļè¿ĩ è¯¥ id åı¯ä»¥ åıĸæ¶Ī ä»»åĬ¡ ï¼Į éĩį åĲ¯ ä»»åĬ¡ ãĢģ èİ·åıĸ ä¸ĭè½½ çļĦæĸĩä»¶ çŃī çŃī ĊĠĠĠĠĠĠĠ Ġif Ġ( download Manager Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġid Ġ= Ġdownload Manager !!. enqueue ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . id Ġ= Ġid ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( SP Utils . sp Utils . contains ( url )){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Status ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSP Utils . sp Utils . put ( url , id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Timer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġstart Timer (){ ĊĠĠĠĠĠĠĠ Ġif Ġ( timer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer = ĠTimer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtimer !!. schedule ( object Ġ: ĠTimer Task () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Status ( id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, Ġ 1 0 0 , Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Disk Cache Dir ( context : ĠContext ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcache Path : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġcache Path Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Environment . MEDIA _ MOUNT ED Ġ== ĠEnvironment . get External Storage State () Ġ|| Ġ! Environment . is External Storage Remov able ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . external Cache Dir !!. path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . cacheDir . path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcache Path ĊĠĠĠ Ġ} ĊĠĠĠ Ġprivate Ġfun Ġcheck Status ( id : Long ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġquery Ġ= ĠDownload Manager . Query () ĊĊĠĠĠĠĠĠĠ Ġ// éĢļè¿ĩ ä¸ĭè½½ çļĦ id æŁ¥æī¾ ĊĠĠĠĠĠĠĠ Ġquery . set Filter ById ( id ) ĊĠĠĠĠĠĠĠ Ġvar Ġcursor : ĠCursor ?= null ĊĠĠĠĠĠĠĠ Ġcursor Ġ= Ġdownload Manager !!. query ( query ) ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Listener ( ĠDownload Manager . STATUS _ FAILED , Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( timer Ġ!= null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer !!. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSP Utils . sp Utils . remove ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo First ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus : ĠInt Ġ= Ġcursor . getInt ( cursor . getColumnIndex ( Download Manager . COLUMN _ STATUS )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDownload Manager . STATUS _ PA USED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" tag "," STATUS _ PA USED Ġ+" Ġ+ ĠDownload Manager . STATUS _ PA USED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDownload Manager . STATUS _ PENDING Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" tag "," STATUS _ PENDING Ġ+" Ġ+ ĠDownload Manager . STATUS _ PENDING ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Timer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDownload Manager . STATUS _ RUNNING Ġ-> Ġ{ ĊĊ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" tag "," STATUS _ RUNNING Ġ+" Ġ+ ĠDownload Manager . STATUS _ RUNNING ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbytes And Status Ġ= Ġcursor . getInt ( cursor . getColumnIndex ( Download Manager . COLUMN _ BYTES _ DOWN LOADED _ SO _ FAR )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Size Ġ= Ġcursor . getInt ( cursor . getColumnIndex ( Download Manager . COLUMN _ TOTAL _ SIZE _ BYTES )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġ Ġdl _ progress Ġ= Ġ(( bytes And Status Ġ* Ġ 1 0 0 L ) Ġ/ Ġtotal Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Listener ( Download Manager . STATUS _ RUNNING , Ġdl _ progress . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" tag "," STATUS _ PENDING Ġ Ġbytes And Status Ġ= Ġ$ dl _ progress ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDownload Manager . STATUS _ SUCCESS FUL Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Listener ( ĠDownload Manager . STATUS _ SUCCESS FUL , Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġname Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ> ĠBuild . VERSION _ CODES . M ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfile Uri Idx Ġ= Ġcursor . getColumnIndex ( Download Manager . COLUMN _ LOCAL _ URI ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfile Uri Ġ= Ġcursor . getString ( file Uri Idx ); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file Uri Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠUri . parse ( file Uri ). getPath () !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġcursor . getString ( cursor . getColumnIndex ( Download Manager . COLUMN _ LOCAL _ FILENAME )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( timer Ġ!= null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer !!. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä¸ĭè½½ å®ĮæĪĲ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSP Utils . sp Utils . remove ( url ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" tag "," STATUS _ SUCCESS FUL Ġ+" Ġ+ ĠDownload Manager . STATUS _ SUCCESS FUL Ġ+ ", id ="+ id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstall A pk ( File ( name )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDownload Manager . STATUS _ FAILED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" tag "," STATUS _ FAILED Ġ+" Ġ+ ĠDownload Manager . STATUS _ FAILED ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( timer Ġ!= null ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtimer !!. cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinstall A pk ( file : File ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ VIEW ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Flags ( Intent . FLAG _ GRANT _ READ _ URI _ PERMISSION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( Intent . EXTRA _ NOT _ UNKNOWN _ SOURCE , Ġtrue ) Ġ// è¡¨ æĺİ ä¸įæĺ¯ æľª çŁ¥ æĿ¥ æºĲ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġuri Ġ= ĠFile Provider . get Uri For File ( My Application . context !! , ĠMy Application . context !!. packageName Ġ+ Ġ". file provider ", Ġfile ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . setData And Type ( uri , Ġ" application / vnd . android . package - archive ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMy Application . context !!. startActivity ( intent ) ĊĊĠĠĠĠĠĠĠ Ġ} else Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġintent Ġ= ĠIntent ( Intent . ACTION _ VIEW ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . setData And Type ( Uri . from File ( file ), Ġ" application / vnd . android . package - archive ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . putExtra ( Intent . EXTRA _ NOT _ UNKNOWN _ SOURCE , Ġtrue ) Ġ// è¡¨ æĺİ ä¸įæĺ¯ æľª çŁ¥ æĿ¥ æºĲ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġintent . add Flags ( Intent . FLAG _ ACTIVITY _ NEW _ TASK ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMy Application . context !!. startActivity ( intent ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }