package Ġcom . lin wei . c ams . database Ċ Ċ import Ġandroid . annotation . Suppress Lint Ċ import Ġandroid . content . Content Resolver Ċ import Ġandroid . content . Context Ċ import Ġandroid . database . Cursor Ċ import Ġandroid . net . Uri Ċ import Ġandroid . os . Build Ċ import Ġandroid . provider . Call Log Ċ import Ġandroid . provider . Contacts Contract Ċ Ċ /** Ċ Ġ* Ġ---------------------------------------------------------------- ----- Ċ Ġ* Ġ@ Author : ĠWe i Sh u ai Ċ Ġ* Ġ@ Time : Ġ 2 0 2 0 / 5 / 2 0 Ċ Ġ* Ġ@ Contact Ġlin wei 9 6 0 5 @ gmail . com Ċ Ġ* Ġ@ Follow Ġhttps :// github . com / Wei Sh u ai Dev Ċ Ġ* Ġ@ Description : ĠæıĲ ä¾Ľ æķ°æį®åºĵ æŁ¥è¯¢ åĬŁèĥ½ Ċ Ġ* ----------------------------------------------------------------------- Ċ Ġ*/ Ċ object ĠData Base Provide Ġ{ ĊĊĠĠĠ Ġ@ Suppress Lint (" Missing Permission ") ĊĠĠĠ Ġfun Ġget Cursor ( resolver : ĠContent Resolver ?, Ġtype : ĠCollect Type ): ĠCursor ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( resolver Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCollect Type . CONTACT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContact s Contract . Contacts . CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , Ġnull , Ġnull , Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCollect Type . CALL _ LOG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Log . Calls . CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Log . Calls . C ACHED _ NAME , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Log . Calls . NUMBER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Log . Calls . TYPE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Log . Calls . DATE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Log . Calls . DURATION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCall Log . Calls . DEFAULT _ SORT _ ORDER ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCollect Type . SMS _ LOG Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUri . parse (" content :// sms "), ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" person ", Ġ Ġ// reference Ġto Ġitem Ġin Ġ{@ code Ġcontent :// contacts / people } ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" address ", Ġ Ġ// The Ġaddress Ġof Ġthe Ġother Ġparty . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" type ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" date ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" body ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" subject " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" date ĠDESC " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæŁ¥è¯¢ ä¸ĢæĿ¡ éĢļ è¯Ŀ è®°å½ķ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget One Call Log ( cursor : ĠCursor ?): ĠCall Log Entity ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn ĠCall Log Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( 0 ), Ġcursor . getString ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( 2 ), Ġcursor . getString ( 3 ), Ġcursor . getString ( 4 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæŁ¥è¯¢ ä¸ĢæĿ¡ çŁŃ ä¿¡ è®°å½ķ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget One Sms ( cursor : ĠCursor ?): ĠS ms Entity ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġreturn ĠS ms Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( 1 ), Ġcursor . getInt ( 2 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getLong ( 3 ), Ġcursor . getString ( 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( 5 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæŁ¥è¯¢ ä¸ĢæĿ¡ èģĶç³» äºº ä¿¡æģ¯ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget One Contact ( ĊĠĠĠĠĠĠĠ Ġcursor : ĠCursor ?, Ġcontact Id Numbers Map : ĠMap < Long , ĠList < Number Entity >>, ĊĠĠĠĠĠĠĠ Ġcontact Detail Map : ĠMap < Long , ĠContact Detail > ĊĠĠĠ Ġ): ĠContact Entity ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( cursor . getColumnIndex ( Contacts Contract . Phone Lookup . DISPLAY _ NAME )) ĊĊĠĠĠĠĠĠĠ Ġval Ġcontact Id : ĠLong Ġ= Ġcursor . getLong ( cursor . getColumnIndex ( Contacts Contract . Contacts ._ ID )) ĊĊĠĠĠĠĠĠĠ Ġval Ġdetail : ĠContact Detail ? Ġ= Ġcontact Detail Map [ contact Id ] ĊĠĠĠĠĠĠĠ Ġval Ġnumber : ĠList < Number Entity >? Ġ= Ġcontact Id Numbers Map [ contact Id ] ĊĠĠĠĠĠĠĠ Ġreturn ĠContact Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnumber , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Last UpdateTime ( cursor ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetail ?. contact _ times , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetail ?. last _ contact _ time , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetail ?. nickname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetail ?. relation , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdetail ?. status ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¯»åıĸ æľĢåĲİ ä¸Ģæ¬¡ ä¿®æĶ¹ æĹ¶éĹ´ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġread Last UpdateTime ( cursor : ĠCursor ?): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull ) Ġreturn Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġvar Ġindex : ĠInt Ġ= Ġcursor . getColumnIndex (" contact _ last _ updated _ timestamp ") ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcursor . getLong ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġindex Ġ= Ġcursor . getColumnIndex (" contact _ status _ ts ") ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcursor . getLong ( index ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¯»åıĸ ä¸ĢæĿ¡ çĶµ è¯Ŀ åı· çłģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġread One Contact Number ( context : ĠContext , Ġcursor : ĠCursor ?): ĠNumber Entity ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull ) Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġreturn ĠNumber Entity ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Number ( cursor ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Last Contact Time ( cursor ). toString (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Contact Times ( cursor ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Customer Data ( context , Ġcursor ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¯»åıĸ èģĶç³» äºº åı· çłģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġread Number ( cursor : ĠCursor ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull ) Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġvar Ġnumber : ĠString ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( cursor . getColumnIndex ( Contacts Contract . Common Data Kinds . Phone . NUMBER )) ĊĠĠĠĠĠĠĠ Ġnumber Ġ= Ġnumber ?. replace ("- ", Ġ"") ĊĠĠĠĠĠĠĠ Ġnumber Ġ= Ġnumber ?. replace (" Ġ", Ġ"") ĊĠĠĠĠĠĠĠ Ġreturn Ġnumber ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¯»åıĸ èģĶç³» äºº æĹ¶éĹ´ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġread Contact Times ( cursor : ĠCursor ?): ĠInt ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull ) Ġreturn Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") Ġval Ġindex : ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getColumnIndex ( Contacts Contract . Common Data Kinds . Phone . TIMES _ USED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcursor . getInt ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex : ĠInt Ġ= Ġcursor . getColumnIndex (" times _ contact ed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcursor . getInt ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¯»åıĸ èģĶç³» äºº æľĢåĲİ ä¸Ģæ¬¡ æĹ¶éĹ´ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġread Last Contact Time ( cursor : ĠCursor ?): ĠLong ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull ) Ġreturn Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Build . VERSION . SDK _ INT Ġ>= ĠBuild . VERSION _ CODES . J EL LY _ BE AN _ MR 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") Ġval Ġindex : ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getColumnIndex ( Contacts Contract . Common Data Kinds . Phone . LAST _ TIME _ USED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcursor . getLong ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex : ĠInt Ġ= Ġcursor . getColumnIndex (" last _ time _ contact ed ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcursor . getLong ( index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ è¯»åıĸ å®¢æĪ· æķ°æį® ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġread Customer Data ( context : ĠContext , Ġcursor : ĠCursor ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull ) Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġval Ġdata 2 Index : ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getInt ( cursor . getColumnIndex ( Contacts Contract . Common Data Kinds . Phone . DATA 2 )) ĊĠĠĠĠĠĠĠ Ġif Ġ( data 2 Index Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype Label Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContact s Contract . Common Data Kinds . Phone . getType Label ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . getResources (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata 2 Index , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" C UST O ME " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( type Label Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtype Label . toString () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæŁ¥è¯¢ æīĢæľī çĶµ è¯Ŀ åı· çłģ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġquery All Contact Numbers ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġresolver : ĠContent Resolver ĊĠĠĠ Ġ): ĠHashMap < Long , ĠArrayList < Number Entity >> Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcursor : ĠCursor ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġid Numbers Map : ĠHashMap < Long , ĠArrayList < Number Entity >> Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhash Map Of () ĊĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġresolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContact s Contract . Common Data Kinds . Phone . CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor Ġ== Ġnull ) Ġreturn Ġid Numbers Map ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontact Id : ĠLong Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getLong ( cursor . getColumnIndex ( Contacts Contract . Common Data Kinds . Phone . CONTACT _ ID )); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontact Number : ĠNumber Entity ? Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread One Contact Number ( context , Ġcursor ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( contact Number Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġnumbers : ĠArrayList < Number Entity >? Ġ= Ġid Numbers Map [ contact Id ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( numbers Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnumbers Ġ= Ġarray ListOf ( contact Number ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Numbers Map [ contact Id ] Ġ= Ġnumbers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnumbers . add ( contact Number ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor ?. is Closed Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġid Numbers Map ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæŁ¥è¯¢ æīĢæľī èģĶç³» äºº è¯¦æĥħ ä¿¡æģ¯ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġquery All Contact Detail ( resolver : ĠContent Resolver ): ĠHashMap < Long , ĠContact Detail > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontact Id Detail Map : ĠHashMap < Long , ĠContact Detail > Ġ= Ġhash Map Of () ĊĠĠĠĠĠĠĠ Ġvar Ġcursor : ĠCursor ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContact s Contract . Data . CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġreturn Ġcontact Id Detail Map ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontact Id Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getLong ( cursor . getColumnIndex ( Contacts Contract . Data . CONTACT _ ID )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontact Detail : ĠContact Detail ? Ġ= Ġquery Contact Detail ( resolver , Ġcontact Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( contact Detail Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontact Id Detail Map [ contact Id ] Ġ= Ġcontact Detail ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor ?. is Closed Ġ== Ġfalse ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcontact Id Detail Map ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠæŁ¥è¯¢ èģĶç³» äºº è¯¦æĥħ ä¿¡æģ¯ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġquery Contact Detail ( resolver : ĠContent Resolver , Ġcontact Id : ĠLong ): ĠContact Detail ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcontact Detail : ĠContact Detail ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġcursor : ĠCursor Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContact s Contract . Data . CONTENT _ URI , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Contacts Contract . Data . CONTACT _ ID } Ġ= Ġ${ contact Id }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġreturn Ġcontact Detail ĊĊĠĠĠĠĠĠĠ Ġif Ġ( cursor . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") Ġval Ġcontact Times : ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getInt ( cursor . getColumnIndex ( Contacts Contract . Data . TIMES _ CONTACT ED )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstatus : ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getString ( cursor . getColumnIndex ( Contacts Contract . Data . CONTACT _ STATUS )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") Ġval Ġlast Contact : ĠLong Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . getLong ( cursor . getColumnIndex ( Contacts Contract . Data . LAST _ TIME _ CONTACT ED )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠcolumnIndex : ĠInt Ġ= Ġcursor . getColumnIndex (" nickname ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġn icky : ĠString ? Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column Index Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġn icky Ġ= Ġcursor . getString ( column Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠcolumnIndex Ġ= Ġcursor . getColumnIndex (" data 2 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrelation Ship : ĠString ? Ġ= Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( column Index Ġ> Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelation Ship Ġ= Ġcursor . getString ( column Index ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontact Detail Ġ= ĠContact Detail ( contact Times , Ġlast Contact , Ġn icky , Ġrelation Ship , Ġstatus ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠ Ġreturn Ġcontact Detail ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġæł¹æį® èĩª å®ļçļĦ {@ link ĠUri } åľ°åĿĢ ï¼Į èİ·åıĸ èģĶç³» äºº ä¿¡æģ¯ ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġquery Contact By Uri ( resolver : ĠContent Resolver , Ġuri : ĠUri ?): ĠArray < String >? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcursor : ĠCursor ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( uri Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor Ġ= Ġresolver . query ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuri , ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContact s Contract . Common Data Kinds . Phone . NUMBER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContact s Contract . Common Data Kinds . Phone . DISPLAY _ NAME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ġnull , Ġnull , Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( cursor Ġ!= Ġnull Ġ&& Ġcursor . moveTo Next ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnumber : ĠString Ġ= Ġcursor . getString ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname : ĠString Ġ= Ġcursor . getString ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠarrayOf ( name , Ġnumber ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cursor ?. is Closed Ġ== Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcursor . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} Ċ }