@ file : Jvm Name (" Net Utils ") Ċ Ċ package Ġtop . xu q ing qu an . utils Ċ Ċ import Ġandroid . Manifest Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Connectivity Manager Ċ import Ġandroid . net . Network Ċ import Ġandroid . net . wifi . Wifi Info Ċ import Ġandroid . net . wifi . Wifi Manager Ċ import Ġandroid . os . Build Ċ import Ġandroid . tele phony . Tele phony Manager Ċ import Ġandroid . text . TextUtils Ċ import Ġandroidx . core . content . Context Compat Ċ import Ġandroidx . lifecycle . Mutable LiveData Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . File Ċ import Ġjava . io . FileReader Ċ import Ġjava . net . Inet Address Ċ import Ġjava . net . NetworkInterface Ċ import Ġjava . net . Socket Exception Ċ import Ġjava . util .* ĊĊ Ċ /** Ċ Ġ* Ġ@ author Ġ è®¸ æ¸ħ æ³ ī Ġon Ġ 2 0 1 9 - 0 5 - 2 7 Ġ 0 0 : 5 4 Ċ Ġ*/ Ċ @ Suppress (" DE PREC ATION ") Ċ fun Ġcheck Network Type ( ctx : ĠContext ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġcontext Ġ= Ġctx . application Context ĊĠĠĠ Ġval Ġnet Type Ġ= Ġ 0 ĊĠĠĠ Ġ// è¿ŀæİ¥ ç®¡çĲĨ å¯¹è±¡ ĊĠĠĠ Ġval Ġmanager Ġ= ĊĠĠĠĠĠĠĠ ĠContext Compat . getSystem Service ( context , ĠConnect ivity Manager :: class . java ) Ġ?: Ġreturn Ġnet Type ĊĠĠĠ Ġ// èİ·åıĸ Network Info å¯¹è±¡ ĊĠĠĠ Ġval Ġnetwork Info Ġ= Ġmanager . active Network Info Ġ?: Ġreturn Ġnet Type ĊĠĠĠ Ġreturn Ġwhen Ġ( network Info . type ) Ġ{ ĊĠĠĠĠĠĠĠ ĠConnect ivity Manager . TYPE _ WIFI , ĠConnect ivity Manager . TYPE _ WI MAX , ĠConnect ivity Manager . TYPE _ ETHER NET Ġ-> Ġ 1 ĊĠĠĠĠĠĠĠ ĠConnect ivity Manager . TYPE _ MOB ILE Ġ-> Ġwhen Ġ( network Info . subtype ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTele phony Manager . NETWORK _ TYPE _ LTE Ġ Ġ// Ġ 4 G ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, ĠTele phony Manager . NETWORK _ TYPE _ H SP AP , ĠTele phony Manager . NETWORK _ TYPE _ E HR PD Ġ-> Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTele phony Manager . NETWORK _ TYPE _ UM TS Ġ// Ġ 3 G ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, ĠTele phony Manager . NETWORK _ TYPE _ CD MA , ĠTele phony Manager . NETWORK _ TYPE _ EV DO _ 0 , ĠTele phony Manager . NETWORK _ TYPE _ EV DO _ A , ĠTele phony Manager . NETWORK _ TYPE _ EV DO _ B Ġ-> Ġ 3 ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTele phony Manager . NETWORK _ TYPE _ G PR S Ġ// Ġ 2 G ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, ĠTele phony Manager . NETWORK _ TYPE _ EDGE Ġ-> Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnet Type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnet Type ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun Ġcheck Network Type Str ( ctx : ĠContext ): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( check Network Type ( ctx )) Ġ{ ĊĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ" WIFI " ĊĠĠĠĠĠĠĠĠ 2 Ġ-> Ġ" 4 G " ĊĠĠĠĠĠĠĠĠ 3 Ġ-> Ġ" 3 G " ĊĠĠĠĠĠĠĠĠ 4 Ġ-> Ġ" 2 G " ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" æľª çŁ¥ " ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" DE PREC ATION ") Ċ fun Ġnetwork Is Connect ( ctx : ĠContext , Ġcallback : ĠMutable LiveData < Boolean >? Ġ= Ġnull ): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= Ġctx . application Context ĊĠĠĠĠĠĠĠ Ġval Ġconnectivity Ġ= ĠContext Compat . getSystem Service ( context , ĠConnect ivity Manager :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġinfo Ġ= Ġconnectivity ?. active Network Info ĊĠĠĠĠĠĠĠ Ġif Ġ( callback Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconnectivity ?. register Default Network Callback ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠConnect ivity Manager . Network Callback () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Available ( network : ĠNetwork ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Available ( network ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . post Value ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Lost ( network : ĠNetwork ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . on Lost ( network ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . post Value ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcallback . post Value ( info Ġ!= Ġnull Ġ&& Ġinfo . isConnected ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġinfo Ġ!= Ġnull Ġ&& Ġinfo . isConnected ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġèİ·åıĸ å½ĵåīį ip åľ°åĿĢ Ċ Ġ*/ Ċ fun Ġget IPAddress ( use IPv 4 : ĠBoolean ): ĠString Ġ{ ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġn is : ĠEnumeration < NetworkInterface ?> Ġ= ĠNetwork Interface . get Network Interfaces () ĊĠĠĠĠĠĠĠ Ġval Ġadds : ĠLinkedList < Inet Address ?> Ġ= ĠLinkedList () ĊĠĠĠĠĠĠĠ Ġwhile Ġ( nis . hasMore Elements ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġni Ġ= Ġn is . nextElement () Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTo Ġprevent Ġphone Ġof Ġx ia omi Ġreturn Ġ" 1 0 . 0 . 2 . 1 5 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ni . is Up Ġ|| Ġni . is Loop back ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaddresses Ġ= Ġni . inet Addresses ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( addresses . hasMore Elements ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadds . add First ( addresses . nextElement ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( add Ġin Ġadds ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( add Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! add . is Loop back Address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhost Address Ġ= Ġadd . host Address ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost Address Ġ?: Ġreturn Ġ" 0 . 0 . 0 . 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis IPv 4 Ġ= Ġhost Address . indexOf (': ') Ġ< Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use IPv 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is IPv 4 ) Ġreturn Ġhost Address ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is IPv 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġhost Address . indexOf ('% ') ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( index Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost Address . uppercase ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhost Address . substring ( 0 , Ġindex ). uppercase ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠSocket Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġ"" Ċ } Ċ Ċ /** Ċ Ġ* Ġèİ·åıĸ MAC åľ°åĿĢ Ċ Ġ* Ċ Ġ* Ġ@ param Ġcontext Ċ Ġ* Ġ@ return Ċ Ġ*/ Ċ fun Ġget Mac Address ( context : ĠContext ): ĠString Ġ{ ĊĊĠĠĠ Ġvar Ġmac Ġ= Ġ" 0 2 : 0 0 : 0 0 : 0 0 : 0 0 : 0 0 " ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAndroid ĠĠ 6 . 0 Ġ ä¹ĭåīį ï¼Ī ä¸į åĮħæĭ¬ 6 . 0 ï¼ī ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Mac Default ( context : ĠContext ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwifi Ġ= ĠContext Compat . getSystem Service ( context , ĠW ifi Manager :: class . java ) Ġ?: Ġreturn Ġmac ĊĠĠĠĠĠĠĠ Ġvar Ġinfo : ĠW ifi Info ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Ġ= Ġwifi . connection Info ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( info Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmac ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( has Permission ( context , Manifest . permission . ACCESS _ F INE _ LOCATION )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress Lint (" Hardware Ids "," Missing Permission ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( info . mac Address . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmac ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( mac )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmac Ġ= Ġmac . uppercase ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmac ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAndroid Ġ 6 . 0 ï¼Ī åĮħæĭ¬ ï¼ī Ġ- ĠAndroid Ġ 7 . 0 ï¼Ī ä¸į åĮħæĭ¬ ï¼ī ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Mac FromFile (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmac Ġ= ĠBufferedReader ( FileReader ( File ("/ sys / class / net / w lan 0 / address ")) ). readLine () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmac ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ éģįåİĨ å¾ªçİ¯ æīĢæľīçļĦ ç½ĳç»ľ æİ¥åı£ ï¼Į æī¾åĪ° æİ¥åı£ æĺ¯ Ġw lan 0 ĊĠĠĠĠ Ġ* Ġ å¿ħé¡» çļĦ æĿĥéĻĲ Ġ< uses - permission Ġandroid : name =" android . permission . INTER NET "></ uses - permission > ĊĠĠĠĠ Ġ* Ġ@ return ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Mac From Hardware (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Ġ= ĠNetwork Interface . get Network Interfaces () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( n if Ġin Ġall ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! n if . name . equals (" w lan 0 ", Ġignore Case Ġ= Ġtrue )) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmac Bytes Ġ= Ġn if . hardware Address Ġ?: Ġreturn Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġres 1 Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( b Ġin Ġmac Bytes ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres 1 . append ( String . format ("% 0 2 X :", Ġb )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( res 1 . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġres 1 . delete Char At ( res 1 . length Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġres 1 . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġmac ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ ĠBuild . VERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . M Ġ-> Ġmac Ġ= Ġget Mac Default ( context ) ĊĠĠĠĠĠĠĠ ĠBuild . VERSION . SDK _ INT Ġ< ĠBuild . VERSION _ CODES . N Ġ-> Ġmac Ġ= Ġget Mac FromFile () ĊĠĠĠĠĠĠĠ ĠBuild . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . N Ġ-> Ġmac Ġ= Ġget Mac From Hardware () ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġmac Ċ } Ċ Ċ fun Ġget SSID ( context : ĠContext ): ĠString Ġ{ ĊĠĠĠ Ġval Ġmanager Ġ= ĠContext Compat . getSystem Service ( context , ĠW ifi Manager :: class . java ) ĊĠĠĠ Ġval Ġinfo Ġ= Ġmanager ?. connection Info ĊĠĠĠ Ġreturn Ġinfo ?. ssid ?. replace (" \"", Ġ"") Ġ?: Ġ"< unknown Ġss id >" Ċ } Ċ Ċ fun Ġhas Sim ( context : ĠContext ): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġmanager Ġ= ĠContext Compat . getSystem Service ( context , ĠTele phony Manager :: class . java ) ĊĠĠĠ Ġreturn Ġmanager ?. sim State Ġ== ĠTele phony Manager . SIM _ STATE _ READY Ċ } Ċ Ċ fun Ġget Cell ular Operator Type ( context : ĠContext ): ĠString Ġ{ ĊĠĠĠ Ġvar Ġoperator Type Ġ= Ġ" ç½ĳç»ľ æľª çŁ¥ " ĊĠĠĠ Ġif Ġ(! network Is Connect ( context )) Ġ{ ĊĠĠĠĠĠĠĠ Ġoperator Type Ġ= Ġ" ç½ĳç»ľ æ²¡æľī è¿ŀæİ¥ " ĊĠĠĠĠĠĠĠ Ġreturn Ġoperator Type ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġnetwork Type Ġ= Ġcheck Network Type Str ( context ) ĊĠĠĠ Ġif Ġ(! has Sim ( context )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ network Type - æ²¡æľī sim åį¡ " ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġmanager Ġ= ĠContext Compat . getSystem Service ( context , ĠTele phony Manager :: class . java ) ĊĠĠĠĠĠĠĠ Ġ?: Ġreturn Ġoperator Type ĊĠĠĠ Ġreturn Ġ"${ manager . sim Operator Name }- $ network Type " Ċ }