【问题标题】:Update Xamarin.Android Contacts with ContentProvider使用 ContentProvider 更新 Xamarin.Android 联系人
【发布时间】: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


    【解决方案1】:

    这个问题似乎源于 Visual Studio 上的 Android 模拟器——在物理设备上运行它完美无缺。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多