package Ġme . to ss y . flutter . unique _ ids Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . wifi . Wifi Info Ċ import Ġandroid . net . wifi . Wifi Manager Ċ import Ġandroid . os . AsyncTask Ċ import Ġandroid . os . Build Ċ import Ġandroid . provider . Settings Ċ import Ġandroid . text . TextUtils Ċ import Ġcom . google . android . gms . ads . identifier . Ad vertising Id Client Ċ import Ġcom . google . android . gms . ads . identifier . Ad vertising Id Client . Info Ċ import Ġcom . google . android . gms . common . Google Play Services Not Available Exception Ċ import Ġio . flutter . plugin . common . MethodCall Ċ import Ġio . flutter . plugin . common . Method Channel Ċ import Ġio . flutter . plugin . common . Method Channel . MethodCall Handler Ċ import Ġio . flutter . plugin . common . Method Channel . Result Ċ import Ġio . flutter . plugin . common . Plugin Registry . Registrar Ċ import Ġjava . io . BufferedReader Ċ import Ġjava . io . File Ċ import Ġjava . io . FileReader Ċ import Ġjava . io . IOException Ċ import Ġjava . net . NetworkInterface Ċ import Ġjava . net . Socket Exception Ċ import Ġjava . security . Message Digest Ċ import Ġjava . util .* Ċ Ċ class ĠUnique Ids Plugin ( private Ġval Ġregist rar : ĠRegist rar ) Ġ: ĠMethod Call Handler Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġregister With ( regist rar : ĠRegist rar ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchannel Ġ= ĠMethod Channel ( regist rar . messenger (), Ġ" unique _ ids ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchannel . set MethodCall Handler ( Unique Ids Plugin ( regist rar )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon MethodCall ( call : ĠMethod Call , Ġresult : ĠResult ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . method Ġ== Ġ" ad Id " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAd Id Task ( result ). execute ( regist rar . context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . method Ġ== Ġ" uuid " Ġ-> Ġresult . success ( UUID . randomUUID (). toString (). replace ("- ", Ġ"")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcall . method Ġ== Ġ" real DeviceId " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠReal DeviceId Task ( result ). execute ( regist rar . context ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġresult . not Implemented () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠAd Id Task ( private Ġval Ġresult : ĠResult ) Ġ: ĠAsync Task < Context , ĠVoid , ĠString >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġdo In Background ( var arg Ġparams : ĠContext ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġad Info : ĠInfo ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġad Info Ġ= ĠAd vertising Id Client . get Ad vertising Id Info ( params [ 0 ]) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUn recover able Ġerror Ġconnecting Ġto ĠGoogle ĠPlay Ġservices Ġ( e . g ., ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġold Ġversion Ġof Ġthe Ġservice Ġdoesn 't Ġsupport Ġgetting ĠAd vertising Id ). ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ""; ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠGoogle Play Services Not Available Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠGoogle ĠPlay Ġservices Ġis Ġnot Ġavailable Ġentirely . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ""; ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġid Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġad Info ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġad Info . id ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġid ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Post Execute ( id : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Post Execute ( id ) ĊĠĠĠĠĠĠĠ Ġresult . success ( id ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠReal DeviceId Task ( private Ġval Ġresult : ĠResult ) Ġ: ĠAsync Task < Context , ĠVoid , ĠString >() Ġ{ ĊĠĠĠĠĊĠĠĠ Ġoverride Ġfun Ġdo In Background ( var arg Ġparams : ĠContext ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// èİ·åıĸ Real è®¾å¤ĩ ID ĊĠĠĠĠĠĠĠ Ġvar Ġuuid Str Ġ= Ġget Media D rm Unique ID ( W IDE V INE _ UUID ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Invalid Id ( uuid Str )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuuid Str Ġ= Ġget Unique Ps ued o ID ( params [ 0 ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġget MD 5 ( uuid Str , Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġon Post Execute ( md 5 Real DeviceId : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . on Post Execute ( md 5 Real DeviceId ) ĊĠĠĠĠĠĠĠ Ġresult . success ( md 5 Real DeviceId ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠW IDE V INE _ UUID Ġ= ĠUUID (- 0 x 1 2 1 0 7 4 5 6 8 6 2 9 b 5 3 2 L , Ġ- 0 x 5 c 3 7 d 8 2 3 2 ae 2 de 1 3 L ) ĊĊĠĠĠ Ġprivate Ġfun Ġget Media D rm Unique ID ( uuid : ĠUUID ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġw v D rm : ĠMedia D rm ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw v D rm Ġ= ĠMedia D rm ( uuid ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm ive v ine Id Ġ= Ġw v D rm . getProperty ByteArray ( Media D rm . PROPERTY _ DEVICE _ UNIQUE _ ID ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmd Ġ= ĠMessage Digest . getInstance (" SHA - 2 5 6 ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmd . update ( m ive v ine Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUUID . name UUID From Bytes ( md . digest ()). toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( wv D rm Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . P ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw v D rm . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġw v D rm . release () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// èİ·å¾Ĺ çĭ¬ ä¸Ģ æĹł äºĮ çļĦ Ps ued o ĠID ĊĠĠĠ Ġprivate Ġfun Ġget Unique Ps ued o ID ( context : ĠContext ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġserial : ĠString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ// ä½¿çĶ¨ ç¡¬ ä»¶ ä¿¡æģ¯ æĭ ¼ åĩ ĳ åĩº æĿ¥çļĦ 1 5 ä½į åı· çłģ ĊĠĠĠĠĠĠĠ Ġval Ġm Sz Dev ID Short Ġ= Ġ" 3 5 " Ġ+ ĠBuild . BOARD . length Ġ% Ġ 1 0 Ġ+ ĠBuild . B RAND . length Ġ% Ġ 1 0 Ġ+ ĠBuild . CPU _ ABI . length Ġ% Ġ 1 0 Ġ+ ĠBuild . DEVICE . length Ġ% Ġ 1 0 Ġ+ ĠBuild . DISPLAY . length Ġ% Ġ 1 0 Ġ+ ĠBuild . HOST . length Ġ% Ġ 1 0 Ġ+ ĠBuild . ID . length Ġ% Ġ 1 0 Ġ+ ĠBuild . MAN U FACT UR ER . length Ġ% Ġ 1 0 Ġ+ ĠBuild . MODEL . length Ġ% Ġ 1 0 Ġ+ ĠBuild . PRODUCT . length Ġ% Ġ 1 0 Ġ+ ĠBuild . TAGS . length Ġ% Ġ 1 0 Ġ+ ĠBuild . TYPE . length Ġ% Ġ 1 0 Ġ+ ĠBuild . USER . length Ġ% Ġ 1 0 Ġ// 1 3 Ġ ä½į ĊĠĠĠĠĠĠĠ Ġserial Ġ= Ġdevice Serial ĊĠĠĠĠĠĠĠ Ġif Ġ( is Invalid Id ( serial )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġserial Ġ= Ġget Device Android Id ( context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠUUID ( m Sz Dev ID Short . hashCode (). to Long (), Ġserial . hashCode (). to Long ()). toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Device Android Id ( context : ĠContext ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġandroid Id Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ( context Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġandroid Id Ġ= ĠSettings . Secure . getString ( context ?. content Resolver , ĠSettings . Secure . ANDROID _ ID ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( is Invalid Id ( android Id )) ĠUUID . randomUUID (). toString (). replace ("- ", Ġ"") Ġelse Ġandroid Id Ġ// Ġ éļı ä¾¿ ä¸Ģä¸ª åĪĿå§ĭåĮĸ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// Build . VERSION . SDK _ INT >= 2 9 ä¼ļ å¾ĹåĪ° unknown ( éľĢè¦ģ éħįç½® READ _ PHONE åį ± éĻ© æĿĥéĻĲ ) ĊĠĠĠ Ġprivate Ġval Ġdevice Serial : ĠString ? ĊĠĠĠĠĠĠĠ Ġprivate Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġstr : ĠString ? Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ< Ġ 2 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstr Ġ= ĠBuild . SERIAL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= Ġ 2 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclazz Ġ= ĠClass . forName (" android . os . Build ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġclazz . getMethod (" get Serial ", Ġ* array Of Null s ( 0 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstr Ġ= Ġmethod . invoke ( clazz , Ġ* array Of Null s ( 0 )) Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( throwable : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstr ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Invalid Id ( str : ĠCharSequence ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstr Ġ== Ġnull Ġ|| Ġstr . isEmpty () Ġ|| Ġstr Ġ== Ġ" unknown " ĊĠĠĠ Ġ} ĊĠĠĠĠĊĊĠĠĠ Ġprivate Ġfun Ġget MD 5 ( message : ĠString , Ġupper Case : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmd 5 str Ġ= Ġ"" ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmd Ġ= ĠMessage Digest . getInstance (" MD 5 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġmessage . toByteArray () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuff Ġ= Ġmd . digest ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmd 5 str Ġ= Ġbytes To Hex ( buff , Ġupper Case ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġmd 5 str ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbytes To Hex ( bytes : ĠByteArray , Ġupper Case : ĠBoolean ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmd 5 str Ġ= ĠStringBuffer () ĊĠĠĠĠĠĠĠ Ġvar Ġdigital : ĠInt ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġbytes . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdigital Ġ= Ġbytes [ i ]. toInt () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( digital Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdigital Ġ+= Ġ 2 5 6 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( digital Ġ< Ġ 1 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmd 5 str . append (" 0 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmd 5 str . append ( Integer . to HexString ( digital )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( upper Case ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmd 5 str . toString (). toUpperCase () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġmd 5 str . toString (). toLowerCase () ĊĠĠĠ Ġ} Ċ }