我正在关注这篇文章,试图了解如何保存编辑后的联系人 - 我的项目是使用 VS2022 的毛伊岛,目标是 ios 和 android,尽管我最初试图让 android 应用程序正常工作。 毛伊岛允许通过简单的方式选择联系人,即
var contact = await Microsoft.Maui.ApplicationModel.Communication.Contacts.Default.PickContactAsync();
它曾经能够使用 Maui.essentials 进行保存,但这已经消失了,人们必须深入研究 Android 代码的黑魔法。 (除非有人可以告诉我有一种简单的毛伊岛方式来保存和编辑联系人记录)
我已经蚕食了上面帖子中建议的代码,但由于不熟悉低级 Android 代码,我很难理解发生了什么 我特别想编辑姓名、地址(实际)和电子邮件。我似乎可以编辑单个字段,例如名字,但是当我使用类似的代码编辑或添加另一封电子邮件时,它似乎将内容放在名称字段中 我想我的格式不正确 - 我已经尝试阅读 Android 开发人员文档,但恐怕我仍然不明白。有好心人可以告诉我这段代码哪里出了问题吗? 我对这个概念的理解正确吗?构建器通过 builder.withselection 传递 id 和 mimetype?到目前为止一切顺利 - 我可以编辑和更改简单字段(例如给定名称),但是一个联系人可以有许多电子邮件,如何编辑静态字段(例如给定名称)并添加新电子邮件?或者如何引用特定联系人 ID 中的特定电子邮件地址?
public class SaveContact
{
public void SaveContactToPhoneBook(string id,string fname, string sname, string Email)
{
#if ANDROID
ContentProviderOperation.Builder builder =ContentProviderOperation.NewUpdate(ContactsContract.Data.ContentUri);
List<ContentProviderOperation> ops = new List<ContentProviderOperation>();
builder.WithValue(ContactsContract.CommonDataKinds.StructuredName.FamilyName,sname);
ops.Add(builder.Build());
// now try to save a new Email
String emailSelection = ContactsContract.Data.InterfaceConsts.Id + " = ? " +ContactsContract.Data.InterfaceConsts.Mimetype + " = ? ";
String[] emailSelectionArgs = {id,ContactsContract.CommonDataKinds.Email.ContentItemType};
// i am not sure how the above parameters work - they are obviously passed in builder.WithSelection() and I assume the Args are substitued for the '?'
// to construct the sqlite statement which appears to be constructed deep in the code somewher but how?
builder = ContentProviderOperation.NewUpdate(ContactsContract.Data.ContentUri);
builder.WithSelection(emailSelection, emailSelectionArgs);
builder.WithValue(ContactsContract.CommonDataKinds.Email.Address, Email);
ops.Add(builder.Build());
// Update the contact
ContentProviderResult[] res;
try
{
res = Android.App.Application.Context.ContentResolver.ApplyBatch(ContactsContract.Authority, ops);
ops.Clear();//Add this line
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine( e.Message);
}
#elif IOS
#endif
}
}
最新版本的代码不保存任何内容
List<ContentProviderOperation> ops = new List<ContentProviderOperation>();
// Name
String nameSelection = ContactsContract.Data.InterfaceConsts.RawContactId + " = ? AND "
+ ContactsContract.Data.InterfaceConsts.Mimetype + " = ? ";
String[] nameSelectionArgs = {
id,
ContactsContract.CommonDataKinds.StructuredName.ContentItemType
};
ContentProviderOperation.Builder builder = ContentProviderOperation.NewUpdate(ContactsContract.Data.ContentUri);
builder.WithSelection(nameSelection, nameSelectionArgs);
builder.WithValue(ContactsContract.CommonDataKinds.StructuredName.GivenName, fname);
builder.WithValue(ContactsContract.CommonDataKinds.StructuredName.FamilyName, sname);
ops.Add(builder.Build());
String emailSelection = ContactsContract.Data.InterfaceConsts.RawContactId + " = ? ";
String[] emailSelectionArgs = {id};
builder = ContentProviderOperation.NewUpdate(ContactsContract.Data.ContentUri);
builder.WithSelection(emailSelection, emailSelectionArgs);
builder.WithValue(ContactsContract.CommonDataKinds.Email.Address, Email);
ops.Add(builder.Build());
try
{
var result = Android.App.Application.Context.ContentResolver.ApplyBatch(ContactsContract.Authority, ops);
ops.Clear();
}
catch(Exception e) {var ee = e.Message;}
您可以参考以下代码更改电话号码:
public void ChangeContactNumber( string oldnumber,string newnumber) // requires android.permission.READ_CONTACTS
{
Context context = Android.App.Application.Context;
if (context == null) return ;
var cursor = context.ContentResolver.Query(
ContactsContract.CommonDataKinds.Phone.ContentUri,
new string[] { ContactsContract.Contacts.InterfaceConsts.Id, ContactsContract.CommonDataKinds.Phone.Number },
ContactsContract.CommonDataKinds.Phone.Number + "=?",
new string[] { oldnumber },
null
);
if (cursor == null || cursor.Count == 0) return;
cursor.MoveToFirst();
string id = cursor.GetString(cursor.GetColumnIndex(ContactsContract.Contacts.InterfaceConsts.Id));
//get the contactid here
var contentvalues = new ContentValues();
var where = ContactsContract.Contacts.InterfaceConsts.Id + "=?" + " AND " + ContactsContract.CommonDataKinds.Phone.Number + "=?";
var whereArgs = new String[] { id, oldnumber };
contentvalues.Put(ContactsContract.CommonDataKinds.Phone.Number, newnumber);
Android.Net.Uri uri = Android.Net.Uri.Parse("content://com.android.contacts/data");
context.ContentResolver.Update(uri, contentvalues, where, whereArgs);
}
另外,当你获得contactid后,你可以通过方法更改姓名、电子邮件等信息
ContentResolver.Update
请参考以下代码:
// Name
String nameSelection = ContactsContract.Data.InterfaceConsts.RawContactId + " = ? AND "
+ ContactsContract.Data.InterfaceConsts.Mimetype + " = ? ";
String[] nameSelectionArgs = {
_Contact.DataId.ToString(),
ContactsContract.CommonDataKinds.StructuredName.ContentItemType
};
ContentProviderOperation.Builder builder = ContentProviderOperation.NewUpdate(ContactsContract.Data.ContentUri);
builder.WithSelection(nameSelection, nameSelectionArgs);
builder.WithValue(ContactsContract.CommonDataKinds.StructuredName.GivenName, _Contact.FirstName);
builder.WithValue(ContactsContract.CommonDataKinds.StructuredName.FamilyName, _Contact.LastName);
ops.Add(builder.Build());
// Phone
String phoneSelection = ContactsContract.Data.InterfaceConsts.RawContactId + " = ? AND "
+ ContactsContract.Data.InterfaceConsts.Mimetype + " = ? ";
String[] phoneelectionArgs = {
_Contact.DataId.ToString(),
ContactsContract.CommonDataKinds.Phone.ContentItemType
};
builder = ContentProviderOperation.NewUpdate(ContactsContract.Data.ContentUri);
builder.WithSelection(phoneSelection, phoneelectionArgs);
builder.WithValue(ContactsContract.CommonDataKinds.Phone.Number, _Contact.Phone);
ops.Add(builder.Build());
// Email
String emailSelection = ContactsContract.Data.InterfaceConsts.RawContactId + " = ? AND "
+ ContactsContract.Data.InterfaceConsts.Mimetype + " = ? ";
String[] emailSelectionArgs = {
_Contact.DataId.ToString(),
ContactsContract.CommonDataKinds.Email.ContentItemType
};
builder = ContentProviderOperation.NewUpdate(ContactsContract.Data.ContentUri);
builder.WithSelection(emailSelection, emailSelectionArgs);
builder.WithValue(ContactsContract.CommonDataKinds.Email.InterfaceConsts.Data, _Contact.Email);
ops.Add(builder.Build());
// Update the contact
ContentProviderResult[] result;
try
{
result = ContentResolver.ApplyBatch(ContactsContract.Authority, ops);
}
catch { }