无法使用 Xamarin.Android 中的 Xamarin.Mobile 组件保存联系人

Posted

技术标签:

【中文标题】无法使用 Xamarin.Android 中的 Xamarin.Mobile 组件保存联系人【英文标题】:Unable to Save Contact using Xamarin.Mobile Component in Xamarin.Android 【发布时间】:2015-06-16 05:28:20 【问题描述】:

我在 Xamarin.android 项目中使用这个 Xamarin.Mobile component。经过大量谷歌搜索并浏览他们的样本后,我发现只有从手机中检索联系人到我的应用程序的方法。

下面是我的代码:

        AddressBook book = new AddressBook(context)
            
                    PreferContactAggregation = true
            ;



        Phone ph = new Phone()
        Type = PhoneType.Mobile,
        Number = "9952429044"
        ;

       Contact ct = new Contact()
        
            DisplayName = "Sai Ram",
            FirstName = "Om",
            MiddleName = "Sai",
            LastName = "Ram",
            Phones = new List<Phone>()ph
        ;

我需要将联系人对象保存到手机的通讯录中。我在Xamarin.Contacts 中找不到像book.Save(contact) 这样的方法。

【问题讨论】:

【参考方案1】:

Xamarin.Mobile 的 API 仅用于读取联系人,而不用于添加。

编辑

以下是如何将带有手机号码的新联系人添加到您的联系人的简短示例。

List<ContentProviderOperation> ops = new List<ContentProviderOperation>();
int rawContactInsertIndex = ops.Count;

ops.Add(ContentProviderOperation.NewInsert(Android.Provider.ContactsContract.RawContacts.ContentUri)
    .WithValue(Android.Provider.ContactsContract.RawContacts.InterfaceConsts.AccountType, null)
    .WithValue(Android.Provider.ContactsContract.RawContacts.InterfaceConsts.AccountName, null).Build());
ops.Add(ContentProviderOperation
    .NewInsert(Android.Provider.ContactsContract.Data.ContentUri)
    .WithValueBackReference(Android.Provider.ContactsContract.Data.InterfaceConsts.RawContactId,rawContactInsertIndex)
    .WithValue(Android.Provider.ContactsContract.Data.InterfaceConsts.Mimetype, Android.Provider.ContactsContract.CommonDataKinds.StructuredName.ContentItemType)
    .WithValue(Android.Provider.ContactsContract.CommonDataKinds.StructuredName.DisplayName, "Vikas Patidar") // Name of the person
    .Build());
ops.Add(ContentProviderOperation
    .NewInsert(Android.Provider.ContactsContract.Data.ContentUri)
    .WithValueBackReference(
        ContactsContract.Data.InterfaceConsts.RawContactId, rawContactInsertIndex)
    .WithValue(Android.Provider.ContactsContract.Data.InterfaceConsts.Mimetype, Android.Provider.ContactsContract.CommonDataKinds.Phone.ContentItemType)
    .WithValue(Android.Provider.ContactsContract.CommonDataKinds.Phone.Number, "9999999999") // Number of the person
    .WithValue(Android.Provider.ContactsContract.CommonDataKinds.Phone.InterfaceConsts.Type, "mobile").Build()); // Type of mobile number  

// Asking the Contact provider to create a new contact                 
try 
    ContentResolver.ApplyBatch(ContactsContract.Authority, ops);
 catch (Exception ex) 
    Toast.MakeText(this, "Exception: " + ex.Message, ToastLength.Long).Show();

您可以找到有关如何保存其他字段here 的更多详细信息。 不要忘记为您的应用添加 WRITE_CONTACTS 权限。

【讨论】:

那么,如何从我的应用中添加联系人?我已经尝试过添加联系人的本地方式。但是,它无法保存显示名称,它只保存了联系电话。 更新了我的答案,添加了示例。 我遇到了编译问题,在尝试“Android.App.Application.Context.ContentResolver.ApplyBatch(ContactsContract.Authority, ops);”后不得不更改行 @stepheaw 它应该是[Context].ContentResolver.ApplyBatch(ContactsContract.Authority, ops);,其中[Context] 是您的活动上下文(即this 用于活动或应用程序上下文)。因此,如果您从您的活动中运行此代码,它将按原样运行。 @Artur Shamsutdinov 现在更有意义了,谢谢。您有更新联系人的示例吗?

以上是关于无法使用 Xamarin.Android 中的 Xamarin.Mobile 组件保存联系人的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin - Android - Visual Studio - 应用程序无法启动

无法使用 C# 从 Xamarin.iOs 和 Xamarin.Android 连接到 MySql

Xamarin Android 中的响应式布局

Xamarin - 无法通过 Android(和 iOS)访问本地 api

“重新启动接收器”无法正常工作 android [Xamarin.Android]

在Xamarin Android项目中的android Assets中添加文件夹会引发Build Error