'How to implement a contentobserver specifically for contacts

I am looking a way to handle this case when I would expect some service gets a notificaction when the contact database changed... but I dont find an example how to implement this class(for example a handler in this case would be some Action?) and how do I find the Uri for the contacts' db ?

 public class ContactContentObserver : ContentObserver
    {
      public Android.Content.Context _Context { get; set; }
        public Android.Net.Uri GetCurrentContactData(Android.Net.Uri uri) =>
           Android.Net.Uri.WithAppendedPath(uri, "data");
        public ContactContentObserver(Handler handler) : base(handler)
        {
        }

        public ContactContentObserver(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer)
        {
        }
        public override void OnChange(bool selfChange, Android.Net.Uri uri)
        {

            if(uri.Path.Contains(ContactsContract.AuthorityUri.Path))
            {
                // Android.Database
                // Android.App.Application.Context.
                string[] queryColumns =
                {
                    IPhoneLookupColumns.ContactId,
                    IPhoneLookupColumns.DataId,
                    IPhoneLookupColumns.Number,
                    CommonDataKinds.StructuredName.DisplayName,
                    CommonDataKinds.StructuredName.InterfaceConsts.ContactLastUpdatedTimestamp 
                };
                Dictionary<string, string> values = new Dictionary<string, string>();
                Android.Net.Uri newUri = GetCurrentContactData(uri);
                ICursor? cursor  =_Context.ContentResolver.Query(newUri,queryColumns,null,null,null);
                int cols = cursor.GetColumnNames().Length;
                Dictionary<string, ContactQueryResult> contactQueryResult = new Dictionary<string, ContactQueryResult>();
                for (int row=0;row<cursor.Count;row++)
                {
                    for(int col=0;col<cols;col++)
                    {
                        string val =  cursor.GetString(col);
                        values.Add(cursor.GetColumnName(col), val);
                    }
                    
                    int.TryParse(values[IPhoneLookupColumns.ContactId],  out int contactId);
                    int.TryParse(values[IPhoneLookupColumns.DataId], out int dataId);
                    DateTime dateModified = DateTime.MinValue;
                    bool parsed =DateTime.TryParse(values[CommonDataKinds.StructuredName.InterfaceConsts.ContactLastUpdatedTimestamp], out dateModified);
                    if (values[IPhoneLookupColumns.Number] is not null or "")
                    {
                        string phone = values[IPhoneLookupColumns.Number];
                        var val = new ContactQueryResult
                        {
                            ContactId = contactId,
                            ContactLastUpdatedTimestamp = parsed ? dateModified : null,
                            DataId = dataId,
                            DisplayName = values[CommonDataKinds.StructuredName.DisplayName],
                            PhoneNumber = phone
                        };
                        contactQueryResult.Add(phone, val);
                    }

                    values.Clear();
                }
   
            }
            base.OnChange(selfChange, uri);
        }
    }```


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source