【发布时间】:2023-01-25 15:41:39
【问题描述】:
我正在 Xamarin.Forms 中开发一个应用程序,它允许用户保存联系人,如果联系人已经存在,它会得到更新。 Xamarin.iOS 端已在运行。
到目前为止,保存联系人效果很好。为了更新联系人,我删除了所有的电话号码,然后再一一添加。删除所有电话号码已经有效,我只是无法再次添加它们。
我已经尝试使用 RawContactID 而不仅仅是 ContactID,并使用 ContentProvider 的“NewUpdate”函数而不是“NewInsert”。结果总是一样的,没有异常,代码运行顺利。它只是不添加任何东西。
这是我的代码中返回联系人 ID 的部分,我想更新它:
public string GetPhoneContactID(Contact contact)
{
string id = "0";
var uri = ContactsContract.Contacts.ContentUri;
var cursor = Android.App.Application.Context.ContentResolver.Query(uri, new string[] { ContactsContract.Contacts.InterfaceConsts.Id },
ContactsContract.Contacts.InterfaceConsts.DisplayName +
"='" + GetDisplayName(contact.FirstName, contact.LastName) + "'", null, null);
if (cursor.MoveToNext())
{
id = cursor.GetString(cursor.GetColumnIndex(ContactsContract.Contacts.InterfaceConsts.Id));
}
cursor.Close();
return id;
}
更新联系人的代码:
public bool UpdateExistingContact(Contact contact)
{
var id = GetPhoneContactID(contact);
string selection = ContactsContract.Data.InterfaceConsts.ContactId + "=? AND " + ContactsContract.Data.InterfaceConsts.Mimetype + "=?";
String[] selectionArgs = new string[] { id, ContactsContract.CommonDataKinds.Phone.ContentItemType };
// DELETE ALL PHONE NUMBERS FROM CONTACT
Android.App.Application.Context.ContentResolver.Delete(ContactsContract.Data.ContentUri, selection, selectionArgs);
List<ContentProviderOperation> ops = new List<ContentProviderOperation>();
var counterPhoneNumbers = 0;
if (contact.PhoneNumbers != null)
{
// ADD NEW PHONENUMBERS TO CONTACT
while (counterPhoneNumbers < contact.PhoneNumbers.Count)
{
var builder = ContentProviderOperation.NewInsert(ContactsContract.Data.ContentUri);
builder.WithValue(ContactsContract.Data.InterfaceConsts.RawContactId, id);
builder.WithValue(ContactsContract.Data.InterfaceConsts.Mimetype,
ContactsContract.CommonDataKinds.Phone.ContentItemType);
builder.WithValue(ContactsContract.CommonDataKinds.Phone.Number, contact.PhoneNumbers[counterPhoneNumbers].Value); builder.WithValue(ContactsContract.CommonDataKinds.Phone.InterfaceConsts.Data2, (int)PhoneDataKind.Work);
ops.Add(builder.Build());
counterPhoneNumbers++;
}
}
ContentProviderResult[] result;
try
{
result = Android.App.Application.Context.ContentResolver.ApplyBatch(ContactsContract.Authority, ops);
if (result.Length > 0)
{
ops.Clear();
return true;
}
}
catch (System.Exception ex)
{
_logger.Error(ex);
return false;
}
}
return false;
}
【问题讨论】:
标签: c# android xamarin.forms xamarin.android contacts