'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 |
|---|
